Android 應(yīng)用程序進(jìn)程啟動(dòng)過程以及Activity啟動(dòng)過程總結(jié)

應(yīng)用程序進(jìn)程簡(jiǎn)介

要想啟動(dòng)一個(gè)應(yīng)用程序章母,首先要保證這個(gè)應(yīng)用程序所需要的應(yīng)用程序進(jìn)程已經(jīng)啟動(dòng)翩剪。AMS在啟動(dòng)應(yīng)用程序時(shí)會(huì)檢查這個(gè)應(yīng)用程序需要的應(yīng)用程序進(jìn)程是否存在,不存在就會(huì)請(qǐng)求Zygote進(jìn)程啟動(dòng)需要的應(yīng)用程序進(jìn)程蚪缀。我們知道在Zygote的java框架層中會(huì)創(chuàng)建一個(gè)Server端的Socket恕出,這個(gè)Socket用來等待AMS請(qǐng)求Zygote來創(chuàng)建應(yīng)用程序進(jìn)程。Zygote進(jìn)程通過fork自身創(chuàng)建應(yīng)用程序進(jìn)程浙巫,這樣應(yīng)用程序進(jìn)程就會(huì)獲得Zygote進(jìn)程在啟動(dòng)時(shí)創(chuàng)建虛擬機(jī)實(shí)例刷后,還創(chuàng)建了Binder線程池和消息循環(huán)渊抄,這樣運(yùn)行在應(yīng)用進(jìn)程中的應(yīng)用程序就可以方便地使用Binder進(jìn)行進(jìn)程間通信以及處理消息了。上期已經(jīng)講到Android系統(tǒng)啟動(dòng)流程總結(jié)护桦,鏈接:

AMS如果想要啟動(dòng)應(yīng)用程序進(jìn)程二庵,就需要向Zygote進(jìn)程發(fā)送創(chuàng)建應(yīng)用程序進(jìn)程的請(qǐng)求,AMS會(huì)通過調(diào)用startProcessLocked方法向Zygote進(jìn)程發(fā)送請(qǐng)求催享。其中ZygoteProcess類用于保持與Zygote進(jìn)程的通信狀態(tài)睡陪。

??Zygote接收請(qǐng)求并創(chuàng)建應(yīng)用程序進(jìn)程:

(1)應(yīng)用程序進(jìn)程就進(jìn)入了ActivityThread的main方法中,應(yīng)用程序進(jìn)程就創(chuàng)建完成了

并且運(yùn)行了主線程的管理類ActivityThread兰迫。

?(2)啟動(dòng)Binder線程池,確保線程池只會(huì)被啟動(dòng)一次涡拘,并創(chuàng)建線程池中的第一個(gè)線程据德,也就是線程池的主線程,將當(dāng)前線程注冊(cè)到Binder驅(qū)動(dòng)程序中橱野,這樣我們創(chuàng)建的線程就加入了Binder線程池中善玫,新創(chuàng)建的應(yīng)用程序進(jìn)程就支持Binder進(jìn)程間通信了,我們只需要?jiǎng)?chuàng)建當(dāng)前進(jìn)程Binder對(duì)象蜗元,并將它注冊(cè)到ServiceManager中就可以實(shí)現(xiàn)Binder進(jìn)程間通信了系冗,而不必關(guān)心進(jìn)程間是如何通過Binder進(jìn)行通信的。

?(3)應(yīng)用程序進(jìn)程啟動(dòng)后創(chuàng)建消息循環(huán)惯豆,ActivityThread用于管理當(dāng)前應(yīng)用程序的主線程,應(yīng)用程序進(jìn)程完成后循帐,就會(huì)創(chuàng)建一個(gè)消息循環(huán)拄养。系統(tǒng)在應(yīng)用程序進(jìn)程啟動(dòng)完成后银舱,就會(huì)創(chuàng)建一個(gè)消息循環(huán),這樣運(yùn)行在應(yīng)用程序進(jìn)程中的應(yīng)用程序就可以方便地使用消息循環(huán)機(jī)制了寻馏。

應(yīng)用程序進(jìn)程啟動(dòng)后接著該啟動(dòng)應(yīng)用程序了诚欠,也就是啟動(dòng)根Activity。Activity的啟動(dòng)過程分兩種轰绵,一種是根Activity的啟動(dòng)過程,另一種是普通Activity的啟動(dòng)過程唧垦。根Activity指的是應(yīng)用程序啟動(dòng)的第一個(gè)Activity液样,因此根Activity的啟動(dòng)過程一般情況下也可以理解為應(yīng)用程序的啟動(dòng)過程。普通Activity是指除了應(yīng)用程序啟動(dòng)的第一個(gè)Activity之外的其他Activity坊秸。

??Launcher請(qǐng)求AMS過程

Launcher啟動(dòng)后會(huì)將已安裝的應(yīng)用程序的快捷圖標(biāo)顯示到桌面上澎怒,這些應(yīng)用程序的快捷圖標(biāo)就是啟動(dòng)根Activity的入口,當(dāng)我們點(diǎn)擊某個(gè)應(yīng)用程序的快捷圖標(biāo)時(shí)站超,就會(huì)通過Launcher請(qǐng)求AMS來啟動(dòng)該應(yīng)用程序乖酬。,當(dāng)我們點(diǎn)擊某個(gè)應(yīng)用程序的快捷圖標(biāo)時(shí)算撮,就會(huì)調(diào)用Launcher的startActivitySafely方法。Instrumentation主要來監(jiān)控應(yīng)用程序和系統(tǒng)的交互陷舅,Instrumentation調(diào)用execStartActivity方法最終調(diào)用的是AMS的startActivity方法审洞。

??AMS到ApplicationThread的調(diào)用過程

要在目標(biāo)應(yīng)用程序中啟動(dòng)Activity。當(dāng)前代碼邏輯運(yùn)行在AMS所在的進(jìn)程(SystemServer)中仰剿,通過ApplicationThread來與用于程序進(jìn)程進(jìn)行Binder通信痴晦,換句話說,ApplicationThread是AMS所在進(jìn)程(SystemServer)和應(yīng)用程序進(jìn)程的通信橋梁部凑。

??ActivityThread啟動(dòng)Activity的過程

我們知道當(dāng)前的代碼邏輯運(yùn)行在應(yīng)用程序進(jìn)程中碧浊,ApplicationThread是ActivityThread的內(nèi)部類,它管理者當(dāng)前應(yīng)用程序進(jìn)程的主線程必孤,通過ApplicationThread調(diào)用schedudeLauncherActivity方法啟動(dòng)Activity瑞躺。mH指的是H,它是ActivityThread的內(nèi)部類并繼承Handler赡勘,是應(yīng)用程序進(jìn)程中主線程的消息管理類捞镰。因?yàn)锳pplicationThread是一個(gè)Binder,它的調(diào)用邏輯運(yùn)行在Binder線程池中岸售,所以這些需要用H將代碼的邏輯切換到主線程中凸丸。ActivityThread調(diào)用performLauncherActivity方法啟動(dòng)Activity。方法內(nèi)部創(chuàng)建Application,makeApplication方法內(nèi)部會(huì)調(diào)用Application的onCreate方法屎慢。Activity的attach方法初始化Activity,在attach方法會(huì)創(chuàng)建Window對(duì)象(PhoneWindow)并與Activity自身進(jìn)行關(guān)聯(lián)环肘。調(diào)用Instrumentation的callActiivtyOnCreate方法啟動(dòng)Activity,最終調(diào)用Activity的onCreate方法复哆,講到這里荠商,根Activity就啟動(dòng)了。即應(yīng)用程序就啟動(dòng)了。

?根Activity啟動(dòng)過程中涉及的進(jìn)程

根Activity啟動(dòng)過程會(huì)涉及4個(gè)進(jìn)程饰躲,分別是Zygote進(jìn)程臼隔、Launcher進(jìn)程、AMS所在進(jìn)程(SystemServer)寄狼、應(yīng)用程序進(jìn)程氨淌。首先Launcher進(jìn)程向AMS請(qǐng)求創(chuàng)建根Activity,AMS會(huì)判斷根Activity所需的應(yīng)用程序進(jìn)程是否存在并啟動(dòng)盛正,如果不存在就會(huì)請(qǐng)求Zygote進(jìn)程創(chuàng)建應(yīng)用程序進(jìn)程豪筝。啟動(dòng)應(yīng)用程序進(jìn)程后,AMS會(huì)請(qǐng)求創(chuàng)建應(yīng)用程序進(jìn)程并啟動(dòng)根Activity敲街。普通的Activity啟動(dòng)過程會(huì)涉及2個(gè)進(jìn)程严望,AMS所在進(jìn)程(SystemServer)、應(yīng)用程序進(jìn)程墩蔓。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昏名,隨后出現(xiàn)的幾起案子阵面,更是在濱河造成了極大的恐慌,老刑警劉巖仑扑,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件置鼻,死亡現(xiàn)場(chǎng)離奇詭異箕母,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嘶是,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門聂喇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人克饶,你說我怎么就攤上這事跛十。” “怎么了洲尊?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵奈偏,是天一觀的道長(zhǎng)惊来。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么继准? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任移必,我火速辦了婚禮毡鉴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猪瞬。我一直安慰自己陈瘦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布含潘。 她就那樣靜靜地躺著线婚,像睡著了一般盆均。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上游沿,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天诀黍,我揣著相機(jī)與錄音仗处,去河邊找鬼。 笑死婆誓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的郁轻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼竭沫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜕提!你這毒婦竟也來了替蛉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤它浅,失蹤者是張志新(化名)和其女友劉穎镣煮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镊折,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恨胚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年炎咖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乘盼。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绸栅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粹胯,到底是詐尸還是另有隱情,我是刑警寧澤渊抽,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布懒闷,位于F島的核電站,受9級(jí)特大地震影響愤估,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜由驹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一蔓榄、第九天 我趴在偏房一處隱蔽的房頂上張望默刚。 院中可真熱鬧,春花似錦荤西、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妇萄。三九已至,卻和暖如春嚣伐,著一層夾襖步出監(jiān)牢的瞬間萍丐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壳影,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓根灯,卻偏偏與公主長(zhǎng)得像烙肺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桃笙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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