Android N 四大組件的工作原理

本文側(cè)重講解android N 系統(tǒng)中四大組件的工作原理,不同系統(tǒng)原理略有差別葫哗。通過分析四大組件的工作流程加深對(duì)Android Framework的理解缔刹,也為插件化開發(fā)打下基礎(chǔ)。

四大組件的工作狀態(tài)

Activity
展示一個(gè)界面并和用戶交互劣针,它扮演的是一個(gè)前臺(tái)界面的角色校镐。

Service
計(jì)算型組件,用于后臺(tái)執(zhí)行一系列計(jì)算任務(wù)捺典,工作在主線程鸟廓,耗時(shí)操作需要另起線程, 分為啟動(dòng)狀態(tài)和綁定狀態(tài)襟己。

BroadcastReceiver
消息型組件肝箱,主要用于不同組件或者不同應(yīng)用之間的消息傳遞,它工作在系統(tǒng)內(nèi)部稀蟋,不適合執(zhí)行耗時(shí)操作煌张,操作超過5s,會(huì)出現(xiàn)ANR退客。

ContentProvider
數(shù)據(jù)共享型組件骏融,用于向其他組件或者應(yīng)用共享數(shù)據(jù),主要執(zhí)行CURD操作萌狂。

Activity工作原理

我們啟動(dòng)一個(gè)activity有兩種方法档玻,
第一種(Activity直接啟動(dòng)方式):
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);

第二種(Context啟動(dòng)方式)
Intent intent = new Intent(this, MainActivity.class);
getApplicationContext().startActivity(intent);

不同的啟動(dòng)方式Activity的工作流程有點(diǎn)差別。


Activity UML流程圖

兩種啟動(dòng)都會(huì)調(diào)用到Instrumentation類中的execStartActivity的方法茫藏,系統(tǒng)最終是通過ActivityThread中的performLaunchActivity完成Activity的創(chuàng)建和啟動(dòng)误趴。
performLaunchActivity方法主要完成以下工作:
1、通過ActivityClientRecord對(duì)象獲取啟動(dòng)activity的組件信息
2务傲、通過mInstrumentation對(duì)象的newActivity方法調(diào)用classloader完成activity的創(chuàng)建
3凉当、通過r.packageInfo(LoadedApk 對(duì)象)的makeApplication方法嘗試創(chuàng)建Application對(duì)象
4、創(chuàng)建ContextImpl對(duì)象并調(diào)用Activity的attach方法完成一些數(shù)據(jù)的初始化
5售葡、調(diào)用Activity的onCreate方法

在Activity啟動(dòng)的過程中看杭,App進(jìn)程會(huì)頻繁地與AMS進(jìn)程進(jìn)行通信:

App進(jìn)程會(huì)委托AMS進(jìn)程完成Activity生命周期的管理以及任務(wù)棧的管理;這個(gè)通信過程AMS是Server端挟伙,App進(jìn)程通過持有AMS的client代理IActivityManager完成通信過程楼雹;
AMS進(jìn)程完成生命周期管理以及任務(wù)棧管理后,會(huì)把控制權(quán)交給App進(jìn)程,讓App進(jìn)程完成Activity類對(duì)象的創(chuàng)建贮缅,以及生命周期回調(diào)榨咐;這個(gè)通信過程也是通過Binder完成的,App所在server端的Binder對(duì)象存在于ActivityThread的內(nèi)部類ApplicationThread谴供;AMS所在client通過持有IApplicationThread的代理對(duì)象完成對(duì)于App進(jìn)程的通信块茁。

image.png

Service工作原理

Service有兩種啟動(dòng)方式,startService()和bindService()憔鬼,兩種狀態(tài)可以并存:
startService流程

Service UML流程圖1

bindService流程

Service UML流程圖1

BroadcastReceiver工作原理

BroadcastReceiver的工作過程主要包括廣播的注冊(cè)龟劲、發(fā)送和接收:

動(dòng)態(tài)注冊(cè)過程:

動(dòng)態(tài)注冊(cè)過程

發(fā)送過程


發(fā)送廣播過程

靜態(tài)注冊(cè)是由PackageManagerService(PMS)在應(yīng)用安裝的時(shí)候完成整個(gè)注冊(cè)過程的胃夏,除廣播以外轴或,其他三大組件也都是在應(yīng)用安裝時(shí)由PMS解析并注冊(cè)的。

ContentProvider工作原理

每個(gè)進(jìn)程的入口都是ActivityThead.main()仰禀,App的啟動(dòng)流程如下:

APP啟動(dòng)流程

從源碼中可以看出:
應(yīng)用啟動(dòng)的入口為ActivityThread的main方法照雁,main方法會(huì)創(chuàng)建ActivityThread實(shí)例并創(chuàng)建主線程消息隊(duì)列。
attach方法中遠(yuǎn)程調(diào)用AMS的attachApplication方法答恶,并提供ApplicationThread用于和AMS的通信饺蚊。
attachApplication方法會(huì)通過bindApplication方法和H來調(diào)回ActivityThread的handleBindApplication,這個(gè)方法會(huì)先創(chuàng)建Application悬嗓,再加載ContentProvider污呼,然后才會(huì)回調(diào)Application的onCreate方法。

Query過程

由上圖可以看出包竹,在ContentProvider的啟動(dòng)過程中伴隨著app進(jìn)程的啟動(dòng)燕酷。

ContentProvider的其他CURD操作如insert,delete周瞎,update跟query的流程類似苗缩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市声诸,隨后出現(xiàn)的幾起案子酱讶,更是在濱河造成了極大的恐慌,老刑警劉巖彼乌,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泻肯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡慰照,警方通過查閱死者的電腦和手機(jī)软免,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焚挠,“玉大人膏萧,你說我怎么就攤上這事。” “怎么了榛泛?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵蝌蹂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我曹锨,道長(zhǎng)孤个,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任沛简,我火速辦了婚禮齐鲤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椒楣。我一直安慰自己给郊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布捧灰。 她就那樣靜靜地躺著淆九,像睡著了一般。 火紅的嫁衣襯著肌膚如雪毛俏。 梳的紋絲不亂的頭發(fā)上炭庙,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音煌寇,去河邊找鬼焕蹄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阀溶,可吹牛的內(nèi)容都是我干的腻脏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼淌哟,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼迹卢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起徒仓,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤腐碱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掉弛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體症见,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年殃饿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谋作。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乎芳,死狀恐怖遵蚜,靈堂內(nèi)的尸體忽然破棺而出帖池,到底是詐尸還是另有隱情,我是刑警寧澤吭净,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布睡汹,位于F島的核電站,受9級(jí)特大地震影響寂殉,放射性物質(zhì)發(fā)生泄漏囚巴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一友扰、第九天 我趴在偏房一處隱蔽的房頂上張望彤叉。 院中可真熱鬧,春花似錦村怪、人聲如沸秽浇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兼呵。三九已至兔辅,卻和暖如春腊敲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背维苔。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工碰辅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人介时。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓没宾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親沸柔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子循衰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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