ActivityStarter 如何做一次启动决策
ActivityStarter 如何做一次启动决策
请求到达 ATMS 后还不能直接创建 Activity。ActivityStarter 必须先解析目标、检查调用限制、 选择或创建 Task,并决定这次启动是否能够继续。它输出启动决策,不负责 fork 进程,也不执行 应用生命周期。
决策器不是执行器
| 常见误解 | 正确理解 |
|---|---|
| ActivityStarter 负责创建进程和 Activity | 它只做决策;进程创建在 AMS,Activity 执行在应用主线程 |
| 每次启动都是新建任务 | 系统会先找可复用任务,再决定新建 |
ActivityStarter 是“启动决策员”,不是“执行者”。它拿着 Intent、调用者、启动标志和当前任务状态,输出一个结论:复用哪个 Task、新建哪个 Task、是否允许这次启动。
决策主链
逐步解释:
- ① 组装:
ActivityStartController.obtainStarter()(ActivityStartController.java:130)返回一个 ActivityStarter。 - ② 执行入口:
ActivityStarter.execute()(ActivityStarter.java:715)在主流程里先解析 Intent。 - ③ 解析:
mRequest.resolveActivity(mSupervisor)(747 行)由 supervisor 解析目标 ActivityInfo。 - ④ 标志:
computeLaunchingTaskFlags()(1715 行)根据 Intent 标志和 launchMode 决定任务行为。 - ⑤ 找任务:
getReusableTask()与computeTargetTask()决定复用还是新建(1770 行)。 - ⑥ 校验:
isAllowedToStart()检查后台启动等限制。 - ⑦ 入树:
addOrReparentStartingActivity(targetTask, ...)(1828 行)把 ActivityRecord 放进 Task。
三个关键判断
| 判断 | 回答的问题 | 依据 |
|---|---|---|
| Intent 解析 | 要启动哪个组件 | PackageManager 解析 intent → ActivityInfo |
| 任务归属 | 放进哪个 Task | launchMode、FLAG_ACTIVITY_NEW_TASK、taskAffinity |
| 启动校验 | 是否允许这次启动 | 前后台、用户、权限、系统状态 |
FLAG_ACTIVITY_NEW_TASK 是影响任务归属最常用的标志(ActivityStarter.java:1075 / 1262):带它且没有可复用任务时,系统新建 Task。
源码证据
阅读目标:确认 execute() 先解析、再决策、最后入树的三段结构。
正文指针:ActivityStarter.java:715 / 747 / 1715 / 1770 / 1828。
// ActivityStarter.java:715
int execute() {
...
if (mRequest.activityInfo == null) {
mRequest.resolveActivity(mSupervisor);
}
...
}// ActivityStarter.java:1826-1828
setNewTask(taskToAffiliate);
...
addOrReparentStartingActivity(targetTask, "adding to task");这段代码证明: ActivityStarter 自己完成解析与决策,并把 ActivityRecord 挂到目标 Task;它没有创建进程,也没有执行 onCreate。
决策失败怎么办
isAllowedToStart() 返回非 START_SUCCESS 时,execute 流程会清理已创建的 ActivityRecord,避免留下半成品;结果码通过 Binder 回传,应用侧由 checkStartActivityResult() 转成异常或回调。常见结果码:START_SUCCESS、START_TASK_TO_FRONT、START_DELIVERED_TO_TOP、后台启动被拒等。
源码入口
源码基准:android-14.0.0_r75。
以下文件默认位于 frameworks/base/services/core/java/com/android/server/wm/,表中省略该前缀:
| 文件 | 关键位置 | 作用 |
|---|---|---|
ActivityStartController.java | 130 行 obtainStarter(Intent, String) | Starter 组装 |
ActivityStarter.java | 155 行 class ActivityStarter;715 行 execute();747 行 resolveActivity;1715 行 computeLaunchingTaskFlags();1770 行 computeTargetTask();1826-1828 行 setNewTask / addOrReparentStartingActivity | 启动决策主链 |
ActivityStarter.java | 1075 / 1262 行 FLAG_ACTIVITY_NEW_TASK | 任务标志判断 |
ActivityTaskManagerService.java | 1018 行 new ActivityStartController(this) | 控制器创建 |