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 的超時管理