Android Architecture Components 源碼分析

Android Architecture Components 源碼分析

本文已授權我就是馬云飛公眾號獨家發布。

說是源碼分析有點,其實就是簡單的根據源碼梳理一遍整體的LiveData,ViewModel和Lifecycle各個部分是如何工作的,由于本人水平有限,如果文中有錯誤的地方,歡迎指正。

Android Architecture Components 源碼分析系列文章

  1. Android Architecture Components 第一篇,介紹生命周期的感知。
  2. Android Architecture Components 第二篇,介紹ViewModel的控制。
  3. Android Architecture Components 第三篇,介紹LiveDate和LifeRegistry的協同操作。

最近這幾天一直在研究官方的MVVM的實現,使用起來其實難度并不大,并且如果結合DataBinding和Dagger2 代碼寫的都要飛起來了,不要太好。不過我們不能僅僅停留在使用的層面上,了解每個部分是如何工作的,探索官方的實現方式,這樣技術才能進步,看源碼的過程中我們可以帶著幾個問題去探索:

  1. Lifecycle是如何感知到Activity/Fragment的生命周期的?
  2. ViewModel的生命周期是如何控制。
  3. 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中,這樣就實現了生命周期傳遞。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容