ActivityDisplay activityContainer

本文详细介绍了Android系统中Activity管理的核心组件ActivityDisplay和activityContainer的工作原理。解释了它们如何通过维护ActivityStack来管理不同的Activity,并阐述了这些组件之间的关联及它们在不同设备上的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


ActivityDisplay:一个DisplayId对应一个ActivityDisplay,主要维护这个display的相关信息,有一个ArrayList<ActivityStack> mStacks,代表该displayId上的所有activitystack。

activityContainer:虽然起的名字叫activity container但其实是维护一个ActivityStackmStack,因为activities都会在mStack里,所以叫container也ok吧。

每个activityContainer都会和ActivityDisplay关联,把ActivityDisplay里的displayid这那的给activityContainer维护的mStack,把activityContainermStacks也给mStack,然后activityContainer里的mStacks会addmStack

安卓有很多这种写法的,在类A里定义一个类B,在类B里定义一个类A,然后互相赋值,就可以互相访问相关东西。

mStack里的mStacks应该代表的是该mStack所属的mStacks,而该mStacks又代表了该displayid上的所有stack,所以其实表示的是该mStack所属哪个设备(display)



                
<think>我们正在讨论Android12中的RecentTasks机制,特别是ActivityStack类的使用或替代方案。根据用户的问题,他们想了解在Android12中ActivityStack类的替代方案或实现机制。从引用[2]和引用[3]中,我们可以看到在早期Android版本中,ActivityStack是管理Activity状态和任务栈的核心类。然而,在Android10及以后的版本中,Google对Activity管理进行了重构,引入了新的类来替代ActivityStack。在Android10中,ActivityStack被拆分为两个新的类:1.ActivityStack:这个类仍然存在,但职责被缩小,主要负责单个栈的管理。2.ActivityDisplay:用于管理多个ActivityStack(例如分屏模式下的多个栈)。3.更重要的是,引入了ActivityTaskManagerService(ATMS)来接管ActivityManagerService(AMS)的部分职责,特别是与任务和栈管理相关的部分。在Android12中,这个重构已经完成,ActivityStack类已经被完全移除,其功能由以下新的类承担:-Task:表示一个任务,包含多个ActivityRecord(即Activity记录)。-ActivityDisplay:管理一组相关的Task,例如一个屏幕或一个虚拟显示器。-RootWindowContainer:作为窗口容器的根节点,管理所有的ActivityDisplay。-ActivityTaskManagerService(ATMS):负责协调所有的Activity和任务相关的操作。因此,在Android12中,ActivityStack类已经被新的Task和窗口容器层次结构所替代。具体来说:-任务栈现在由Task类表示,每个Task包含一个或多个ActivityRecord。-任务栈的管理(如添加、移除、移动等)由ATMS和RootWindowContainer等类共同完成。例如,在启动Activity时(如引用[2]和引用[3]所述),调用流程会涉及到这些新类:1.ActivityStarter.startActivityUnchecked()会创建一个新的Task(如果需要)或者重用现有的Task。2.然后,它会调用RootWindowContainer中的方法来将Task添加到合适的ActivityDisplay中。3.接着,通过ActivityStartController来调度Activity的启动,最终通过ActivityThread来执行Activity的生命周期。所以,用户提到的ActivityStack类在Android12中已被Task等类替代。下面,我将详细说明Android12中的任务管理机制,特别是与RecentTasks相关的部分(因为用户之前的问题是关于RecentTasks的,所以需要关联起来)。在Android12中,RecentTasks(最近任务)的获取和管理也发生了变化:-最近任务列表由RecentTasks类(在frameworks/base/services/core/java/com/android/server/wm/RecentTasks.java)管理。-它维护了一个最近使用的任务列表(按时间排序)。-当用户请求最近任务列表时(例如通过RecentTasksLoader),系统会从RecentTasks类中获取。关于RecentTasks的加载,我们可以这样理解:1.系统服务(ActivityTaskManagerService)内部通过RecentTasks类来记录和更新最近任务。2.当需要获取最近任务列表时,通过ActivityTaskManagerService的getRecentTasks()方法,该方法会调用RecentTasks.getRecentTasks()。因此,在Android12中,ActivityStack已经被新的窗口容器模型和Task类替代,而最近任务的管理由RecentTasks类负责。下面,我将用结构化的方式回答用户的问题。</think>### Android 12 中 ActivityStack 的替代方案与实现机制 在 Android 12 中,`ActivityStack` 类已被重构为更精细化的窗口容器层次结构,其核心功能由以下新组件实现: #### 替代方案与核心类 1. **`Task` 类**(直接替代 ActivityStack) - 表示单个任务栈(一组关联 Activity 的容器) - 关键属性: ```java final int taskId; // 任务唯一ID Intent baseIntent; // 根Activity的Intent List<ActivityRecord> mActivities; // 包含的Activity记录 ``` - 管理任务内 Activity 的生命周期顺序[^2] 2. **`RootWindowContainer` 类** - 作为窗口层级的根容器,替代原 ActivityStack 的全局管理职责 - 管理所有显示设备(DisplayContent)和任务栈(Task) 3. **`DisplayContent` 类** - 管理单个物理/虚拟显示设备上的窗口容器层级 - 包含多个 `Task` 实例(多任务场景) 4. **`ActivityTaskManagerService` (ATMS)** - 全局任务管理中枢,通过 `RootWindowContainer` 协调任务操作 - 处理任务创建/切换等核心逻辑: ```java // 启动Activity时创建任务栈 Task createTask(Intent intent, ActivityInfo info) { Task task = new Task(...); mRootWindowContainer.addTask(task); // 添加到根容器 return task; } ``` #### 实现机制变化 1. **层级化容器模型** ```mermaid graph TD A[RootWindowContainer] --> B[DisplayContent 1] A --> C[DisplayContent 2] B --> D[Task A] B --> E[Task B] D --> F[ActivityRecord X] D --> G[ActivityRecord Y] ``` 采用树形结构替代原平面栈管理[^1] 2. **任务启动流程**(结合引用[2][3]): ```mermaid sequenceDiagram ActivityStarter->>ATMS: startActivityUnchecked() ATMS->>RootWindowContainer: find/allocateTask() RootWindowContainer->>DisplayContent: selectDisplay() DisplayContent->>Task: reuseOrCreateTask() Task->>ActivityThread: scheduleLaunchActivity() ActivityThread->>Activity: performLaunchActivity()/onCreate() ``` 3. **多窗口支持优化**: - 每个分屏窗口对应独立的 `Task` 实例 - `DisplayContent` 维护多个并行的任务栈 - 通过 `TaskOrganizerController` 协调跨任务交互 #### 关键改进点 1. **模块解耦**:将原 `ActivityStack` 的职责拆分为 `Task`(任务管理)、`DisplayContent`(显示管理)、`RootWindowContainer`(全局协调) 2. **多显示原生支持**:通过 `DisplayContent` 实现无缝的多屏任务迁移 3. **窗口化增强**:自由形态窗口(Freeform)直接映射为独立 `Task` 实例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值