Android應用啟動、退出分析

§AMS和應用進程

§應用啟動流程

§應用退出流程

§啟動、退出消息

AMS和應用進程


應用進程 <- 系統(tǒng)管理 <- AMS

AMS:ActivityManagerService

系統(tǒng)級Service

管理應用進程的生命周期(包括進程的Activity、Service、Broadcast和Provider)

與應用進程的跨進程交互

Android的一個應用就是一個進程,系統(tǒng)對應用的管理是一個專門的Service——ActivityManagerService,簡稱AMS。

AMS是一個系統(tǒng)級Service。

系統(tǒng)通過它來管理應用進程的生命周期,當然包括應用的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創(chuàng)建進程,并進入ActivityThread的main入口。在main入口,主線程初始化,并loop起來。

主線程初始化,主要是實例化ActivityThread和ApplicationThread,以及MainLooper的創(chuàng)建。ActivityThread和ApplicationThread實例用于與AMS進程通信。

3. 應用進程將實例化的ApplicationThread

Binder傳遞給AMS,這樣AMS就可以通過代理對應用進程進行訪問。

4. AMS通過代理,請求啟動Activity。ApplicationThread通知主線程執(zhí)行該請求。然后,ActivityThread執(zhí)行Activity的啟動。

Activity的啟動包括,Activity的實例化,Application的實例化,以及Activity的啟動流程:create、start、resume。

可以看到入口Activity其實是先于Application實例化,只是onCreate之類的流程,先于Activity的流程。

另外需要scheduleLaunchActivity,在ApplicationThreaad中,對應AMS管理Activity生命周期的方法都以scheduleXXXActivity,ApplicationThread在Binder線程中,它會向主線程發(fā)送消息,ActivityThread的Handler會調用相應的handleXXXActivity方法,然后會執(zhí)行performXXXActivity方法,最終調用Activity的onXXX方法。

進程層次詳細啟動流程


進程層次,主要是應用進程啟動和主線程啟動流程。

這個流程比較復雜,需要注意的有幾點:

1.Activity獲取AMS的遠程代理:ActivityManagerNative::getDefault,它返回的是代理ActivityManagerService的ActivityManagerProxy。

2.AMS通過ActivityStack和ActivityStackSupervisor管理Activity棧,實現(xiàn)Activity之間的切換。

3.ActivitStack對應生命周期的方法: xxxActivityLocked。(eg: startActivityLocked)

4.全新啟動過程中,AMS只進行了Launch調度,沒有進行Start和Resume調度。

應用層次詳細啟動流程


應用層次,主要是Activity的啟動流程。

這里可以看到,Activity的create、start、resume直接在scheduleLaunch后面全部執(zhí)行了。

退出流程


進程層次退出流程


1. 應用的退出,首頁由Activity調用自身的finish。

2. 然后AMS調度應用Pause。

3. 應用Pause之后通知AMS。

4. AMS再調度應用Destroy。應用執(zhí)行這個請求時,會先Stop,現(xiàn)進行Destroy。

進程層次詳細退出流程


可以看到,AMS進行Pause和Destroy調度,沒有進行Stop調度。

應用層次詳細退出流程


Pause在AMS調度Pause之后完成。

Stop和Destroy在AMS調度Destroy后完成。

啟動、退出消息


?打印MainLooper消息

在Activity類加入靜態(tài)代碼塊

? 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


【茶工坊】

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容