Android Architecture Components 源碼分析
本文已授權(quán)我就是馬云飛公眾號(hào)獨(dú)家發(fā)布。
說(shuō)是源碼分析有點(diǎn)岖食,其實(shí)就是簡(jiǎn)單的根據(jù)源碼梳理一遍整體的LiveData,ViewModel和Lifecycle各個(gè)部分是如何工作的,由于本人水平有限,如果文中有錯(cuò)誤的地方,歡迎指正斩箫。
Android Architecture Components 源碼分析系列文章
- Android Architecture Components 第一篇,介紹生命周期的感知撵儿。
- Android Architecture Components 第二篇乘客,介紹ViewModel的控制。
- 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)題去探索:
- Lifecycle是如何感知到Activity/Fragment的生命周期的饵史?
- ViewModel的生命周期是如何控制满钟。
- 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)了生命周期傳遞。