第9章 四大組件的工作過(guò)程

9.1 四大組件的運(yùn)行狀態(tài)

  1. Activity用于向用戶(hù)展示界面,可由顯式或者隱式Intent來(lái)啟動(dòng)裂问。
  2. Service用于在后臺(tái)執(zhí)行計(jì)算任務(wù)侧啼,運(yùn)行在主線程中的,耗時(shí)的后臺(tái)計(jì)算仍然需要在單獨(dú)的線程中去完成堪簿。Service組件有兩種狀態(tài):
    1. 啟動(dòng)狀態(tài):不可與外界通信(當(dāng)然有可以通過(guò)廣播發(fā)送Intent)
    2. 綁定狀態(tài)痊乾。外界可以很方便的和service進(jìn)行通信
  3. BroadcastReceiver是一種消息型組件,用于在不同的組件乃至不同的應(yīng)用之間傳遞消息椭更,它工作在系統(tǒng)內(nèi)部哪审。廣播有兩種注冊(cè)方式:
    1. 靜態(tài)注冊(cè): AndroidManifest中注冊(cè),在應(yīng)用安裝的時(shí)候會(huì)被系統(tǒng)解析虑瀑,這種廣播不需要應(yīng)用啟動(dòng)就可以收到相應(yīng)的廣播湿滓。
    2. 動(dòng)態(tài)注冊(cè)。動(dòng)態(tài)注冊(cè)需要通過(guò)Context.registerReceiver()來(lái)注冊(cè)舌狗,這種廣播需要應(yīng)用啟動(dòng)才能注冊(cè)并接收廣播叽奥。
  4. ContentProvider用于向其他組件乃至其他應(yīng)用共享數(shù)據(jù)。ContentProvider中的insert痛侍、delete朝氓、update、query方法需要處理好線程同步,因?yàn)檫@幾個(gè)方法是在Binder線程池中被調(diào)用的

9.2 Activity的工作過(guò)程

  1. Activity啟動(dòng)的大致流程(從前一個(gè)Activity中的startActivity到新的Activity即將建立)


  2. ApplicationThread是ActivityThread的一個(gè)內(nèi)部類(lèi)赵哲,它繼承自ApplicationThreadNative待德,而ApplicationThreadNative繼承自Binder并實(shí)現(xiàn)了IApplicationThread接口,ApplicationThreadNative的作用其實(shí)就和系統(tǒng)為AIDL文件生成的類(lèi)是一樣的枫夺。
  3. ActivityManagerService(AMS)繼承自ActivityManagerNative将宪,而ActivityManagerNative繼承自Binder并實(shí)現(xiàn)了IActivityManager這個(gè)Binder接口,因此AMS也是一個(gè)Binder筷屡。
  4. 一個(gè)應(yīng)用只有一個(gè)Application對(duì)象涧偷,它的創(chuàng)建也是通過(guò)Instrumentation來(lái)完成的,這個(gè)過(guò)程和Activity對(duì)象的創(chuàng)建過(guò)程一樣毙死,都是通過(guò)類(lèi)加載器來(lái)實(shí)現(xiàn)的燎潮。
  5. 在performLaunchActivity這個(gè)方法中,完成了5件事情
    1. 獲取待啟動(dòng)的Activity
    2. Instrumentation.newActivity()
    3. makeApplication
    4. 創(chuàng)建ContextImpl對(duì)象并通過(guò)Activity的attach方法完成重要數(shù)據(jù)初始化扼倘。attach方法中确封,Activity還會(huì)完成Window的創(chuàng)建并建立自己和Window的關(guān)聯(lián)。
    5. 調(diào)用Activity的onCreate方法

總結(jié):
AMS是system_server提供的一個(gè)管理四大組件的重要服務(wù)再菊,StartActivity是一個(gè)典型的Binder請(qǐng)求過(guò)程爪喘,ActivityThread是一個(gè)應(yīng)用進(jìn)程的主線程。

  1. Activity對(duì)象作為客戶(hù)端通過(guò)ActivityManagerNative向system_server的AMS發(fā)起startActvity的Binder請(qǐng)求
  2. 服務(wù)端的AMS調(diào)用一系列的方法(主要Activity棧的操作纠拔,詳細(xì)的邏輯也和LauncherMode有關(guān))秉剑,然后通過(guò)客戶(hù)端(ActivityThread)的Binder——ApplicationThread,讓ActivityThread作出performLaunchActivity的操作
  3. ActivityThread->AMS->ActivityThread稠诲。如果startActivity的目標(biāo)是進(jìn)程內(nèi)侦鹏,則前后的ActivityThread是同一個(gè);如果startActvity的目標(biāo)是進(jìn)程外臀叙,則前后的ActvityThread是不同的略水。

9.3 Service的工作過(guò)程

  1. startServie


  2. bindServie


  3. 同Activity,startService/bindService也是一個(gè)ActivityThread->AMS->ActivityThread的Binder過(guò)程

9.4 BroadcastReceiver的工作過(guò)程

  1. BroadcastReceiver的工作過(guò)程包括廣播注冊(cè)過(guò)程劝萤、廣播發(fā)送和接收過(guò)程渊涝。
  2. 注冊(cè)過(guò)程
    1. 動(dòng)態(tài)注冊(cè)



      動(dòng)態(tài)注冊(cè)的原理是將Receiver打包成可傳輸?shù)腎IntentReceiver,跨進(jìn)程向AMS發(fā)送注冊(cè)請(qǐng)求床嫌,然后AMS中保存(InnerReceiver和filter)下來(lái)即可跨释。

    2. 靜態(tài)注冊(cè)
      四大組件在應(yīng)用安裝是會(huì)由PMS解析并注冊(cè),靜態(tài)注冊(cè)的廣播也是這時(shí)候注冊(cè)的厌处。
  3. 發(fā)送和接收過(guò)程


  4. 廣播的發(fā)送有幾種類(lèi)型:
    1. 普通廣播
    2. 有序廣播:按優(yōu)先級(jí)的不同煤傍,優(yōu)先Receiver可對(duì)數(shù)據(jù)進(jìn)行處理,并傳給下一個(gè)Receiver嘱蛋。
  5. 5.0后蚯姆,默認(rèn)情況下廣播不會(huì)發(fā)送給已經(jīng)停止的應(yīng)用

9.5 ContentProvider的工作過(guò)程

  1. ContentProvider的啟動(dòng)過(guò)程伴隨著Application的啟動(dòng)過(guò)程:
    1. 當(dāng)一個(gè)應(yīng)用啟動(dòng)時(shí)五续,入口方法是ActivityThread的main方法,其中創(chuàng)建ActivityThread的實(shí)例并創(chuàng)建主線程的消息隊(duì)列龄恋;
    2. ActivityThread的attach方法中會(huì)遠(yuǎn)程調(diào)用ActivityManagerService的attachApplication疙驾,并將ApplicationThread提供給AMS,ApplicationThread主要用于ActivityThread和AMS之間的通信郭毕;
    3. ActivityManagerService的attachApplication會(huì)調(diào)用ApplicationThread的bindApplication方法它碎,這個(gè)方法會(huì)通過(guò)H切換到ActivityThread中去執(zhí)行,即調(diào)用handleBindApplication方法显押;
      4.handleBindApplication方法會(huì)創(chuàng)建Application對(duì)象并加載ContentProvider扳肛,注意是先加載ContentProvider,然后調(diào)用Application的onCreate方法乘碑。
  2. ContentProvider的android:multiprocess屬性決定它是否是單實(shí)例挖息,默認(rèn)值是false,也就是默認(rèn)是單實(shí)例兽肤。當(dāng)設(shè)置為true時(shí)套腹,每個(gè)調(diào)用者的進(jìn)程中都存在一個(gè)ContentProvider對(duì)象。
  3. 當(dāng)調(diào)用ContentProvider的insert资铡、delete电禀、update、query方法中的任何一個(gè)時(shí)笤休,如果ContentProvider所在的進(jìn)程沒(méi)有啟動(dòng)的話(huà)尖飞,那么就會(huì)觸發(fā)ContentProvider的創(chuàng)建,并伴隨著ContentProvider所在進(jìn)程的啟動(dòng)店雅。
  4. ContentProvider query的流程


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末政基,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子底洗,更是在濱河造成了極大的恐慌腋么,老刑警劉巖咕娄,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亥揖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡圣勒,警方通過(guò)查閱死者的電腦和手機(jī)费变,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)圣贸,“玉大人挚歧,你說(shuō)我怎么就攤上這事∮蹙” “怎么了滑负?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵在张,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我矮慕,道長(zhǎng)帮匾,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任痴鳄,我火速辦了婚禮瘟斜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痪寻。我一直安慰自己螺句,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布橡类。 她就那樣靜靜地躺著蛇尚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猫态。 梳的紋絲不亂的頭發(fā)上佣蓉,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音亲雪,去河邊找鬼勇凭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛义辕,可吹牛的內(nèi)容都是我干的虾标。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灌砖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼璧函!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起基显,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蘸吓,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后撩幽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體库继,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年窜醉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宪萄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡榨惰,死狀恐怖拜英,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情琅催,我是刑警寧澤居凶,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布虫给,位于F島的核電站,受9級(jí)特大地震影響侠碧,放射性物質(zhì)發(fā)生泄漏狰右。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一舆床、第九天 我趴在偏房一處隱蔽的房頂上張望棋蚌。 院中可真熱鬧,春花似錦挨队、人聲如沸谷暮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)湿弦。三九已至,卻和暖如春腾夯,著一層夾襖步出監(jiān)牢的瞬間颊埃,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工蝶俱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留班利,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓榨呆,卻偏偏與公主長(zhǎng)得像罗标,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子积蜻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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