引入:
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ù)