上一章,我們簡單瞭解了 Jetpack 和 學習了 ViewModel 的基本使用,這章一起來學習一個 Lifecyclers.
在我們的開發中,我們經常需要知道 activity 的生命週期,從而做一些資源釋放或控制邏輯,一般的做法,也是大家常用的做法,就是給activity添加一個 隱形的 fragment,從而感知 activity 的生命週期變化,像 glide 就是這麼做的。
但Lifecycles 組件可以讓任何一個類都能輕鬆感覺到 activity 的生命週期,但卻不用編寫太多邏輯。
一、基本使用
首先,新建一個 MyObserver 類,實現 LifecycleObserver 接口:
class MyObserver : LifecycleObserver {
}
LifecycleObserver 是一個空方法,如果要感覺 activity 的生命週期,則需要添加額外的註解纔行。比如 onResume 和 onPause:
class MyObserver : LifecycleObserver {
private val TAG = "MyOberver"
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume(){
Log.d(TAG,"onResume")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause(){
Log.d(TAG, "onPause: ")
}
}
可以看到,使用了 @OnLifecycleEvent 的註解,並傳入生命週期的事件,共有7中,ON_CREATE,ON_START,ON_RESUME,ON_PAUSE,ON_STOP,ON_DESTROY 對應 activity的7中生命週期。
然後,爲了能監聽 activity 的生命週期,還需要去到activity調用一下它;在 activity 中可以使用 LifecycleOwner ,LifecycleOwner 是單一方法接口,它的實現類是 Lifecycle。它具有一種方法(即 getLifecycle()),該方法必須由類實現。所以,我們的實例如下:
lifecycle.addObserver(MyObserver())
只要的activity 是繼承 AppCompatActivity 或者 fragment 是 androidx 包下的,就能實現 lifecycle 而不用自己去實現一個 LifecycleOwner 。運行一下:
二、獲取當前生命週期狀態
目前來看,已經能夠感覺 activity 的生命週期狀態了,但是有時候,我們需要判斷當前的狀態來實現一些邏輯操作怎麼辦呢?可以拿到 lifecycle 的實例,通過 lifecycle.currentState 來主動獲取生命週期狀態。
class MyObserver(val lifecycle: Lifecycle) : LifecycleObserver {
private val TAG = "MyOberver"
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume(){
Log.d(TAG,"zsr onResume: "+lifecycle.currentState)
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause(){
Log.d(TAG, "zsr onPause: ")
}
}
lifycycle.currentState 返回的是一個枚舉類型,一共有 INITIALIZED,DESTROYED,CREATED,RESUMED 這5種狀態,如下圖:
至此,lifecycle 的簡單實用已經學會了,後面跟着 學習 LiveData 。
參考:
第一行代碼 第三版
官網 LifeCycle