Lifecycle可以将一个类或组件变成生命周期感知型的,并且可执行相应操作来响应另一个组件(如 activity 和 fragment)的生命周期状态的变化。Lifecycle使得代码更有条理性、精简、易于维护。
Lifecycle中的两个角色:
1. LifecycleOwner: 生命周期拥有者,如Activity/Fragment等类都实现了该接口并通过getLifecycle()获得Lifecycle,进而可通过addObserver()添加观察者。
2. LifecycleObserver: 生命周期观察者,实现该接口后就可以添加到Lifecycle中,从而在被观察者类生命周期发生改变时能马上收到通知。
实现LifecycleOwner的生命周期拥有者可与实现LifecycleObserver的观察者完美配合。
open class MyLifeCycleObserver : LifecycleObserver { @OnLifecycleEvent(value = Lifecycle.Event.ON_START) fun connect(owner: LifecycleOwner) { Log.e(JConsts.LIFE_TAG, "Lifecycle.Event.ON_CREATE:connect") } @OnLifecycleEvent(value = Lifecycle.Event.ON_STOP) fun disConnect() { Log.e(JConsts.LIFE_TAG, "Lifecycle.Event.ON_DESTROY:disConnect") }}//Activity中class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //添加LifecycleObserver观察者 lifecycle.addObserver(MyLifeCycleObserver()) }}
以上就是老的使用方式了,现在已经不推荐使用,@OnLifecycleEvent 注解方式也标记为@Deprecated 了,执行结果很简单就不再贴出来了,有兴趣的可以看开头的文章介绍。另外自定义 LifecycleOwner、Application/Service 中使用 Lifecycle、Lifecycle 原理都不再本文重复介绍了。
open class MyLifeCycleObserver : DefaultLifecycleObserver { override fun onStart(owner: LifecycleOwner) { Log.e(KConsts.LIFE_TAG, "Lifecycle.Event.ON_START:connect") } override fun onStop(owner: LifecycleOwner) { Log.e(KConsts.LIFE_TAG, "Lifecycle.Event.ON_STOP:disConnect") }}//Activity/Fragment中的使用方式不变:lifecycle.addObserver(MyLifeCycleObserver())
可以看到新方式中已经没有 @OnLifecycleEvent 注解,并且没有实现 LifecycleObserver 接口,而是实现了一个叫DefaultLifecycleObserver的接口,来看这个接口的定义: DefaultLifecycleObserver -> FullLifecycleObserver -> LifecycleObserver
//DefaultLifecycleObserver -> FullLifecycleObserver public interface DefaultLifecycleObserver extends FullLifecycleObserver { @Override default void onCreate(@NonNull LifecycleOwner owner) {} @Override default void onStart(@NonNull LifecycleOwner owner) {} @Override default void onResume(@NonNull LifecycleOwner owner) {} @Override default void onPause(@NonNull LifecycleOwner owner) {} @Override default void onStop(@NonNull LifecycleOwner owner) {} @Override default void onDestroy(@NonNull LifecycleOwner owner) {}}// FullLifecycleObserver -> LifecycleObserverinterface FullLifecycleObserver extends LifecycleObserver { void onCreate(LifecycleOwner owner); void onStart(LifecycleOwner owner); void onResume(LifecycleOwner owner); void onPause(LifecycleOwner owner); void onStop(LifecycleOwner owner); void onDestroy(LifecycleOwner owner);}
新的使用方式中,不必自己新增@OnLifecycleEvent 注解的方法了,而只需要实现DefaultLifecycleObserver接口并按需重写对应生命周期的方法即可。
LifecycleRegistry负责添加和管理各个LifecycleObserver,最终是从LifecycleOwner中的生命周期Event传到了LifecycleObserver中对应的方法。
在旧的实现方式中,LifecycleObserver的最终实现类是ReflectiveGenericLifecycleObserver(见上图),当调用其对应的onStateChanged()方法后,是通过反射找到对应的@OnLifecycleEvent 注解并调用对应的方法的。那么新的实现方式最后如何调用观察者里对应的方法的呢?
上图只把最后接收事件的地方放出来了,前面的不变,可以看到新方式中没有用到LifecycleEventObserver接口,那么如何触发onStateChanged()回调呢?
来需要个适配器了,一块看下源码中是如何处理的:
addObserver(LifecycleObserver observer) 添加观察者后,如果使用的新的方式,系统会将传入的 FullLifecycleObserver 转换成 FullLifecycleObserverAdapter,从名字看就是一个适配器了,看看里面:
果然,FullLifecycleObserverAdapter 实现了LifecycleEventObserver接口,从而也可以执行onStateChanged()方法了,在onStateChanged()中根据传入的Event事件回调FullLifecycleObserver中对应的生命周期方法,新方式不用再去反射调用,提高了性能。
· Lifecycle 库从 2.4.0-beta01开始,建议使用 DefaultLifecycleObserver方式;
· 如果 @OnLifecycleEvent 与 DefaultLifecycleObserver都写了(一般也不会这么实现),那么会优先走DefaultLifecycleObserver中回调方法,@OnLifecycleEvent 声明的方法不再生效。
阅读量:2008
点赞量:0
收藏量:0