ActivityRecord 与 Task:决策如何变成对象
ActivityRecord 与 Task:决策如何变成对象
ActivityStarter 做完选择后,系统需要把“启动哪个组件、放进哪个任务、当前处于什么状态” 保存下来。ActivityRecord 是 system_server 中的一次 Activity 记录,Task 是组织这些记录 的容器;二者都不是应用进程里的 Activity 实例。
服务端记录不等于应用对象
| 常见误解 | 正确理解 |
|---|---|
| ActivityRecord 就是应用里的 Activity 对象 | 它是 system_server 里的服务端记录,应用侧对应的是 ActivityThread 创建的 Activity |
| 状态机只有 created/resumed/paused | 服务端有完整的 State 枚举:INITIALIZING、STARTED、RESUMED、PAUSING、PAUSED、STOPPING、STOPPED、FINISHING、DESTROYING、DESTROYED 等 |
ActivityRecord 是“系统眼中的 Activity”,不是“应用内存里的 Activity 实例”。它记录 Intent、进程、窗口和状态,生命周期由状态机推进。
对象落地
逐步解释:
- ① 创建记录:
new ActivityRecord.Builder(mService)...build()(ActivityStarter.java:1325)。 - ② 任务归属:无复用任务时
setNewTask()(2912 行),否则addOrReparentStartingActivity()(2942 行)。 - ③ 入树:
newParent.addChild(mStartActivity, POSITION_TOP)(2982 行),ActivityRecord 成为 Task 子节点。 - ④ 状态推进:服务端 State 枚举随之变化,直到 RESUMED 才下发客户端事务。
ActivityRecord 是什么
ActivityRecord 继承 WindowToken(ActivityRecord.java:417),所以它既是 Activity 的服务端记录,也是窗口容器树的一环;窗口侧可继续阅读窗口层级。
状态机定义(ActivityRecord.java:606-616):
INITIALIZING → STARTED → RESUMED
↓
PAUSING → PAUSED → STOPPING → STOPPED
↓
FINISHING → DESTROYING → DESTROYEDsetState(State, String)(ActivityRecord.java:5929)是唯一的状态写入点,切换时会通知相关模块。
Task 是什么
Task 继承 TaskFragment(Task.java:222),是 ActivityRecord 的父容器。恢复栈顶由 Task.resumeTopActivityUncheckedLocked()(Task.java:5103)驱动;分屏下 Task 还可以被 WindowOrganizer 跨进程重组,详见窗口容器专题。
源码证据
阅读目标:确认 ActivityRecord 创建与入 Task 的调用点。
正文指针:ActivityStarter.java:1325 / 2982;ActivityRecord.java:417 / 606-616。
// ActivityStarter.java:2982
newParent.addChild(mStartActivity, POSITION_TOP);// ActivityRecord.java:606-608
enum State {
INITIALIZING,
STARTED,
RESUMED,这段代码证明: ActivityRecord 是系统侧记录,通过 addChild 进入 Task,并用 State 枚举表达生命周期位置。
与 WMS 系列的衔接
ActivityRecord 同时是窗口容器(extends WindowToken)。它到达 RESUMED 后,Activity 才会请求窗口;窗口侧的服务端记录是 WindowState。两者的连接见窗口层级。
源码入口
源码基准:android-14.0.0_r75。
以下文件默认位于 frameworks/base/services/core/java/com/android/server/wm/,表中省略该前缀:
| 文件 | 关键位置 | 作用 |
|---|---|---|
ActivityStarter.java | 1325 行 new ActivityRecord.Builder(...).build();2912 行 setNewTask();2942 行 addOrReparentStartingActivity();2982 行 addChild(mStartActivity, POSITION_TOP) | 记录创建与入树 |
ActivityRecord.java | 417 行 class ActivityRecord extends WindowToken;606-616 行 enum State;5929 行 setState(State, String) | 服务端记录与状态机 |
Task.java | 222 行 class Task extends TaskFragment;5103 行 resumeTopActivityUncheckedLocked() | 任务容器与恢复 |
ActivityTaskSupervisor.java | 172 行 class ActivityTaskSupervisor | 任务协调 |