一、核心类职责解析
1. ActivityRecord(活动记录)
- 职责:记录单个 Activity 的元数据(如 Intent、启动模式、组件信息)和生命周期状态(如 RESUMED、PAUSED),并管理其窗口层级与焦点。
-
示例:启动
MainActivity
时,系统创建ActivityRecord
存储其启动参数与状态。
2. TaskRecord(任务记录)
-
职责:以栈(LIFO)形式管理一组
ActivityRecord
,处理返回键逻辑(如回退栈顶 Activity)。 -
关键属性:
-
taskAffinity
:决定 Activity 归属的任务栈。 -
rootActivity
:任务栈的根 Activity(首个启动的 Activity)。
-
-
示例:从微信主界面跳转到聊天窗口,
ChatActivity
被压入同一TaskRecord
。
3. ActivityStack(活动栈)
-
职责:管理一组
TaskRecord
,控制其可见性(如暂停后台栈)和焦点状态(前台/后台切换)。 -
类型:
- 应用栈:普通应用的任务栈。
- Home 栈:桌面与最近任务列表的栈。
- 分屏栈:多窗口模式下的独立栈。
-
示例:分屏模式下,左右两侧分别对应独立的
ActivityStack
。
4. ActivityDisplay(活动显示器)
-
职责:协调物理/虚拟显示设备(如手机主屏、外接显示器)上的所有
ActivityStack
,处理多屏交互(如窗口拖拽)。 -
示例:连接外接显示器时,系统创建两个
ActivityDisplay
分别管理主屏与外接屏的任务栈。
5. ActivityStackSupervisor(活动栈监督者)
-
职责:全局协调所有
ActivityDisplay
和ActivityStack
,处理 Activity 启动、切换、销毁等核心逻辑,并维护当前焦点栈。 -
关键行为:
- 根据启动模式(如
singleTask
)和 Intent 标志(如FLAG_ACTIVITY_NEW_TASK
)决定 Activity 归属栈。 - 处理跨栈操作(如分屏调整任务层级)。
- 根据启动模式(如
二、层级关系与协作流程
graph TD
A[ActivityStackSupervisor] --> B[ActivityDisplay]
B --> C[ActivityStack]
C --> D[TaskRecord]
D --> E[ActivityRecord]
-
实际场景:
- 分屏模式下,
ActivityStackSupervisor
创建两个ActivityDisplay
(主屏与外接屏)。 - 每个
ActivityDisplay
管理独立的ActivityStack
,例如左侧运行微信,右侧运行浏览器。 - 用户点击微信返回键时,
ActivityStackSupervisor
找到左侧栈顶的ChatActivity
并销毁,回退到MainActivity
。 - 拖拽浏览器窗口到左侧屏幕时,
ActivityStackSupervisor
将浏览器任务迁移至左侧ActivityStack
。
- 分屏模式下,
三、对开发者的实践意义
-
调试工具
-
使用
adb shell dumpsys activity activities
查看任务栈信息,例如:Display #0 (手机主屏): Stack #0: type=standard, bounds=[0,0][1080,1920] Task #100: affinity=com.wechat, size=2 ActivityRecord{MainActivity} ActivityRecord{ChatActivity}
-
-
启动模式与任务栈
-
singleTask
模式会复用或创建新任务栈,FLAG_ACTIVITY_NEW_TASK
强制启动新任务。
-
-
多窗口适配
- 分屏模式下需处理
Configuration
变化(如屏幕尺寸),确保界面布局合理。
- 分屏模式下需处理
四、总结
Android 的 Activity 任务栈管理通过 ActivityRecord(砖块)、TaskRecord(房间)、ActivityStack(楼层)、ActivityDisplay(整栋楼) 和 ActivityStackSupervisor(物业总公司) 构建起完整的体系。开发者需理解其协作逻辑,合理使用启动模式与调试工具,以优化多任务体验。