1. 程式人生 > >【筆記】ActivityManagerService 流程

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