AMS和Activity啟動過程

AMS

AMS的功能

  1. ==統(tǒng)一調(diào)試應(yīng)用程序的Activity==:應(yīng)用程序要運(yùn)行Activity,首先會報(bào)告給AmS,然后由AmS決定該Activity是否啟動梳码。AMS必須知道各個應(yīng)用程序運(yùn)行的Activity。
  2. ==內(nèi)存管理==: Activity退出后遣钳,其所在的進(jìn)程并不會被立即殺死晌纫,從而在下次啟動的時候,提高Activity的啟動速度淤翔。這些Activity只有在內(nèi)存吃緊的時候,才會被自動殺死佩谷,這些操作由AMS管理旁壮。
  3. ==進(jìn)程管理==: AmS向外提供了查詢系統(tǒng)正在運(yùn)行的進(jìn)程API。

AMS創(chuàng)建過程

  1. AMS是在SystemServer中啟動的谐檀,==SystemServer的main方法中調(diào)用它的run方法==抡谐。
  2. 在run方法中(會創(chuàng)建SystemServiceManager,它會對系統(tǒng)的服務(wù)進(jìn)行創(chuàng)建 桐猬、啟動麦撵、和生命周期管理)==會調(diào)startBootstrapService()方法啟動引導(dǎo)服務(wù)==(ActivityManagerService、PowerManagerService、PackageManagerService等)
  3. 在startBootstrapService()方法中==調(diào)用了SystemServiceManager的startService方法免胃,方法參數(shù)是AMS的內(nèi)部類Lifecycle音五,它的構(gòu)造函數(shù)會new一個AMS的對象。==

AMS家族重要術(shù)語解釋

  • ActivityManagerServices羔沙,簡稱AMS躺涝,服務(wù)端對象,負(fù)責(zé)系統(tǒng)中所有Activity的生命周期撬碟。

  • ==ActivityThread==诞挨,App的真正入口莉撇。當(dāng)開啟App之后呢蛤,調(diào)用main()開始運(yùn)行,開啟消息循環(huán)隊(duì)列棍郎,這就是傳說的UI線程或者叫主線程其障。與ActivityManagerService一起完成Activity的管理工作。

  • ApplicationThread涂佃,用來實(shí)現(xiàn)ActivityManagerServie與ActivityThread之間的交互励翼。在ActivityManagerSevice需要管理相關(guān)Application中的Activity的生命周期時,通過ApplicationThread的代理對象與ActivityThread通信辜荠。

  • ApplicationThreadProxy汽抚,是ApplicationThread在服務(wù)器端的代理,負(fù)責(zé)和客戶端的ApplicationThread通信伯病。AMS就是通過該代理與ActivityThread進(jìn)行通信的造烁。

  • Instrumentation,每一個應(yīng)用程序只有一個Instrumetation對象午笛,每個Activity內(nèi)都有一個對該對象的引用惭蟋,Instrumentation可以理解為應(yīng)用進(jìn)程的管家,ActivityThread要創(chuàng)建或暫停某個Activity時药磺,都需要通過Instrumentation來進(jìn)行具體的操作告组。

  • ActivityStackActivity在AMS的棧管理癌佩,用來記錄經(jīng)啟動的Activity的先后關(guān)系木缝,狀態(tài)信息等。通過ActivtyStack決定是否需要啟動新的進(jìn)程围辙。

  • ActivityRecord氨肌,ActivityStack的管理對象,每個Acivity在AMS對應(yīng)一個ActivityRecord酌畜,來記錄Activity狀態(tài)以及其他的管理信息怎囚。其實(shí)就是服務(wù)器端的Activity對象的映像

  • TaskRecord,AMS抽象出來的一個“任務(wù)”的概念恳守,是記錄ActivityRecord的棧考婴,一個“Task”包含若干個ActivityRecord。AMS用TaskRecord確保Activity啟動和退出的順序催烘。如果你清楚Activity的4種launchMode沥阱,那么對這概念應(yīng)該不陌生。

AMS相關(guān)類圖

image.png

APP啟動過程(根Activity啟動)

  • 1伊群、點(diǎn)擊桌面應(yīng)用圖標(biāo)考杉,==Launcher進(jìn)程將啟動Activity(MainActivity)的請求以Binder的方式發(fā)送給了AMS==。
  • 2舰始、==AMS接收到啟動請求后崇棠,交付ActivityStarter處理Intent和Flag等信息==,然后再交給ActivityStackSupervisior/ActivityStack 處理Activity進(jìn)棧相關(guān)流程丸卷。==同時以Socket方式請求Zygote進(jìn)程fork新進(jìn)程==枕稀。
  • 3、==Zygote接收到新進(jìn)程創(chuàng)建請求后fork出新進(jìn)程==谜嫉。
  • 4萎坷、==在新進(jìn)程里創(chuàng)建ActivityThread對象==,新創(chuàng)建的ActivityThread就是應(yīng)用的主線程沐兰,==在主線程里開啟Looper消息循環(huán)哆档,開始處理創(chuàng)建Activity==。
  • 5住闯、==ActivityThread利用ClassLoader去加載Activity瓜浸、創(chuàng)建Activity實(shí)例,并回調(diào)Activity的onCreate()方法==寞秃,這樣便完成了Activity的啟動斟叼。
image.png

==整個流程主要涉及四個進(jìn)程==:

  • ==調(diào)用者進(jìn)程==,如果是在桌面啟動應(yīng)用就是Launcher應(yīng)用進(jìn)程春寿。
  • ActivityManagerService等所在的==System Server進(jìn)程==颅停,該進(jìn)程主要運(yùn)行著系統(tǒng)服務(wù)組件鳄袍。
  • ==Zygote進(jìn)程==,該進(jìn)程主要用來fork新進(jìn)程。
  • ==新啟動的應(yīng)用進(jìn)程==临燃,該進(jìn)程就是用來承載應(yīng)用運(yùn)行的進(jìn)程了要出,它也是應(yīng)用的主線程(新創(chuàng)建的進(jìn)程就是主線程)奄毡,處理組件生命周期商蕴、界面繪制等相關(guān)事情。

普通Activity啟動過程

普通Activity的啟動過程只涉及兩個進(jìn)程造壮,AMS所在進(jìn)程和應(yīng)用程序進(jìn)程渡讼。

啟動Activity B -> 當(dāng)前有正在顯示的activity嗎 -> 有就先pause() -> B的進(jìn)程存在嗎 -> 不存在則創(chuàng)建 -> B進(jìn)程啟動指定的Activity


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骂束,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子成箫,更是在濱河造成了極大的恐慌展箱,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹬昌,死亡現(xiàn)場離奇詭異混驰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)皂贩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門栖榨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人明刷,你說我怎么就攤上這事婴栽。” “怎么了遮精?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵居夹,是天一觀的道長败潦。 經(jīng)常有香客問我本冲,道長,這世上最難降的妖魔是什么劫扒? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任檬洞,我火速辦了婚禮,結(jié)果婚禮上沟饥,老公的妹妹穿的比我還像新娘添怔。我一直安慰自己,他們只是感情好贤旷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布广料。 她就那樣靜靜地躺著,像睡著了一般幼驶。 火紅的嫁衣襯著肌膚如雪艾杏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天盅藻,我揣著相機(jī)與錄音购桑,去河邊找鬼。 笑死氏淑,一個胖子當(dāng)著我的面吹牛勃蜘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播假残,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼缭贡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阳惹,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坑资,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后穆端,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袱贮,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年体啰,在試婚紗的時候發(fā)現(xiàn)自己被綠了攒巍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡荒勇,死狀恐怖柒莉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沽翔,我是刑警寧澤兢孝,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站仅偎,受9級特大地震影響跨蟹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜橘沥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一窗轩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧座咆,春花似錦痢艺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哺呜,卻和暖如春舌缤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弦牡。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工友驮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驾锰。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓卸留,卻偏偏與公主長得像,于是被迫代替她去往敵國和親椭豫。 傳聞我的和親對象是個殘疾皇子耻瑟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容