Android 架構(gòu)組件 (Lifecycle/ViewModel/LiveData) 初識指南

引入:
AndroidX 庫提供了一些架構(gòu)組件,如Lifecycle /ViewModel/Livedata,
初衷應(yīng)該是減少Activity/Fragment的代碼量,以組合的方式添加到Activity/Fragment中。
能夠很方便地感知生命周期的變化(如onCreate/onResume等等),
同時更好地管理數(shù)據(jù)(如轉(zhuǎn)屏保留數(shù)據(jù))。

雖然,我們平時可能接觸不多,可能是因?yàn)檫@個架構(gòu)組件比較新,
而所負(fù)責(zé)的項(xiàng)目是很久就創(chuàng)建的。
但是,現(xiàn)在官方的一些Demo樣例中,經(jīng)常會遇到。
所以,了解這些組件有助于更快地學(xué)習(xí),起到事半功倍的效果。

1. 開發(fā)者官網(wǎng)指南:

https://developer.android.com/topic/libraries/architecture/lifecycle

Lifecycle/ViewModel/LiveData 這幾個關(guān)鍵組件都是在 androidx.lifecycle 包。

題外話關(guān)于AndroidX
(1)AndroidX 庫獨(dú)立于Android SDK,更新迭代更快些。
(2)AndroidX 提供的這些組件,目的是給開發(fā)者提供更加穩(wěn)定、通用的應(yīng)用框架,
開發(fā)者可以把精力和重點(diǎn)放在獨(dú)有的業(yè)務(wù)邏輯上。

2. Lifecycle/ViewModel/LiveData 實(shí)例Demo

官方提供例子,手把手教學(xué),快速接觸這些組件。
https://developer.android.com/codelabs/android-lifecycles?index=..%2F..%2Findex#0

Github源碼:
https://github.com/googlecodelabs/android-lifecycles

3. 升級版實(shí)例 Demo

建議反復(fù)觀看
Lifecycle/ViewModel/LiveData+ Databinding + Room (經(jīng)典,結(jié)合數(shù)據(jù)庫)
https://github.com/android/architecture-components-samples/tree/main/BasicSample

4. 初步總結(jié)

(1) Lifecycle 及其 相關(guān)類.
作用: 抽象類,用于感知Activity/Fragment生命周期。
相當(dāng)于給外界提供一個接口,生命周期由它傳遞 給外界。(外界通過實(shí)現(xiàn)接口回調(diào))
實(shí)現(xiàn): ComponentActivity/Fragment 均實(shí)現(xiàn)LifecycleOwner接口(該接口僅有一個函數(shù) getLifecycle )
相當(dāng)于實(shí)現(xiàn)了Lifecycle。 實(shí)際上它的實(shí)現(xiàn)類是LifecycleRegistry,getLifecycle正是返回這類的實(shí)例。

后續(xù)還寫一個篇 關(guān)于這個組件的 源碼分析.
Android 架構(gòu)組件之 Lifecycle/LifecycleOwner/LifecycleRegistry/LifecycleObserver 源碼學(xué)習(xí)

(2) ViewModel:
作用: 抽象類,準(zhǔn)備及管理Activity/Fragment的數(shù)據(jù)。
創(chuàng)建位置: 在 Activity/Fragment里
生命周期:一直存在Activity/Fragment finised(轉(zhuǎn)屏onDestory沒finish)

(3) LiveData<T> :
作用: 抽象類, 提供可觀察的數(shù)據(jù),在數(shù)據(jù)發(fā)生變化后可以通知到觀察者。
通知數(shù)據(jù)更新的方式: postValue(后臺)/setValue(前臺)
實(shí)現(xiàn)類: MutableLiveData<T>

5. 使用問題記錄:

(1) ViewModel 子類的獲取方式

例如:
mSeekBarViewModel = new ViewModelProvider(requireActivity()).get(SeekBarViewModel.class);
這里是在Fragment 里面的,需要兩個Fragment 同步數(shù)據(jù)的話(在同一個Activity上顯示),必須傳遞ower 為activity 非this(fragment)

(2) ViewModel 使用 SavedStateHandle 保存持久性數(shù)據(jù)

SavedStateHandle內(nèi)部封裝了 LiveData
-- 實(shí)測設(shè)備,在adb kill / forc-stop app 或者 最近任務(wù)關(guān)閉應(yīng)用后,再次進(jìn)入并沒有恢復(fù)數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容