Activity啟動流程
引言
Activity啟動流程很多文章都已經說過了,這裡說一下自己的理解。
涉及到的概念
- 程序:Android系統中每個APP都是一個程序
- IPC:跨程序通訊
涉及到的類
- ActivityStack:Activity在AMS的棧管理,用來記錄已經啟動的Activity的先後關係,狀態資訊等。通過ActivityStack決定是否需要啟動新的程序。
- ActivitySupervisor:管理activity任務棧
- ActivityThread:UI執行緒,App的真正入口。
- ApplicationThread:用來實現AMS和ActivityThread之間的互動。
- ApplicationThreadProxy:ApplicationThread在服務端的代理。AMS就是通過該代理與ActivityThread進行通訊的。
- AMS:負責管理四大元件和程序,包括生命週期和狀態切換。AMS因為要和ui互動,所以極其複雜,涉及window。
- AMN:執行在server端(SystemServer程序)。實現了Binder類,具體功能由子類AMS實現。
- AMP:AMS的client端代理(app程序)。瞭解Binder知識可以比較容易理解server端的stub和client端的proxy。AMP和AMS通過Binder通訊。
- Instrumentation:儀表盤,負責呼叫Activity和Application生命週期。
流程圖

涉及到的程序
- Launcher所在的程序
- AMS所在的SystemServer程序
- 要啟動的Activity所在的app程序
具體流程
- Launcher:Launcher通知AMS要啟動activity。
- startActivitySafely->startActivity->Instrumentation.execStartActivity()(AMP.startActivity)->AMS.startActivity
- AMS:PMS的resoveIntent驗證要啟動activity是否匹配。
- 如果匹配,通過ApplicationThread發訊息給Launcher所在的主執行緒,暫停當前Activity(Launcher);
- 暫停完,在該activity還不可見時,通知AMS,根據要啟動的Activity配置ActivityStack。然後判斷要啟動的Activity程序是否存在?
- 存在:傳送訊息LAUNCH_ACTIVITY給需要啟動的Activity主執行緒,執行handleLaunchActivity
- 不存在:通過socket向zygote請求建立程序。程序啟動後,ActivityThread.attach
- 判斷Application是否存在,若不存在,通過LoadApk.makeApplication建立一個。在主執行緒中通過thread.attach方法來關聯ApplicationThread。
- 在通過ActivityStackSupervisor來獲取當前需要顯示的ActivityStack。
- 繼續通過ApplicationThread來發送訊息給主執行緒的Handler來啟動Activity(handleLaunchActivity)。
- handleLauchActivity:呼叫了performLauchActivity,裡邊Instrumentation生成了新的activity物件,繼續呼叫activity生命週期。
參考函式流程
Activity啟動流程(從Launcher開始):
Step1~Step5: Step1-Step5通知ActivityManagerService要啟動新的Activity了(在Launcher所在程序執行)。
- Step1: Launcher.startActivitySafely
- Step2:Activity.startActivity
- Step3:Activity.startActivityForResult
- Step4:Instrumentation.execStartActivity
- Step5:ActivityManagerProxy.startActivity
Step6~Step12: Step6-Step12通知Launcher程式應該pause Launcher的Activity了(在ActivityManagerService所在程序執行)
- step6:ActivityManagerService.startActivity
- step7:ActivityStack.startActivityMayWait
- step8:ActivityStack.startActivityLocked :檢查有沒有在AndroidManifest中註冊
- step9:ActivityStack.startActivityUncheckedLocked, ActivityStack.startActivityLocked :startActivityUncheckedLocked判斷是否需要建立一個新的任務來啟動Activity。
- step10:ActivityStack.resumeTopActivityLocked :獲取棧頂的activity,並通知Launcher應該pause掉這個Activity以便啟動新的activity
- step11:ActivityStack.startPausingLocked
- Step 12. ApplicationThreadProxy.schedulePauseActivity
Step13~Step17: pause Launcher的Activity,並通知ActivityManagerService已經pause結束了(在Launcher所在程序執行)
- step13:ApplicationThread.schedulePauseActivity
- step14:ActivityThread.queueOrSendMessage
- step15:H.handleMessage
- step16:ActivityThread.handlePauseActivity
- step17:ActivityManagerProxy.activityPaused
Step18~Step23 建立一個新程序,呼叫ActivityThread.main方法(執行在ActivityManagerService程序)
- step18:ActivityManagerService.activityPaused
- step19:ActivityStack.activityPaused
- step20:ActivityStack.completePauseLocked
- step21:ActivityStack.resumeTopActivityLocked
- step22;ActivityStack.startSpecificActivityLocked
- step23:ActivityManagerService.startProcessLocked
step18-step23:建立一個新程序,呼叫ActivityThread.main方法(執行在ActivityManagerService程序)。這其中,ActivityManagerService會先檢查目標Activity所需的應用程序是否存在,如果存在,就直接通知這個程序,在該程序中啟動Activity,否則,會先呼叫Process.start建立一個新的應用程式程序。
注:這裡就是與在同一個程序中啟動Activity的區別之處
Step24~Step25: 建立ActivityThread例項,初始化一些資料,進入Loop迴圈(執行在新建立的程序)
- step24:ActivityThread.main
- step25:ActivityManagerProxy.attachApplication
Step26~Step29: 處理新的應用程序發出的建立程序完成的通訊請求,並通知新應用程式程序啟動目標Activity元件(執行在ActivityManagerService程序)
- step26:ActivityManagerService.attachApplication
step27:ActivityManagerService.attachApplicationLocked - step28:ActivityStack.realStartActivityLocked
- step29:ApplicationThreadProxy.scheduleLaunchActivity
Step30~Step35: 載入MainActivity類,呼叫onCreate宣告週期方法(執行在新程序)
- step30:ApplicationThread.scheduleLaunchActivity
- step31:ActivityThread.queueOrSendMessage
- step32:H.handleMessage
- step33:ActivityThread.handleLaunchActivity
- step34:ActivityThread.performLaunchActivity
- step35:MainActivity.onCreate