第9章 四大組件的工作過程

9.2 Activity的工作過程
啟動一個activity导盅,顯示狀態(tài)下洋侨,可以用過startActivity(new Intent(this,TextActivity.class))
startActivity方法有好幾種重載的方法指厌,但是他們最終會調(diào)用startActivityForResult方法岖妄。在這個方法中調(diào)用了Instrumentation的execStartActivity.在這個方法中鹉勒,ActivityManagerNative.getDefault().startActivity方法實現(xiàn)迹栓。ActivityManagerService繼承自ActivityManagerNative,而ActivityManagerNative繼承自Binder并實現(xiàn)了IActivitymanager這個Binder接口僧免。ActivityManagerNative具體實現(xiàn)是ActivityManagerService(AMS)刑赶。 在ActivityManagerNative中,AMS這個Binder對象采用單例模式對外提供懂衩,Singleton是一個單例的封裝類撞叨。第一次調(diào)用他的get方法他會通過create方法來初始化AMS這個Binder對象。在后續(xù)的調(diào)用中則直接返回之前創(chuàng)建的對象浊洞。AMS中srtartActivity調(diào)用的ActivityStackSupervisor.startActivityMayWait方法牵敷,在startActivityMayWait中調(diào)用了startActivityLocked,然后在startActivityLocked有調(diào)用了startActivityUncheckedLocked法希,接著startActivityUnckeckLocked有調(diào)用了ActivityStack的resumeTopActivityLocked枷餐,resumeTopActivityLocked調(diào)用了ResumeTopActivityInnnerLocked。resumeTopActivityInnerLocked方法又調(diào)用了ActivityStackSupervistor的startSpecificActivityLocked方法苫亦。startSpecificActivityLocked方法調(diào)用了realStartActivityLocked毛肋。在ActivityStackSuporvistor中調(diào)用了app.thread.scheduleLauchActivity() 其中app.thread的類型為IApplicationThread。IApplicationThread實現(xiàn)者是ActivityThread中的內(nèi)部類ApplicationThread屋剑。ApplicationThread繼承了ApplicationThreadNative润匙,而ApplicationThreadNative則繼承了Binder并實現(xiàn)了IApplicationThread類。繞了一大圈Activity的啟動過程最終回到了ApplicationThread中scheduleLaunchActivity來啟動Activity唉匾,在ApplicationThread中schedulelaunchActivity實現(xiàn)很簡單孕讳,就是發(fā)送了一個啟動Activity的消息交由handler處理,這個Handler有一個簡潔的名字H肄鸽,sendMessage的作用就是發(fā)送一個消息給H處理卫病。從Handler H對LAUNCH_ACTIVITY這個方法的處理可以知道,Activity的啟動過程由ActivityThread的handleLaunchActivity方法實現(xiàn)典徘,在方法中調(diào)用了performLaunchactivity方法最終完成了Activity對象的創(chuàng)建和啟動過程,并且ActivityThread通過handleResumeActivity方法來調(diào)用被啟動的Activity的onresume
這一生命周期方法

performLaunchActivity這個方法主要完成了如下幾件事

1.從ActivityClientRecord中獲取待啟動的Activity的組件信息
2.通過Instrumentation的newActivity方法使用類加載器創(chuàng)建Activity類
3.通過LoadedApk的makeApplication方法嘗試創(chuàng)建application對象
4.創(chuàng)建ContextImpl對象并通過Activity的attach方法來完成一些重要數(shù)據(jù)的初始化
5.調(diào)用Activity的oncreate方法

9.3Service工作原理
啟動Service startService(new Intent(this,MyService.class))

Service的啟動過程從ContextWrapper的startService開始益咬。方法中調(diào)用了mBase.startService逮诲。mBase類型是ContextImpl帜平。在ContextImpl的startService中,調(diào)用了startServiceCommon方法梅鹦。而startServceCommon方法又通過ActivitymanagerNative.getDefault().startService這個對象來啟動一個服務(wù)裆甩。方法中調(diào)用了(ActiveServices)mServices.startServiceLocked,此方法中有調(diào)用的startServiceInnnerLocked。此方法又調(diào)用了bringupServiceLocked齐唆,此方法中調(diào)用了realStartServiceLocked嗤栓。此方法中調(diào)用了app.thread的scheduleCreateService方法來創(chuàng)建service對象并調(diào)用其onCreate方法。接著通過sendServiceArgsLocked方法來調(diào)用Service的其他方法箍邮,比如onStartCommand茉帅,這兩個過程均是進(jìn)程間通信。ApplicationThread中對Service啟動過程的處理對應(yīng)他的scheduleCreateService方法锭弊。方法中發(fā)送消息給Handler H來完成堪澎,H接受到這個CREATE_SERVICE消息并通過ActivityThread的handleCreateService方法來完成Service的最終啟動

handleCreateService主要完成了如下幾個方法

1.首先通過類加載器創(chuàng)建Service的實例
2.然后創(chuàng)建Application對象并調(diào)用其onCreate,當(dāng)然Application的創(chuàng)建過程只會有一次
3.接著創(chuàng)建ContextImpl對象并通過Service的attach方法建立二者的關(guān)系
4.最后調(diào)用Service的onCreate方法并將Service方法存儲在ActivityThread中的一個列表中

此外味滞,ActivityThread還會通過handleServiceArgs方法調(diào)用Service的onStartCommand方法

9.4broadcastReceiver的工作過程

動態(tài)注冊過程 ContextWrapper類的registerReciiver 然后是ConextImpl的registerReceiver方法調(diào)用了registerReceiverInternal.然后系統(tǒng)mPackageInfo獲取IIntentReceiver對象樱蛤,然后用跨進(jìn)程的方式向AMS發(fā)送廣播的注冊請求。AMS中registerReceiver方法把InnerReceiver對象以及IntentFilter對象存儲起來剑鞍,這樣廣播就注冊完成了昨凡。

廣播的發(fā)送和接受
首先ContextWrapper的sendBroadcaset方法。然后調(diào)用contextImpl的sendBroadCast蚁署,向AMS調(diào)用broadcastIntent便脊。然后調(diào)用broadcastintentLocked方法在方法內(nèi)部根據(jù)intent- filter查找匹配的廣播接受者,將滿足條件的接受者添加到broadcastqueue形用。

9.5ContentProvider的工作過程

應(yīng)用啟動的時候就轧,入口方法為ActivityThread的main方法,main是一個靜態(tài)方法田度,在main方法中會創(chuàng)建ActivityThread的實例并創(chuàng)建主線程的消息隊列
然后在activityThread的attach方法中遠(yuǎn)程調(diào)用AMS的attachApplication方法并將ApplicationThread對象提供給AMS妒御。他主要作用于ActivityThread和AMS之間的通信。在AMS的attachApplication中會調(diào)用ApplicationThread的bindApplication方法镇饺。bindApplication會經(jīng)過ActivityThread中的mH handler切換到ActivityThread中去乎莉,具體方法是handleBinderApplication。在方法中ActivityThread會創(chuàng)建Application對象并加載ContentProvider

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奸笤,一起剝皮案震驚了整個濱河市惋啃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌监右,老刑警劉巖边灭,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異健盒,居然都是意外死亡绒瘦,警方通過查閱死者的電腦和手機(jī)称簿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惰帽,“玉大人憨降,你說我怎么就攤上這事「眯铮” “怎么了授药?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呜魄。 經(jīng)常有香客問我悔叽,道長,這世上最難降的妖魔是什么耕赘? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任骄蝇,我火速辦了婚禮,結(jié)果婚禮上操骡,老公的妹妹穿的比我還像新娘九火。我一直安慰自己,他們只是感情好册招,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布岔激。 她就那樣靜靜地躺著,像睡著了一般是掰。 火紅的嫁衣襯著肌膚如雪虑鼎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天键痛,我揣著相機(jī)與錄音炫彩,去河邊找鬼。 笑死絮短,一個胖子當(dāng)著我的面吹牛江兢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播丁频,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼杉允,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了席里?” 一聲冷哼從身側(cè)響起叔磷,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奖磁,沒想到半個月后改基,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡咖为,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年寥裂,在試婚紗的時候發(fā)現(xiàn)自己被綠了嵌洼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片案疲。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡封恰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出褐啡,到底是詐尸還是另有隱情诺舔,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布备畦,位于F島的核電站低飒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏懂盐。R本人自食惡果不足惜褥赊,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莉恼。 院中可真熱鬧拌喉,春花似錦、人聲如沸俐银。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捶惜。三九已至田藐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吱七,已是汗流浹背汽久。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留踊餐,地道東北人景醇。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像市袖,于是被迫代替她去往敵國和親啡直。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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