1). 簡介
生命周期感覺元件執行操作以響應另一個元件(例如活動和片段)的生命周期狀态的更改。 這些元件可幫助您生成更易于組織且通常更輕量級的代碼,這些代碼更易于維護。
一種常見的模式是在活動和片段的生命周期方法中實作依賴元件的操作。 但是,這種模式導緻代碼組織不良以及錯誤的增加。 通過使用生命周期感覺元件,您可以将依賴元件的代碼移出生命周期方法并移入元件本身。
2). 依賴
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
// alternatively - just ViewModel
implementation "android.arch.lifecycle:viewmodel:$lifecycle_version" // use -ktx for Kotlin
// alternatively - just LiveData
implementation "android.arch.lifecycle:livedata:$lifecycle_version"
// alternatively - Lifecycles only (no ViewModel or LiveData).
// Support library depends on this lightweight import
implementation "android.arch.lifecycle:runtime:$lifecycle_version"
annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version" // use kapt for Kotlin
// alternately - if using Java8, use the following instead of compiler
implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
// optional - ReactiveStreams support for LiveData
implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"
// optional - Test helpers for LiveData
testImplementation "android.arch.core:core-testing:$lifecycle_version"
3). 解決問題
- 主要解決MVP模式時Activity和Fragment聲明周期問題
4). 原MVP寫法
- Presenter接口
interface IPresenter {
fun onCreate()
fun onStart()
fun onResume()
fun onPause()
fun onStop()
fun onDestroy()
}
- Presenter實作
class CustomPresenter : IPresenter {
companion object {
private val TAG = CustomPresenter::class.java.simpleName
}
override fun onCreate() {
Log.e(TAG, "-- onCreate")
}
override fun onStart() {
Log.e(TAG, "-- onStart")
}
override fun onResume() {
Log.e(TAG, "-- onResume")
}
override fun onPause() {
Log.e(TAG,"-- onPause")
}
override fun onStop() {
Log.e(TAG, "-- onStop")
}
override fun onDestroy() {
Log.e(TAG, "-- onDestroy")
}
}
- Activity代碼
class CustomLifeCycleActivity : AppCompatActivity() {
private lateinit var presenter: IPresenter
companion object {
private val TAG = CustomLifeCycleActivity::class.java.simpleName
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_custom_life_cyclle)
presenter = CustomPresenter()
Log.e(TAG, "-- onCreate")
presenter.onCreate()
}
override fun onStart() {
super.onStart()
Log.e(TAG, "-- onStart")
presenter.onStart()
}
override fun onResume() {
super.onResume()
Log.e(TAG, "-- onResume")
presenter.onResume()
}
override fun onPause() {
super.onPause()
Log.e(TAG, "-- onPause")
presenter.onPause()
}
override fun onStop() {
super.onStop()
Log.e(TAG, "-- onStop")
presenter.onStop()
}
override fun onDestroy() {
super.onDestroy()
Log.e(TAG, "-- onDestroy")
presenter.onDestroy()
}
}
列印結果:
圖1.png
5). Lifecycle寫法
interface IPresenter : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(@NotNull owner: LifecycleOwner)
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy(@NotNull owner: LifecycleOwner)
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
fun onLifecycleChanged(@NotNull owner: LifecycleOwner)
}
class SpecialPresenter : IPresenter {
companion object {
private val TAG = SpecialPresenter::class.java.simpleName
}
override fun onCreate(owner: LifecycleOwner) {
Log.e(TAG, "onCreate")
}
override fun onDestroy(owner: LifecycleOwner) {
Log.e(TAG, "onDestroy")
}
override fun onLifecycleChanged(owner: LifecycleOwner) {
Log.e(TAG, "onLifecycleChanged")
}
}
class SpecialLifeCycleActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_special_life_cycle)
val presenter = SpecialPresenter()
// 添加觀察者
lifecycle.addObserver(presenter)
}
}
列印結果:
圖2.png
6). 元件原理
原理圖.png
7). 時序圖
時序圖.png
8). Event枚舉
public enum Event {
/**
* Constant for onCreate event of the {@link LifecycleOwner}.
*/
ON_CREATE,
/**
* Constant for onStart event of the {@link LifecycleOwner}.
*/
ON_START,
/**
* Constant for onResume event of the {@link LifecycleOwner}.
*/
ON_RESUME,
/**
* Constant for onPause event of the {@link LifecycleOwner}.
*/
ON_PAUSE,
/**
* Constant for onStop event of the {@link LifecycleOwner}.
*/
ON_STOP,
/**
* Constant for onDestroy event of the {@link LifecycleOwner}.
*/
ON_DESTROY,
/**
* An {@link Event Event} constant that can be used to match all events.
*/
ON_ANY
}
9).
原文連結10).
代碼下載下傳