Activity的啟動流程

前言

??我們在Android開發(fā)中離不開四大組件构蹬,Activity更是重中之重窃诉,只要開發(fā)Android都要與它打交道婴程,都知道它就是一個界面用來顯示各種UI控件序攘,接收用戶輸入并且與用戶交互等等功能穿稳,至于它的啟動方式也是早于爛熟于心存皂,在Manifest.xml里面使用activity標(biāo)簽開申明它,要啟動的話就是用intent去啟動逢艘,以上這些全部都是基于Android系統(tǒng)封裝好旦袋,成為api,所以直接使用即可它改,但是作為一個Android開發(fā)者怎么能去了解里面具體實現(xiàn)呢疤孕,也為了以后更好的開(zhuang)發(fā)(bi)。

??一個Activity的啟動是非常非常復(fù)雜的央拖,里面的代碼可以看到腦袋爆炸祭阀,然后你會發(fā)現(xiàn)看暈了,還是沒看出什么結(jié)果鲜戒,所以我們只要看一些主要的方法和流程专控,只要知道這一步干了什么即可,下面開始進(jìn)入正題遏餐。

Activity的啟動
??首先啟動一個Activity伦腐,當(dāng)然是在Activity里的startActivity方法啦

startActivity.png

startActivity.png
會發(fā)現(xiàn)其實startActivity方法最終調(diào)的是startActivityForResult這個方法,當(dāng)然這個startActivityForResult又是一堆各種不同參數(shù)的方法失都,我們直接就跑到具體的代碼柏蘑,
exec.png
主要就是execStartActivity方法,這個方法是Instrumentation類里面的粹庞,這個類就是用來檢測代碼的辩越,有興趣可以去查下具體作用,具體看下execStartActivity方法
execStartActivity.png
我們還是找重點信粮,看下這個ActivityManagerNative.getDefault().startActivitycheckStartActivityResult黔攒,先說下簡單的checkStartActivityResult
image.png
這里面方法一看就知道了,好熟悉的have you declared this activity in your AndroidManifest.xml?强缘,由此可知這個方法就是判斷Activity各種情況督惰。繼續(xù)說ActivityManagerNative.getDefault().startActivity,這個ActivityManagerNative是一個Binder旅掂,用來遠(yuǎn)程通信的赏胚,這里具體不說了,其實就是遠(yuǎn)程通信告訴ActivityManagerService(AMS)要啟動一個Activity商虐,調(diào)用AMS的startActivity
startActivity.png

一眼就看到最后調(diào)的其實是stackSuoerVisor類的startActivityMayWait觉阅,這個類其實就是運(yùn)行所有ActivityStack的崖疤,這個后面還會說到,這兩個類很關(guān)鍵典勇,最后進(jìn)到這個方法以后劫哼,會發(fā)現(xiàn)一堆代碼,這里我也只是說下startActivityLocked這個主要方法割笙,這個方法就是啟動activity的权烧,至于方法名字為什么加個Locked應(yīng)該是跟這是在synchronized里面有關(guān)吧,繼續(xù)往里面走伤溉,也是一堆代碼般码,各種賦值各種判斷,里面有個很重要的是ActivityRecord被new出來了乱顾,這是個存了Activity所有信息的類板祝,這里也不多說,還是看關(guān)鍵的方法startActivityUncheckedLocked這個方法就是在棧中各種對activity判斷走净,還是看關(guān)鍵方法resumeTopActivitiesLocked這里面就把運(yùn)行這個activity的棧也就是ActivityStack這個類券时,調(diào)用它的resumeTopActivityLocked方法,在這方法中又調(diào)用resumeTopActivityInnerLocked方法温技,使用stackSupervisor(這里又回到了stackSupervisor)的startSpecificActivityLocked方法,這名字也很形象扭粱,開始一個具體的activity舵鳞,在它里面有一個realStartActivity方法也是一堆代碼,主要的就是scheduleLaunchActivity
scheduleLaunchActivity.png
這個thread是IApplicationThread類型的具體的實現(xiàn)是ApplicationThread琢蛤,這是ActivityThread的內(nèi)部類
scheduleLaunchActivity.png
經(jīng)過一頓操作以后蜓堕,調(diào)用了sendMessage(H.LAUNCH_ACTIVITY, r)方法,說白了就是通過ActivityThread中的Handler發(fā)送了一個消息LAUNCH_ACTIVITY給handler處理博其,收到這個消息后調(diào)用了handleLaunchActivity方法
handleLaunchActivity.png
在這個方法里面調(diào)用了performLaunchActivity方法這里面又調(diào)用了Instrumentation類的callActivityOnCreate方法看名字就知道終于一整流程走完了套才,要回調(diào)Activity的onCreate方法了,事實上確實是這樣
callActivityOnCreate.png

performCreate.png

自此Activity啟動流程全部走完慕淡,當(dāng)然還有一個重要的就是PhoneWindow的創(chuàng)建背伴,這個是在performLaunchActivity里面的attach方法創(chuàng)建的,這個下次在說峰髓。

總結(jié)

??具體流程畫了一下傻寂,雖然畫的不太好,但是要啥自行車携兵,嘿嘿


流程.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疾掰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子徐紧,更是在濱河造成了極大的恐慌静檬,老刑警劉巖炭懊,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拂檩,居然都是意外死亡侮腹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門广恢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凯旋,“玉大人,你說我怎么就攤上這事钉迷≈练牵” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵糠聪,是天一觀的道長荒椭。 經(jīng)常有香客問我,道長舰蟆,這世上最難降的妖魔是什么趣惠? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮身害,結(jié)果婚禮上味悄,老公的妹妹穿的比我還像新娘。我一直安慰自己塌鸯,他們只是感情好侍瑟,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丙猬,像睡著了一般涨颜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茧球,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天庭瑰,我揣著相機(jī)與錄音,去河邊找鬼抢埋。 笑死弹灭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的揪垄。 我是一名探鬼主播鲤屡,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼福侈!你這毒婦竟也來了酒来?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤肪凛,失蹤者是張志新(化名)和其女友劉穎堰汉,沒想到半個月后辽社,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡翘鸭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年滴铅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片就乓。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡汉匙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出生蚁,到底是詐尸還是另有隱情噩翠,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布邦投,位于F島的核電站伤锚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏志衣。R本人自食惡果不足惜屯援,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望念脯。 院中可真熱鬧狞洋,春花似錦、人聲如沸绿店。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惯吕。三九已至惕它,卻和暖如春怕午,著一層夾襖步出監(jiān)牢的瞬間废登,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工郁惜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留堡距,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓兆蕉,卻偏偏與公主長得像羽戒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虎韵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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