【筆記】ActivityManagerService 流程
1.AMSsystemReady() 都是SystemServer 啟動此service後,完成啟動,SystemServer主動呼叫的。
2. 1.HOME 點選icon
2.application 中呼叫startActivity
3.Back 鍵
4.長按HOme 鍵顯示最近執行Task
5.adb shell 啟動
以上都是通過Binder 機制的Client端最終呼叫Server 端的AMS 的startActivityXXX
3.Launcher啟動
1. PKMS 獲取APP 的AndroidManifest 中的MAIN activity 的Intent,Launcher2.apk 通過這個Intent 啟動 對應APK。 直接呼叫AMS.startActivity-->AMS.startActivityForResult
****.mActivityStarter 在AMS的結構函式中建立,AMS的唯一的mStackSupervisor(ActivityStackSupervisor.java) 建立唯一的一個mActivityStarter(ActivityStarter.java) ,mActivityStarter 中的mSupervisor 就是AMS 中傳下的 mStackSupervisor。
****. qualcomm 在 startProcessLocked 函式中新增的攔截,startProcessLocked 函式返回一個ProcessRecord 單位,此單位不為null 時,就會新建一個ActivityThread; 為null 時就不建立ActivityThread,啟動Activity fail。
****. ActivityStarter 和 ActivityStackSupervisor 是AMS 的2個成員變數,ActivityStackSupervisor傳入ActivityStarter 的建構函式中的mSupervisor,作為ActivityStarter的一個成員變數。
****. ActivityRecord 是在ActivityStarter.startActivity() 中建立,為Activity 狀態的記錄物件 , ProcessRecord 是ActivityRecorder 的一個成員變數。
****.ActivityStarter.startActivity() 中,初始化一個ProcessRecord,代表新啟動activity 的程序的狀態物件,初始化pid 和uid。【一個Activity 對應一個ProcessRecord,儲存在AMS中】
****. ActivityStarter.startActivityUnchecked --- > ActivityStarter.setTargetStackAndMoveToFrontIfNeeded() 是最終的移動task 到堆疊,影響AMS 啟動Activity 的順序。
2. application 中啟動Activity: AMS.startActivity-->AMS.startActivityMayWait
3. Launcher3
中啟動Activity:Launcher.startActivitySafely()
--->Activity.startActivity()
-->Activity.startActivityForResult()
-->AMS.startActivity()
-->ActivityManagerService.startActivityAsUser()【原生在這裡有對呼叫者許可權進行檢測: 僅僅檢測userid 是否有許可權限制】
-->ActivityStarter.startActivityMayWait()
-->ActivityStarter.startActivityLocked()
-->ActivityStarter.startActivity()【JLQ 監聽!!!!!!】
-->ActivityStarter.startActivityUncheck()【處理Activity的啟動模式,進而處理task 和 stack 的問題 !!!】【四種模式,會對task 有操作,避免這種操作,在這之前進行監聽】
--- ... ...
--->AMS.startProcessLocked()【Qualcomm 監聽攔截: 如果不符合自啟動條件,建立ProcessRecord 失敗,返回null, 不會繼續建立ActivityRecoder 物件 ,不會再AMS 的堆疊裡放入ActivityRecoder】