当前位置: 首页 > news >正文

Android Activity栈关系解析

在 Android 系统中,这些类共同构成了 Activity 任务栈管理的核心架构。它们的关系可以类比为一栋大楼的管理体系,每个类负责不同层级的任务。以下是它们的详细解释和实际场景示例:

1. ActivityRecord(活动记录)

  • 是什么:代表一个 Activity 实例,存储 Activity 的元数据(如 Intent、启动模式、组件信息等)。

  • 职责

    • 跟踪 Activity 的生命周期状态(如 RESUMEDPAUSED)。
    • 管理 Activity 的窗口(如界面层级、焦点状态)。
  • 示例

     // 当启动 MainActivity 时,系统会创建一个 ActivityRecordIntent intent = new Intent(context, MainActivity.class);startActivity(intent);
    

2. TaskRecord(任务记录)

  • 是什么:代表一个 任务栈,用户视角中的一个“任务”(例如用户从桌面启动一个应用形成的任务)。

  • 职责

    • 维护一组按顺序排列的 ActivityRecord(后进先出,LIFO)。
    • 处理任务栈的导航逻辑(如返回键回退)。
  • 关键属性

    • taskAffinity:任务栈的“归属标识”,决定 Activity 应归属到哪个任务。
    • rootActivity:任务栈的根 Activity(第一个启动的 Activity)。
  • 示例

    • 用户从桌面点击微信图标,启动 MainActivity,生成一个 TaskRecord
    • MainActivity 跳转到 ChatActivity,后者被压入同一任务栈。

3. ActivityStack(活动栈)

  • 是什么:管理 一组相关的 TaskRecord,通常对应一个逻辑显示区域(如主屏幕、分屏窗口)。

  • 职责

    • 控制 TaskRecord 的可见性和生命周期(如暂停后台栈中的 Activity)。
    • 处理栈的焦点状态(如前台栈、后台栈)。
  • 类型

    • 应用栈(Application Stack) :普通应用的任务栈。
    • Home 栈:桌面和最近任务列表的栈。
    • 特殊场景栈:如锁屏栈、语音交互栈。
  • 示例

    • 分屏模式下,左侧窗口对应一个 ActivityStack,右侧窗口对应另一个 ActivityStack

4. ActivityDisplay(活动显示器)

  • 是什么:管理 物理或虚拟显示设备(如手机主屏、外接显示器、分屏窗口)。

  • 职责

    • 协调一个屏幕上的所有 ActivityStack
    • 处理多屏交互(如窗口拖拽到另一个屏幕)。
  • 示例

    • 手机连接外接显示器时,系统创建两个 ActivityDisplay,分别管理手机和显示器的任务栈。

5. ActivityStackSupervisor(活动栈监督者)

  • 是什么:全局协调者,管理所有 ActivityDisplayActivityStack

  • 职责

    • 处理 Activity 的启动、切换、销毁等核心逻辑。
    • 维护当前焦点栈(mFocusedStack)。
    • 处理跨栈操作(如分屏模式下调整栈的层级)。
  • 关键行为

    • 根据启动模式(如 singleTask)和 Intent Flags(如 FLAG_ACTIVITY_NEW_TASK)决定 Activity 的归属栈。
    • 处理返回键逻辑(回退栈顶 Activity)。

层级关系总结

ActivityStackSupervisor
ActivityDisplay
ActivityStack
TaskRecord
ActivityRecord

实际协作流程示例

场景:用户在分屏模式下,左侧窗口运行微信,右侧窗口运行浏览器。

  1. ActivityStackSupervisor 创建两个 ActivityDisplay(逻辑分屏视为两个虚拟屏幕)。

  2. 左侧 ActivityDisplay 创建一个 ActivityStack,管理微信的 TaskRecord(包含 MainActivityChatActivity)。

  3. 右侧 ActivityDisplay 创建另一个 ActivityStack,管理浏览器的 TaskRecord(包含 HomePageArticlePage)。

  4. 用户点击微信的返回键:

    • ActivityStackSupervisor 找到左侧 ActivityStack 的栈顶 ActivityRecordChatActivity)。
    • 销毁 ChatActivity,回退到 MainActivity
  5. 用户拖拽浏览器窗口到左侧屏幕:

    • ActivityStackSupervisor 将浏览器的 TaskRecord 迁移到左侧 ActivityDisplayActivityStack

对开发者的意义

  1. 调试工具

    • 通过 adb shell dumpsys activity 查看完整的栈信息:

       adb shell dumpsys activity activities
      
    • 输出示例:

       Display #0 (手机主屏):Stack #0: type=standard, bounds=[0,0][1080,1920]Task #100: affinity=com.wechat, size=2ActivityRecord{MainActivity}ActivityRecord{ChatActivity}
      
  2. 启动模式与任务栈

    • 使用 launchMode="singleTask" 时,系统会查找匹配的 TaskRecord,若存在则复用,否则新建。
    • FLAG_ACTIVITY_NEW_TASK 强制在新的 TaskRecord 中启动 Activity。
  3. 多窗口适配

    • 在分屏/自由窗口模式下,需处理 Configuration 变化(如屏幕尺寸、方向)。

总结

ActivityRecord 是砖块,TaskRecord 是房间,ActivityStack 是楼层,ActivityDisplay 是整栋楼,ActivityStackSupervisor 是物业总公司。

相关文章:

Android Activity栈关系解析

在 Android 系统中,这些类共同构成了 Activity 任务栈管理的核心架构。它们的关系可以类比为一栋大楼的管理体系,每个类负责不同层级的任务。以下是它们的详细解释和实际场景示例: 1. ActivityRecord(活动记录) 是什么…...

java使用word模板填充内容,再生成pdf

1.word模板填充内容 使用EasyPoi写入Word文档。 import cn.afterturn.easypoi.word.WordExportUtil; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument;import java.io.File; import java…...

回归实战详细代码+解析:预测新冠感染人数

回归实战:预测新冠感染人数 先回顾下回归是个啥玩意 首先需要一组训练集,说人话就是通过一系列x[x1,x2…xn]通过神秘计算得到y的过程,当然人和机器现在都不知道什么计算是什么,这是一个黑箱。 黑箱比喻:把模型想象成自…...

AI人工智能机器学习之聚类分析

1、概要 本篇学习AI人工智能机器学习之聚类分析,以KMeans、AgglomerativeClustering、DBSCAN为例,从代码层面讲述机器学习中的聚类分析。 2、聚类分析 - 简介 聚类分析是一种无监督学习的方法,用于将数据集中的样本划分为不同的组&#xff…...

(下:补充——五个模型的理论基础)深度学习——图像分类篇章

目录 1.1 卷积神经网络基础 3.1 AlexNet网络结构详解与花分类数据集下载 4.1 VGG网络详解及感受野的计算 5.1 GoogLeNet网络详解 6.1 ResNet网络结构,BN以及迁移学习详解 总结(可以直接看总结) 1.1 卷积神经网络基础 视频讲解&#xf…...

使用Python自动生成图文并茂的网页分析报告

在数据分析中,不管是市场研究还是科学分析,经常需要使用Python进行数据分析并生成图表报告。一般使用Python生成和展示图表时都是使用matplotlib 库生成静态图片文件,这种方式不便之处是不方便跟动态文字段落结合在一起,也不方便分…...

uniapp-原生android插件开发摘要

uni-app在App侧的原生扩展插件,支持使用java、object-c等原生语言编写,从HBuilderX 3.6起,新增支持了使用uts来开发原生插件。 基础项目 UniPlugin-Hello-AS工程请在App离线SDK中查找 基础项目(App离线SDK)已经配置好了自定义插件所需要的…...

GIT工具学习【1】:基本操作

目录 0.本地代码分区1.配置自己的个人信息(设置一次即可)2.新建仓库3.提交代码到暂存区(加入购物车)4.从暂存区撤回(不会改变工作区文件)5.恢复指定版本(会改变工作区文件)5.1&#…...

《国密算法开发实战:从合规落地到性能优化》

前言 随着信息技术的飞速发展,信息安全已成为全球关注的焦点。在数字化时代,数据的保密性、完整性和可用性直接关系到国家、企业和个人的利益。为了保障信息安全,密码技术作为核心支撑,发挥着至关重要的作用。国密算法,即国家密码算法,是我国自主设计和推广的一系列密码…...

【语法】C++中string类中的两个问题及解答

贴主在学习string类时遇到过两个困扰我的问题,今天拿出来给大家分享一下我是如何解决的 一、扩容时capacity的增长问题 在string的capacity()接口中,调用的是这个string对象的容量(可以存多少个有效字符),而size()是调用的string对象现在有…...

LeetCode-154. 寻找旋转排序数组中的最小值 II

1、题目描述: 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,…...

2.数据结构:1.Tire 字符串统计

1.Tire 字符串统计 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010; int son[N][26];//至多 N 层&#xff0c;每一层至多 26 个节点&#xff08;字母&#xff09; int cnt[N];//字符串至多 N 个&#xff…...

C语言复习4:有关数组的基础常见算法

# 数组的常见算法 - 查找算法 1. 基本查找/顺序查找 2. 二分查找/折半查找 3. 插值查找 4. 分块查找 5. 哈希查找 6. 树表查找 7. 斐波那契查找 - 排序算法&#xff08;顾名思义&#xff0c;就是把没有顺序的…...

Ubuntu从零创建Hadoop集群

目录 前言 前提准备 1.设置网关和网段 2.查看虚拟机IP及检查网络 3.Ubuntu相关配置 镜像源配置 下载 vim编辑器 4.设置静态IP和SSH免密(可选) 设置静态IP SSH免密 5.JDK环境部署 6.Hadoop环境部署 7.配置 Hadoop 配置文件 HDFS集群规划 HDFS集群配置 1.配…...

GPIO概念

GPIO通用输入输出口 在芯片内部存在多个GPIO&#xff0c;每个GPIO用于管理多个芯片进行输入&#xff0c;输出工作 引脚电平 0v ~3.3v&#xff0c;部分引脚可容任5v 输出模式下可控制端口输出高低电平&#xff0c;可以驱动LED&#xff0c;控制蜂鸣器&#xff0c;模拟通信协议&a…...

Node.js, Bun, Deno 比较概述

以下是 Node.js、Bun 和 Deno 的对比分析 概览 对比维度Node.jsDenoBun首次发布200920202022创始人Ryan DahlRyan Dahl&#xff08;Node.js 原作者&#xff09;Jarred Sumner运行时引擎V8&#xff08;Chrome&#xff09;V8&#xff08;Chrome&#xff09;JavaScriptCore&#…...

C# 类库打包dll文件

目录 前言操作流程注意事项 前言 在C#中&#xff0c;有多种方式可以对代码进行加密&#xff0c;以保护源代码不被轻易查看或修改&#xff0c;这篇文章主要介绍将C# cs类文件加密为dll文件的方式进行保护。 操作流程 在 Visual Studio 中&#xff0c;选择“创建新项目”。 选…...

Linux中的UDP编程接口基本使用

UDP编程接口基本使用 本篇介绍 在前面网络基础部分已经介绍了网络的基本工作模式&#xff0c;有了这些理论基础之后&#xff0c;下面先从UDP编程开始从操作部分深入网络 在本篇中&#xff0c;主要考虑下面的内容&#xff1a; 创建并封装服务端&#xff1a;了解创建服务端的…...

RAG项目实战:金融问答系统

需求痛点 私有知识很多&#xff0c;如何让大模型只选择跟问题有关的知识进行参考呢&#xff1f; 需求分析 是否可以使用关键词匹配呢&#xff1f;以前的搜索主要使用关键词匹配&#xff0c;这个要求太高了&#xff0c;需要提前抽取准备好关键词&#xff0c;有点像以前SEO的工…...

大白话React第十一章React 相关的高级特性以及在实际项目中的应用优化

假设我们已经对 React 前端框架的性能和可扩展性评估有了一定了解&#xff0c;接下来的阶段可以深入学习 React 相关的高级特性以及在实际项目中的应用优化&#xff0c;以下是详细介绍及代码示例&#xff1a; 1. React 高级特性的深入学习 1.1 React 并发模式&#xff08;Con…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...