1. 程式人生 > >【筆記】 Activity在server端啟動流程

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