Android Architecture Components 源碼分析

Android Architecture Components 源碼分析

本文已授權(quán)我就是馬云飛公眾號(hào)獨(dú)家發(fā)布。

說(shuō)是源碼分析有點(diǎn)岖食,其實(shí)就是簡(jiǎn)單的根據(jù)源碼梳理一遍整體的LiveData,ViewModel和Lifecycle各個(gè)部分是如何工作的,由于本人水平有限,如果文中有錯(cuò)誤的地方,歡迎指正斩箫。

Android Architecture Components 源碼分析系列文章

  1. Android Architecture Components 第一篇,介紹生命周期的感知撵儿。
  2. Android Architecture Components 第二篇乘客,介紹ViewModel的控制。
  3. Android Architecture Components 第三篇淀歇,介紹LiveDate和LifeRegistry的協(xié)同操作易核。

最近這幾天一直在研究官方的MVVM的實(shí)現(xiàn),使用起來(lái)其實(shí)難度并不大浪默,并且如果結(jié)合DataBinding和Dagger2 代碼寫的都要飛起來(lái)了牡直,不要太好缀匕。不過(guò)我們不能僅僅停留在使用的層面上,了解每個(gè)部分是如何工作的碰逸,探索官方的實(shí)現(xiàn)方式乡小,這樣技術(shù)才能進(jìn)步,看源碼的過(guò)程中我們可以帶著幾個(gè)問(wèn)題去探索:

  1. Lifecycle是如何感知到Activity/Fragment的生命周期的饵史?
  2. ViewModel的生命周期是如何控制满钟。
  3. LiveData中的數(shù)據(jù)是如何根據(jù)Lifecycle生命周期進(jìn)行通知的?

預(yù)計(jì)會(huì)寫三篇文章胳喷,分別介紹上面的技術(shù)關(guān)鍵點(diǎn)湃番,首先先來(lái)介紹Lifecycle是如何感知Activity/Fragment生命周期的。

MVP時(shí)代感知生命周期的做法

眾所周知厌蔽,在使用MVP的時(shí)候牵辣,需要關(guān)聯(lián)View的生命周期,在那個(gè)時(shí)候奴饮,生命周期的控制經(jīng)歷了幾個(gè)階段,從最開始官方Demo中的attach和detach择浊,通過(guò)Activity或者Fragment中生命周期函數(shù)去關(guān)聯(lián)Presenter戴卜,之后又有判斷View是否是Active的來(lái)決定是否去更新UI,這都是通過(guò)簡(jiǎn)單的代碼控制Presenter中更新UI的動(dòng)作是否執(zhí)行琢岩。再后來(lái)就是RxLifecycle投剥,也是因?yàn)镽etrofit和RxJava的興起,我們可以將Presenter中的動(dòng)作變成一個(gè)流事件担孔,這樣可以根據(jù)RxJava的特性通過(guò)解除訂閱的方式來(lái)控制Presenter中的更新UI的動(dòng)作江锨。這又會(huì)分為兩種,根據(jù)RxJava的版本不同糕篇,RxJava1和RxJava2的解除訂閱的方式不一樣啄育。當(dāng)然每個(gè)寫MVP的童鞋都會(huì)有自己的生命周期控制的方式,不過(guò)個(gè)人覺(jué)得還是通過(guò)RxLifecycle的方式會(huì)更好一些拌消,因?yàn)榭梢约?xì)微控制到每一個(gè)生命周期函數(shù)挑豌,更進(jìn)一步的,組里的一個(gè)童鞋參考RxLifecycle的方式加進(jìn)去了一些其他的生命周期墩崩,比如Dialog的顯示和消失氓英,當(dāng)Dialog消失的時(shí)候取消訂閱,這都是我們可以細(xì)琉谐铮化去控制的铝阐,那么在新的MVVM中的生命周期的控制是如何實(shí)現(xiàn)的呢?

MVVM時(shí)代感知生命周期的做法

其實(shí)在官方的MVVM沒(méi)有出現(xiàn)之前铐拐,相信肯定會(huì)有民間大神自己實(shí)現(xiàn)了的MVVM徘键,雖然我沒(méi)有找到相關(guān)的發(fā)表的文章练对,不過(guò)我看見過(guò)通過(guò)自己編寫代碼實(shí)現(xiàn)的MVVM,簡(jiǎn)單來(lái)說(shuō)就是有一個(gè)MVVMViewModel接口啊鸭,里面包含了所有的生命周期回調(diào)的方法锹淌,然后在Activity/Fragment的各個(gè)生命周期函數(shù)中調(diào)用。這樣就實(shí)現(xiàn)了生命周期的傳遞赠制,當(dāng)然了這只是簡(jiǎn)單的介紹能夠?qū)崿F(xiàn)MVVM的其中一種方式赂摆,通過(guò)函數(shù)的傳遞性來(lái)控制生命周期。接下來(lái)就是本文的重點(diǎn)了钟些, 官方的MVVM是如何實(shí)現(xiàn)的生命周期控制的那烟号?

官方MVVM感知生命周期的做法

首先如果從我們自己寫的MVVM的代碼中是找不到生命周期控制的部分的。昨天偶然間看到了使用ContentProvider初始化你的ibrary 政恍,作者說(shuō)到的ContentProvider初始化汪拥,然后看了一眼編譯過(guò)的apk

果然多了一個(gè)ContentProvider,其實(shí)生命周期的控制就是通過(guò)這個(gè)Provider來(lái)實(shí)現(xiàn)的篙耗。

可以看到迫筑,第一個(gè)LifecycleDispatcher.init()就是初始化生命周期控制的方法。下面的那個(gè)是整個(gè)項(xiàng)目的LifecycleOwner,暫時(shí)不去研究它宗弯。
接下來(lái)看初始化的時(shí)候都做了什么脯燃?

通過(guò)一個(gè)AtomicBoolean來(lái)控制初始化一次,之后就獲取ApplicationContext并設(shè)置ActivityLifecycleCallback回調(diào)蒙保。這個(gè)函數(shù)其實(shí)在之前我們就使用過(guò)辕棚,比如退出app啊,或者是一些簡(jiǎn)單的打點(diǎn)操作的時(shí)候會(huì)使用邓厕。接下來(lái)看看DispatcherActivityCallback是什么逝嚎?

構(gòu)造函數(shù)創(chuàng)建了一個(gè)FragmentCallback,用于設(shè)置Fragment生命周期的回調(diào)详恼,然后在onActivityCreated的時(shí)候注入了一個(gè)ReportFragment到當(dāng)前的Activity补君。看一下Reporefragment是做什么用的单雾。

首先將這個(gè)Fragment添加到當(dāng)前的Activity中赚哗,這樣這個(gè)Fragment就擁有和Activity一樣的生命周期,之后在當(dāng)前Fragment的生命周期函數(shù)中通過(guò)dispatch對(duì)應(yīng)的Lifecycle.Event硅堆,把當(dāng)前的生命周期分發(fā)到對(duì)應(yīng)的LifecycleOwner中屿储。

通過(guò)給Activity/Fragment添加額外的fragment,來(lái)獲取當(dāng)前的Activity/Fragment的生命周期的這種方式渐逃,在之后同樣會(huì)遇到够掠,是一種很巧妙的方式解決了生命周期的監(jiān)聽。在ReportFragmt中還看到了mProcessListener這個(gè)對(duì)象是用于控制整個(gè)項(xiàng)目的生命周期的茄菊。有興趣的同學(xué)可以仔細(xì)看一下疯潭,并不難赊堪。

這是Activity的生命周期傳遞,同樣的Fragment跟Activity并無(wú)區(qū)別竖哩,代碼都在LifecycleDispatcher中哭廉。

總結(jié)

通過(guò)添加額外的fragment的形式來(lái)獲取當(dāng)前的Activity/Fragment的生命周期。然后判斷當(dāng)前的Activity/Fragment是否是LifecycleRegistryOwner,如果是的話相叁,那么就分發(fā)當(dāng)前的生命周期事件到當(dāng)前的Owner中遵绰,這樣就實(shí)現(xiàn)了生命周期傳遞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末增淹,一起剝皮案震驚了整個(gè)濱河市椿访,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌虑润,老刑警劉巖成玫,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拳喻,居然都是意外死亡哭当,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門冗澈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)荣病,“玉大人,你說(shuō)我怎么就攤上這事渗柿。” “怎么了脖岛?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵朵栖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我柴梆,道長(zhǎng)陨溅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任绍在,我火速辦了婚禮门扇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘偿渡。我一直安慰自己臼寄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布溜宽。 她就那樣靜靜地躺著吉拳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪适揉。 梳的紋絲不亂的頭發(fā)上留攒,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天煤惩,我揣著相機(jī)與錄音,去河邊找鬼炼邀。 笑死魄揉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拭宁。 我是一名探鬼主播洛退,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼红淡!你這毒婦竟也來(lái)了不狮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤在旱,失蹤者是張志新(化名)和其女友劉穎摇零,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桶蝎,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驻仅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了登渣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片噪服。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胜茧,靈堂內(nèi)的尸體忽然破棺而出粘优,到底是詐尸還是另有隱情,我是刑警寧澤呻顽,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布雹顺,位于F島的核電站,受9級(jí)特大地震影響廊遍,放射性物質(zhì)發(fā)生泄漏嬉愧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一喉前、第九天 我趴在偏房一處隱蔽的房頂上張望没酣。 院中可真熱鬧,春花似錦卵迂、人聲如沸裕便。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闪金。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哎垦,已是汗流浹背囱嫩。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漏设,地道東北人墨闲。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像郑口,于是被迫代替她去往敵國(guó)和親鸳碧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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