【筆記】 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

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