§AMS和應用進程
§應用啟動流程
§應用退出流程
§啟動、退出消息
AMS和應用進程
應用進程 <- 系統管理 <- AMS
AMS:ActivityManagerService
系統級Service
管理應用進程的生命周期(包括進程的Activity、Service、Broadcast和Provider)
與應用進程的跨進程交互
Android的一個應用就是一個進程,系統對應用的管理是一個專門的Service——ActivityManagerService,簡稱AMS。
AMS是一個系統級Service。
系統通過它來管理應用進程的生命周期,當然包括應用的Activity、Service等的生命周期。
AMS是一個獨立的進程,因此它要管理應用進程,必然要進行跨進程交互。
AMS和應用的跨進程交互
ActivityManagerProxy——AMS的代理,供應用進程調用。
? ? ?通過ActivityManagerNative.getDefault()獲取
ApplicationThreadProxy——應用進程的代理,供AMS進程調用。
? ? 應用啟動時,會將應用進程的代理傳遞到AMS
跨進程通信,一般都會用到遠程代理。這個后面會安排專題來講。
簡單來說,有進程A和進程B,進程B要調用進程A,那么A是Server端,B是Client端。AP是Server端的遠程代理,代理AP和Server端擁有相同的調用接口。
進程B要調用進程A的接口f,直接調用代理的接口f,代理通過Binder機制通知進程A,喚起進程A相同接口f的調用。
ActivityManagerProxy是AMS的代理,供應用進程調用。
ApplicationThreadProxy是應用進程的代理,供AMS進程調用。
啟動流程
這里以全新啟動為例進行分析。
進程層次啟動流程
1. 應用的啟動是從其他應用調用startActivity開始的。通過代理請求AMS啟動Activity。
2. AMS創建進程,并進入ActivityThread的main入口。在main入口,主線程初始化,并loop起來。
主線程初始化,主要是實例化ActivityThread和ApplicationThread,以及MainLooper的創建。ActivityThread和ApplicationThread實例用于與AMS進程通信。
3. 應用進程將實例化的ApplicationThread
Binder傳遞給AMS,這樣AMS就可以通過代理對應用進程進行訪問。
4. AMS通過代理,請求啟動Activity。ApplicationThread通知主線程執行該請求。然后,ActivityThread執行Activity的啟動。
Activity的啟動包括,Activity的實例化,Application的實例化,以及Activity的啟動流程:create、start、resume。
可以看到入口Activity其實是先于Application實例化,只是onCreate之類的流程,先于Activity的流程。
另外需要scheduleLaunchActivity,在ApplicationThreaad中,對應AMS管理Activity生命周期的方法都以scheduleXXXActivity,ApplicationThread在Binder線程中,它會向主線程發送消息,ActivityThread的Handler會調用相應的handleXXXActivity方法,然后會執行performXXXActivity方法,最終調用Activity的onXXX方法。
進程層次詳細啟動流程
進程層次,主要是應用進程啟動和主線程啟動流程。
這個流程比較復雜,需要注意的有幾點:
1.Activity獲取AMS的遠程代理:ActivityManagerNative::getDefault,它返回的是代理ActivityManagerService的ActivityManagerProxy。
2.AMS通過ActivityStack和ActivityStackSupervisor管理Activity棧,實現Activity之間的切換。
3.ActivitStack對應生命周期的方法: xxxActivityLocked。(eg: startActivityLocked)
4.全新啟動過程中,AMS只進行了Launch調度,沒有進行Start和Resume調度。
應用層次詳細啟動流程
應用層次,主要是Activity的啟動流程。
這里可以看到,Activity的create、start、resume直接在scheduleLaunch后面全部執行了。
退出流程
進程層次退出流程
1. 應用的退出,首頁由Activity調用自身的finish。
2. 然后AMS調度應用Pause。
3. 應用Pause之后通知AMS。
4. AMS再調度應用Destroy。應用執行這個請求時,會先Stop,現進行Destroy。
進程層次詳細退出流程
可以看到,AMS進行Pause和Destroy調度,沒有進行Stop調度。
應用層次詳細退出流程
Pause在AMS調度Pause之后完成。
Stop和Destroy在AMS調度Destroy后完成。
啟動、退出消息
?打印MainLooper消息
在Activity類加入靜態代碼塊
? static {
? Looper.myLooper().setMessageLogging(newLogPrinter(Log.INFO, TAG));
? }
MainLooper對應的Handler
?ActivityThread$H
?ViewRootImpl$ViewRootHandler
?…
上次已經講過了,Activity的實例化是在主線程,因此Looper.myLooper()拿到的是MainLooper。設置MessageLogging,這樣MainLooper的消息就可打印出來。
MainLooper對應的Handler比較多,與啟動過程相關的是ActivityThread$H。
啟動消息
全新啟動時,主線程基本消息就是這些。
(android.app.ActivityThread$H){42deea58} null: 100
100: LAUNCH_ACTIVITY
無START_ACTIVITY和RESUME_ACTIVITY
可以看到AcitivyThread的H只收到一個LAUNCH的消息。
退出消息
Dispatching to Handler (android.app.ActivityThread$H) {42de80b0} null: 102
§102:PAUSE_ACTIVITY_FINISHING
Dispatching to Handler (android.app.ActivityThread$H) {42de80b0} null: 109
§109:DESTROY_ACTIVITY