1 前言
日常開發(fā)過程中我們經(jīng)常調(diào)用startActivity(..)啟動新的Activity,那么系統(tǒng)是如何找到這個Activity愈涩,Activity的啟動模式的啟動模式在什么地方發(fā)揮作用,以及如何控制兩個Activity的生命周期的寄狼,這些值得深入源碼中去探索下不见。
2 Activity啟動整體過程
- 點擊桌面app圖標,Launcher進程采用Binder IPC向system_server進程發(fā)起startActivity請求烁竭;
- system_server進程接收到請求后,向zygote進程發(fā)送創(chuàng)建新進程的請求吉挣;
- zygote進程fork出新的子進程派撕,即App進程婉弹;
- App進程通過Binder IPC向system_server進程發(fā)起attach Application請求;
- system_server收到請求后腥刹,進行一系列的準備后马胧,再通過Binder IPC向App進程發(fā)送scheduleLaunchActivity請求;
- App進程的ApplicationThread收到請求后衔峰,通過handler向主線程發(fā)送LAUNCH_ACTIVITY消息佩脊;
- 主線程在收到Message后,創(chuàng)建目標Activity垫卤,并回調(diào)Activity.onCreate()等方法威彰;
注意:App與AMS通過Binder進行IPC通信,AMS(SystemServer進程)與zygote通過Socket進行IPC通信穴肘,Zygote創(chuàng)建一個套接字歇盼,監(jiān)聽ams發(fā)過來的fork請求。
2.1 啟動過程涉及的主要類
frameworks/base/services/core/java/com/android/server/am/
- ActivityManagerService.java
- ActivityStackSupervisor.java
- ActivityStack.java
- ActivityRecord.java
- ProcessRecord.java
frameworks/base/core/java/android/app/
- IActivityManager.java
- ActivityManagerNative.java (內(nèi)含ActivityManagerProxy)
- ActivityManager.java
- IApplicationThread.java
- ApplicationThreadNative.java (內(nèi)含ApplicationThreadProxy)
- ActivityThread.java (內(nèi)含ApplicationThread)
- Instrumentation.java
- ContextImpl.java
ActivityManagerServices
簡稱AMS评抚,服務(wù)端對象豹缀,負責系統(tǒng)中所有Activity的生命周期。ActivityStackSupervisor
管理activity任務(wù)棧慨代,內(nèi)部管理了mHomeStack邢笙、mFocusedStack和mLastFocusedStack三個Activity棧。其中侍匙,mHomeStack管理的是Launcher相關(guān)的Activity棧氮惯;mFocusedStack管理的是當前顯示在前臺Activity的Activity棧;mLastFocusedStack管理的是上一次顯示在前臺Activity的Activity棧想暗。ActivityStack
Activity在AMS的棧管理妇汗,用來記錄已經(jīng)啟動的Activity的先后關(guān)系,狀態(tài)信息等说莫。通過ActivityStack決定是否需要啟動新的進程杨箭。ActivityRecord
ActivityStack的管理對象,每個Activity在AMS對應(yīng)一個ActivityRecord储狭,來記錄Activity的狀態(tài)以及其他的管理信息互婿,其實就是服務(wù)器端的Activity對象的映像。TaskRecord
AMS抽象出來的一個“任務(wù)”的概念晶密,是記錄ActivityRecord的棧,一個“Task”包含若干個ActivityRecord模她。AMS用TaskRecord確保Activity啟動和退出的順序稻艰。如果你清楚Activity的4種launchMode,那么對這個概念應(yīng)該不陌生侈净。
ApplicationThread
用來實現(xiàn)AMS和ActivityThread之間的交互尊勿。在AMS需要管理相關(guān)Application中的Activity的生命周期時僧凤,通過ApplicationThread的代理對象與ActivityThread通訊。ApplicationThreadProxy
ApplicationThread 在服務(wù)端的代理元扔,AMS就是通過該代理與ActivityThread進行通信的躯保。ActivityThread
App的真正入口,當開啟App之后澎语,會調(diào)用main()開始運行途事,開啟消息循環(huán)隊列,這就是傳說中的UI線程或者叫主線程擅羞。與ActivityManagerServices配合尸变,一起完成Activity的管理工作。Instrumentation
儀表盤减俏,每一個應(yīng)用程序只有一個Instrumentation對象召烂,每個Activity內(nèi)都有一個對該對象的引用。負責調(diào)用
Activity和Application生命周期娃承。測試用到這個類比較多奏夫。AMS是董事會,負責指揮和調(diào)度的历筝,ActivityThread是老板酗昼,雖然說家里的事自己說了算,但是需要聽從AMS的指揮漫谷,而Instrumentation則是老板娘仔雷,負責家里的大事小事,但是一般不拋頭露面舔示,聽一家之主ActivityThread的安排碟婆。
3 Activity啟動過程階段
Activity啟動流程(從Launcher開始):
第一階段: Launcher通知AMS要啟動新的Activity(在Launcher所在的進程執(zhí)行)
- Launcher.startActivitySafely //首先Launcher發(fā)起啟動Activity的請求
- Activity.startActivity
- Activity.startActivityForResult
- Instrumentation.execStartActivity //交由Instrumentation代為發(fā)起請求
- ActivityManager.getService().startActivity //通過IActivityManagerSingleton.get()得到一個AMP代理對象
- ActivityManagerProxy.startActivity //通過AMP代理通知AMS啟動activity
第二階段:AMS先校驗一下Activity的正確性,如果正確的話惕稻,會暫存一下Activity的信息竖共。然后,AMS會通知Launcher程序pause Activity(在AMS所在進程執(zhí)行)
- ctivityManagerService.startActivity
- ActivityManagerService.startActivityAsUser
- ActivityStackSupervisor.startActivityMayWait
- ActivityStackSupervisor.startActivityLocked :檢查有沒有在AndroidManifest中注冊
- ActivityStackSupervisor.startActivityUncheckedLocked
- ActivityStack.startActivityLocked :判斷是否需要創(chuàng)建一個新的任務(wù)來啟動Activity俺祠。
- ActivityStack.resumeTopActivityLocked :獲取棧頂?shù)腶ctivity公给,并通知Launcher應(yīng)該pause掉這個Activity以便啟動新的activity。
- ActivityStack.startPausingLocked
- ApplicationThreadProxy.schedulePauseActivity
第三階段: pause Launcher的Activity蜘渣,并通知AMS已經(jīng)paused(在Launcher所在進程執(zhí)行)
- ApplicationThread.schedulePauseActivity
- ActivityThread.queueOrSendMessage
- H.handleMessage
- ActivityThread.handlePauseActivity
- ActivityManagerProxy.activityPaused
第四階段:檢查activity所在進程是否存在淌铐,如果存在,就直接通知這個進程蔫缸,在該進程中啟動Activity腿准;不存在的話,會調(diào)用Process.start創(chuàng)建一個新進程(執(zhí)行在AMS進程)
- ActivityManagerService.activityPaused
- ActivityStack.activityPaused
- ActivityStack.completePauseLocked
- ActivityStack.resumeTopActivityLocked
- ActivityStack.startSpecificActivityLocked
- ActivityManagerService.startProcessLocked
- Process.start //在這里創(chuàng)建了新進程拾碌,新的進程會導(dǎo)入ActivityThread類吐葱,并執(zhí)行它的main函數(shù)
第五階段: 創(chuàng)建ActivityThread實例街望,執(zhí)行一些初始化操作,并綁定Application弟跑。如果Application不存在灾前,會調(diào)用LoadedApk.makeApplication創(chuàng)建一個新的Application對象。之后進入Loop循環(huán)孟辑。(執(zhí)行在新創(chuàng)建的app進程)
- ActivityThread.main
- ActivityThread.attach(false) //聲明不是系統(tǒng)進程
- ActivityManagerProxy.attachApplication
第六階段:處理新的應(yīng)用進程發(fā)出的創(chuàng)建進程完成的通信請求哎甲,并通知新應(yīng)用程序進程啟動目標Activity組件(執(zhí)行在AMS進程)
- ActivityManagerService.attachApplication //AMS綁定本地ApplicationThread對象,后續(xù)通過ApplicationThreadProxy來通信扑浸。
- ActivityManagerService.attachApplicationLocked
- ActivityStack.realStartActivityLocked //真正要啟動Activity了烧给!
- ApplicationThreadProxy.scheduleLaunchActivity //AMS通過ATP通知app進程啟動Activity
第七階段: 加載MainActivity類,調(diào)用onCreate聲明周期方法(執(zhí)行在新啟動的app進程)
- ApplicationThread.scheduleLaunchActivity //ApplicationThread發(fā)消息給AT
- ActivityThread.queueOrSendMessage
- H.handleMessage //AT的Handler來處理接收到的LAUNCH_ACTIVITY的消息
- ActivityThread.handleLaunchActivity
- ActivityThread.performLaunchActivity
- Instrumentation.newActivity //調(diào)用Instrumentation類來新建一個Activity對象
- Instrumentation.callActivityOnCreate
- MainActivity.onCreate
- ActivityThread.handleResumeActivity
- AMP.activityResumed
- AMS.activityResumed(AMS進程)
4 Activity啟動代碼分析
Activity的啟動過程主要會涉及五個進程:Launcher進程喝噪、System_server進程础嫡、當前的前臺進程、待啟動的Activity所在進程酝惧、Zygote進程榴鼎, 在上圖中已有所體現(xiàn)。
具體源碼分析見參考資料[5]和[10]
參考資料:
[1] Activity啟動流程 ★
[2] Activity 啟動全過程解析 ★
[3] Android的Activity啟動流程分析 ★
[4] Activity 啟動流程 √
[5] 一張圖表示Activity啟動流程-- Activity啟動流程詳解 ★★
[6] 3分鐘看懂Activity啟動流程 √
[7] 說說Activity的啟動流程 ★
[8] Android進程啟動過程 & Activity顯示過程 √
[9] 庖丁解牛 Activity 啟動流程 √
[10] startActivity啟動過程分析