1.预启动
此阶段 6 步骤:
1.AMS.startActivity
获取client端的UID,判断Client端是否有权限启动应用程序Activity。
2.ActivityStack.startActivityMayWait
查询系统中域Intent 匹配的Activity
1 调用resolveActivity 通过PKMS 查询是否存在指定Intent的Activity
2 根据caller判断启动Activity的客户端是应用程序还是其他查询(adb shell)
3 调用ActivityStack.startActivityLocked 执行预启动阶段第三步
4.处理wait 状态,正常启动状态不会wait
adb下“am start -W ” 启动Activity 时,需要wait 状态
3.ActivityStack.startActivityLocked(IApplicationThread caller)
1.创建Activity 的ActivityRecord 对象,代表此Activoty 在AMS 启动流程中单位;
4.ActivityStack.startActivityUncheckedLocked
1.根据启动标记 和 启动模式,判断是否需要在新的Task 中运行目标Activity;
2.判断是否有可服用的Task 或者Activity;
需要在新的Task 总运行Activity的条件有如下3 种:
(1)sourceRecord 为null,即 不是由Activity发出的启动请求(Launcher 或者adb start 启动的Activity)
(2)sourceRecord 的启动模式为singleInstance
(3)要启动的Activity 的启动模式为singleInstance 或singleTask
满足以上三个条件,启动flags'中添加 FLAG_
3.将复用/新建的TaskRecord 与ActivityRecord 关联;
4.在AMS 中更新Task数量;
5.调用ActivityStack.startActivityLocked
5.ActivityStack.st