使用方法
class MainLifecycleObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
private fun onAny() {
MLog.i("onAny")
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private fun onCreate() {
MLog.i("onCreate")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
private fun onStart() {
MLog.i("onStart")
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private fun onResume() {
MLog.i("onResume")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
private fun onPause() {
MLog.i("onPause")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
private fun onStop() {
MLog.i("onStop")
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
private fun onDestroy() {
MLog.i("onDestroy")
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycle.addObserver(MainLifecycleObserver())
}
}
当 Activity 的生命周期方法被执行时,就会调用 MainLifecycleObserver 中定义的相关方法。 AppCompatActivity 的父类 ComponentActivity 实现了 LifecycleOwner 接口。 不写了,很简单,看一下就完了。 onCreate 的时候,搞了一个Fragment出来监听生命周期,来分发事件。
原理总结
- ComponentActivity 的 onCraete() 里调用了 ReportFragment.injectIfNeededIn(this);初始化了一个没有界面的 Fragment 来监听生命周期方法。
- 将 event 交给 LifecycleRegistry 去处理所有的观察者。
观察者的方法从何而来? - 在 lifecycle.addObserver() 的时候获取该继承 LifecycleObserver 类中方法的注解(如:@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)),来缓存起来,通过反射的方式调用指定方法。
注:在 Lifecycling.lifecycleEventObserver(observer) 的方法中我们看到在解析注解之前有一个 instanceof FullLifecycleObserver(如果是此类型,则 return,不需要再进行注解获取),这是一个我们常规使用更加方便的接口,定义好了相关的 onCreate、onStart…等等方法,但是发现并不是 public 的,我们需要引入
implementation "androidx.lifecycle:lifecycle-common-java8:2.2.0"
使用它的子类 DefaultLifecycleObserver,重写我们需要的相关方法就好。
|