初探Jetpack(一) – ViewModel
上一章,我们简单了解了 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