【筆記】 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 的超時管理