Android开发学习笔记——Jetpack之Lifecycle
概述
Lifecycle与LiveData以及ViewModel相同,都是谷歌推出的Jetpack中的重要一员,Lifecycle是一个生命周期感知组件,用于感知生命周期的变化帮助我们在特定时期处理相关操作。
在开发中,为了处理生命周期,一种常见的模式是在 Activity 和 Fragment 的生命周期方法中实现依赖组件的操作。比如,在一般的MVP模式中,我们通常在Presenter中处理页面逻辑,我们时常会遇到Presenter需要初始化和销毁资源的操作,这时,我们需要在Presenter中创建相关方法,然后在Activity中的onCreate和onDestroy中调用对应方法完成初始化和销毁操作。如下:
class MyPresenter {
fun create(){
// TODO presenter相关初始化操作
}
fun destroy(){
// TODO presenter相关销毁、释放资源等操作
}
}
class LifecycleActivity : AppCompatActivity() {
private var mPresenter : MyPresenter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_lifecycle)
mPresenter = MyPresenter()
mPresenter?.create()
}
override fun onDestroy() {
super.onDestroy()
mPresenter?.destroy()
}
}
当我们或许需要在onStop、onResume等其它相关生命周期中执行相关操作时,我们又需要添加相关方法然后在Activity中调用。当然,我们可以封装相关基类在基类中实现调用,但是,如果还有其它类需要监听生命周期变化呢?又或者需要监听其它组件的生命周期呢?那么我们只能多次进行处理。这种操作本身没有什么问题,但是,这种模式会导致代码条理性很差而且会扩散错误。而通过使用生命周期感知型组件Lifecycle,我们可以将依赖组件的代码从生命周期方法移入组件本身中。
Lifecycle提供了可用于构建生命周期感知型组件的类和接口, 这些组件可以根据 Activity 或 Fragment 的当前生命周期状态自动调整其行为,从而使我们无需在Activity或者使Fragment的生命周期回调方法中处理相关操作。
基本使用
Lifecycle的使用方法很简单,实际上,其实现也是通过观察者模式实现的。因此,我们只需要我们也只需要提供观察者LifecycleObserver和被观察者LifecycleOwner即可。不过通常,当我们生命周期的对象为Activity,其默认实现了LifecycleOwner接口,因此,我们只需要实现LifeObserver即可。Lifecycle的基本使用大致可以分为以下几步:
- 添加Lifecycle的相关依赖;
- 生命周期的拥有者实现LifecycleOwner接口,并且在对应的生命周期回调方法中改变Lifecycle状态;
- 需要监听生命周期变化的观察者,实现LifecycleObserver接口,使用OnLifecycleEvent注解对应监听生命周期变化;
- 调用Lifecycle的addObserve方法注册观察者;
监听Activity或是Fragment的生命周期
对于Activity和Fragment,其默认实现了LifecycleOwner接口,因此,当我们需要简体Activity或是Fragment的生命周期时,我们只需要在相应的类中实现LifecycleObserve或是FullLifecycleObserver即可。如上例中MyPresenter,我们实现LifecycleObserve接口,在其中使用OnLifecycleEvent注解监听生命周期,可以修改如下:
class MyPresenter : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private fun create(){
Log.e("MyPresenter", "create")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
private fun start(){
Log.e("MyPresenter", "start")
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private fun resume(){
Log.e("MyPresenter", "resume")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
private fun pause(){
Log.e("MyPresenter", "pause")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
private fun stop(){
Log.e("MyPresenter", "stop")
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
private fun destroy(){
Log.e("MyPresenter", "destroy")
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
private fun any(){
Log.e("MyPresenter", "any")
}
}
我们修改Activity中的代码,调用addObserver方法添加观察者,运行程序,发现此时Presenter类即可监听到Activity的生命周期变化,这样,我们就不需要在Activity生命周期变化的时候去回调Presenter的方法,而是在Presenter中处理相关操作。
class LifecycleActivity : AppCompatActivity() {
private var mPresenter : MyPresenter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_lifecycle)
mPresenter = MyPresenter()
//添加观察者,观察Activity的生命周期变化
lifecycle.addObserver(mPresenter!!)
Log.e("Activity", "onCreate")