Android應用啟動、退出分析

§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


【茶工坊】

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容