【笔记】 Activity在server端启动流程

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.startActivityLocked(ActivityRecord r , ...)

1. 将要启动的ActivityRecord 对象添加到mHistory 的适当位置,更新Task 中Activity 的计数,准备Activity 的切换动画;

2. 调用ActivityStack.resumeTopActivityLocked

6.ActivityStack.resumeTopActivityLocked

 查找当前栈顶是否有需要显示的Activity,没有则启动HOME桌面并返回;如果有需要显示Activity,就查找当前是否需要暂停的Activity

 

2.暂停

主要工作就是  :

暂停启动目标Activity 的源Activity

 

3.启动应用程序

此 阶段 主要是创建目标Activity 所运行的进程。

1.再次进入ActivityStack.resumeTopActivityLocked(ActivityRecord prev)

  此时因为处于resume 状态的 源Activity 已经处于暂停状态;

 2.从ActivityStack.mHistory 中取出 第一个非 finishing 状态的ActivityRecord 

2.ActivityStack.startSpecificActivityLocked

1.检查AMS.mProcessName 成员变量中是否已经存在制定的进程信息(AMS.mProcessName 这个数组中存放这AMS 中处理的进程的信息),没有则创建 此app 对应的ProcessRecord 对象。

2.调用AMS.startProcessLocked  函数

3.AMS.startProcessLocked(String processName , ...)

1.根据procesName 来查找AMS 的成员变量mProcessName 中是否已经存在该进程对应的ProcessRecord 对象(之前启动过);

2.无 processName 对应的ProcessRecord 对象,则会调用newProcessRecordLocked 方法创建目标Activity对应的ProcessRecord 进程,并且存放在AMS.mProcessName 中;

3.调用AMS.startProcessLocked

4.AMS.startProcessLocked(ProcessRecord app , ...)

1.通过PKMS 获取当前应用程序的group_id

2.调用Process.start 来创建应用程序,该程序的入口是“android.app.ActivityThread”的main ()

Process.ProcessStartResult startResult = Process.start("android.app.ActivityThread" ,
app.processName , uid , uid , gids , ... ...)

3,.此进程创建完了就拥有了自己的PID。

4.AMS 会发送一个超时消息(10s 或者 20s),超过此消息后Process.start 未完成,会触发AMS 的超时管理

 

4.新创建的进程中加载 应用程序的Activity

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章