天天看點

Architecture -- Lifecycle

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()
  }
}
           

列印結果:

Architecture -- Lifecycle

圖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)
  }
}
           

列印結果:

Architecture -- Lifecycle

圖2.png

6). 元件原理

Architecture -- Lifecycle

原理圖.png

7). 時序圖

Architecture -- Lifecycle

時序圖.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).

代碼下載下傳