Android Architecture Components 源碼分析
本文已授權我就是馬云飛公眾號獨家發布。
說是源碼分析有點,其實就是簡單的根據源碼梳理一遍整體的LiveData,ViewModel和Lifecycle各個部分是如何工作的,由于本人水平有限,如果文中有錯誤的地方,歡迎指正。
Android Architecture Components 源碼分析系列文章
- Android Architecture Components 第一篇,介紹生命周期的感知。
- Android Architecture Components 第二篇,介紹ViewModel的控制。
- Android Architecture Components 第三篇,介紹LiveDate和LifeRegistry的協同操作。
最近這幾天一直在研究官方的MVVM的實現,使用起來其實難度并不大,并且如果結合DataBinding和Dagger2 代碼寫的都要飛起來了,不要太好。不過我們不能僅僅停留在使用的層面上,了解每個部分是如何工作的,探索官方的實現方式,這樣技術才能進步,看源碼的過程中我們可以帶著幾個問題去探索:
- Lifecycle是如何感知到Activity/Fragment的生命周期的?
- ViewModel的生命周期是如何控制。
- LiveData中的數據是如何根據Lifecycle生命周期進行通知的?
預計會寫三篇文章,分別介紹上面的技術關鍵點,首先先來介紹Lifecycle是如何感知Activity/Fragment生命周期的。
MVP時代感知生命周期的做法
眾所周知,在使用MVP的時候,需要關聯View的生命周期,在那個時候,生命周期的控制經歷了幾個階段,從最開始官方Demo中的attach和detach,通過Activity或者Fragment中生命周期函數去關聯Presenter,之后又有判斷View是否是Active的來決定是否去更新UI,這都是通過簡單的代碼控制Presenter中更新UI的動作是否執行。再后來就是RxLifecycle,也是因為Retrofit和RxJava的興起,我們可以將Presenter中的動作變成一個流事件,這樣可以根據RxJava的特性通過解除訂閱的方式來控制Presenter中的更新UI的動作。這又會分為兩種,根據RxJava的版本不同,RxJava1和RxJava2的解除訂閱的方式不一樣。當然每個寫MVP的童鞋都會有自己的生命周期控制的方式,不過個人覺得還是通過RxLifecycle的方式會更好一些,因為可以細微控制到每一個生命周期函數,更進一步的,組里的一個童鞋參考RxLifecycle的方式加進去了一些其他的生命周期,比如Dialog的顯示和消失,當Dialog消失的時候取消訂閱,這都是我們可以細粒化去控制的,那么在新的MVVM中的生命周期的控制是如何實現的呢?
MVVM時代感知生命周期的做法
其實在官方的MVVM沒有出現之前,相信肯定會有民間大神自己實現了的MVVM,雖然我沒有找到相關的發表的文章,不過我看見過通過自己編寫代碼實現的MVVM,簡單來說就是有一個MVVMViewModel接口,里面包含了所有的生命周期回調的方法,然后在Activity/Fragment的各個生命周期函數中調用。這樣就實現了生命周期的傳遞,當然了這只是簡單的介紹能夠實現MVVM的其中一種方式,通過函數的傳遞性來控制生命周期。接下來就是本文的重點了, 官方的MVVM是如何實現的生命周期控制的那?
官方MVVM感知生命周期的做法
首先如果從我們自己寫的MVVM的代碼中是找不到生命周期控制的部分的。昨天偶然間看到了使用ContentProvider初始化你的ibrary ,作者說到的ContentProvider初始化,然后看了一眼編譯過的apk
果然多了一個ContentProvider,其實生命周期的控制就是通過這個Provider來實現的。
可以看到,第一個LifecycleDispatcher.init()就是初始化生命周期控制的方法。下面的那個是整個項目的LifecycleOwner,暫時不去研究它。
接下來看初始化的時候都做了什么?
通過一個AtomicBoolean來控制初始化一次,之后就獲取ApplicationContext并設置ActivityLifecycleCallback回調。這個函數其實在之前我們就使用過,比如退出app啊,或者是一些簡單的打點操作的時候會使用。接下來看看DispatcherActivityCallback是什么?
構造函數創建了一個FragmentCallback,用于設置Fragment生命周期的回調,然后在onActivityCreated的時候注入了一個ReportFragment到當前的Activity。看一下Reporefragment是做什么用的。
首先將這個Fragment添加到當前的Activity中,這樣這個Fragment就擁有和Activity一樣的生命周期,之后在當前Fragment的生命周期函數中通過dispatch對應的Lifecycle.Event,把當前的生命周期分發到對應的LifecycleOwner中。
通過給Activity/Fragment添加額外的fragment,來獲取當前的Activity/Fragment的生命周期的這種方式,在之后同樣會遇到,是一種很巧妙的方式解決了生命周期的監聽。在ReportFragmt中還看到了mProcessListener這個對象是用于控制整個項目的生命周期的。有興趣的同學可以仔細看一下,并不難。
這是Activity的生命周期傳遞,同樣的Fragment跟Activity并無區別,代碼都在LifecycleDispatcher中。
總結
通過添加額外的fragment的形式來獲取當前的Activity/Fragment的生命周期。然后判斷當前的Activity/Fragment是否是LifecycleRegistryOwner,如果是的話,那么就分發當前的生命周期事件到當前的Owner中,這樣就實現了生命周期傳遞。