一、@OnLifecycleEvent注解弃用原因
需要使用代码生成或反射,会造成很大的性能开销。 官方建议使用DefaultLifecycleObserver
或LifecycleEventObserver
来代替。本文使用 DefaultLifecycleObserver
来演示替代,LifecycleEventObserver
用法基本相同
二、DefaultLifecycleObserver
使用方法
DefaultLifecycleObserver
是一个实现了LifecycleObserver
的接口
1、这里我先创建一个MyLifecycleListener类实现DefaultLifecycleObeserver接口,并重写其中的对应于生命周期的方法,实际调用时候的代码逻辑就是写在这里的,比如在onCreate中创建动画,onStart中设置开始动画,onPause中设置停止动画,再比如在onCreate创建地图,onResume中重新绘制加载地图,onPause中暂停对地图的绘制,onDestory中销毁地图,原本应该写在Activity中的生命周期调用方法现在都集中在MyLifecycleListener监听类中,大大减少了Activity的代码量,避免了Activity变得过于臃肿,还能做抽象复用
超赞!
class MyLifecycleListener:DefaultLifecycleObserver { val TAG="MyLifecycleListener" override fun onPause(owner: LifecycleOwner) { super.onPause(owner) Log.e(TAG, "onPause: ") } override fun onStart(owner: LifecycleOwner) { super.onStart(owner) Log.e(TAG, "onStart: ") } override fun onStop(owner: LifecycleOwner) { super.onStop(owner) Log.e(TAG, "onStop: ") } }
创建好了MyLifecycleListener监听类之后,就需要在Activity中做调用 调用是通过LifecycleOwner对象来调用的,调用方式是lifecycleOwner.lifecycle.addObserver(MyLifecycleListener()),那LifecycleOwner是什么呢,如果我们的Activity是继承自AppCompatActivity的,或者使用的Fragment是继承自androidx.fragment.app.Fragment,那它们本身就是一个LifecycleOwner对象,也就不需要我们再自己去创建,AndroidX库自动帮我们完成了
class LifecyclesTestActivity: AppCompatActivity() { lateinit var myLifecycleListener: MyLifecycleListener override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) myLifecycleListener= MyLifecycleListener() //在这里添加观察者之后在Activity中回调生命周期的时候实际调用的就会是 //我们在MyLifecycleListener类中重写的方法,实现逻辑都在MyLifecycleListener类中重写的方法 //这样就减轻了Activity的代码体积 lifecycle.addObserver(myLifecycleListener) } }
三、LifeCycle原理-设计模式之观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己
在上述演示中,lifecycle.addObserver(myLifecycleListener)见名知义也能够看出我们所自定义的MyLifecycleListener类便是观察者,而Activity便是被观察者,被观察者中状态的变化会通知观察者更新状态,所以Activity中生命周期的变化就是借助了观察者模式通知了我们定义的观察者,从而实现在观察者中定义具体逻辑。
注意,观察者完全可以有多个,就像上面提到的使用场景中,我们可以定义有关于创建销毁地图的观察者类,也可以定义关于操作动画的观察者类,还可以定义监听音乐的播放暂停停止的观察者类,这样逻辑上做到了隔离,使各个类的职责分明,也解耦了Activity和业务逻辑代码,而被观察者Activity的变化却能够通知到所有的观察者,所以使用LifeCycle来做与生命周期方法逻辑的实现是很推荐的!
至于LifeCycle对于观察者模式代码层面上的具体实现,本文就不涉及了,有兴趣的小伙伴可以再到网上找找其他博客。
四、LifecycleService组件
拥有生命周期概念的组件,除了Activity和Fragment,还有就是Service,Android提供了一个名为LifecycleService的类,该类继承自Service,并实现LifecycleOwner接口
同时当Service拥有了Lifecycle生命周期后就可以使用LifecycleScope启动协程处理耗时任务。