Jetpack | Lifecycle 库新旧版本使用姿势对比

在之前的文章中 Android Jetpack系列之Lifecycle 详细介绍了Lifecycle的概念、用法及其实现原理。本文在原来的基础上,来对比新的使用姿势并尝试分析两者的不同。

回顾Lifecycle的用处

Lifecycle可以将一个类或组件变成生命周期感知型的,并且可执行相应操作来响应另一个组件(如 activity 和 fragment)的生命周期状态的变化。Lifecycle使得代码更有条理性、精简、易于维护。

Lifecycle中的两个角色

  1. LifecycleOwner: 生命周期拥有者,如Activity/Fragment等类都实现了该接口并通过getLifecycle()获得Lifecycle,进而可通过addObserver()添加观察者。
  2. LifecycleObserver: 生命周期观察者,实现该接口后就可以添加到Lifecycle中,从而在被观察者类生命周期发生改变时能马上收到通知。

实现LifecycleOwner的生命周期拥有者可与实现LifecycleObserver的观察者完美配合。

老的使用方式(@OnLifecycleEvent 不再推荐使用)

kotlin 复制代码
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 了,执行结果很简单就不再贴出来了,有兴趣的可以看开头的文章介绍。另外自定义 LifecycleOwnerApplication/Service 中使用 LifecycleLifecycle 原理都不再本文重复介绍了。

新的使用方式(DefaultLifecycleObserver 推荐方式)

kotlin 复制代码
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

kotlin 复制代码
//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 -> LifecycleObserver
interface 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方式;
  • 如果 @OnLifecycleEventDefaultLifecycleObserver都写了(一般也不会这么实现),那么会优先走DefaultLifecycleObserver中回调方法,@OnLifecycleEvent 声明的方法不再生效。

资料

【1】使用生命周期感知型组件处理生命周期:https://developer.android.com/topic/libraries/architecture/lifecycle?hl=zh-cn

【2】Lifecycle历史版本:https://developer.android.com/jetpack/androidx/releases/lifecycle?hl=zh-cn

相关推荐
雨白2 小时前
Android 多线程:理解 Handler 与 Looper 机制
android
sweetying4 小时前
30了,人生按部就班
android·程序员
用户2018792831675 小时前
Binder驱动缓冲区的工作机制答疑
android
真夜5 小时前
关于rngh手势与Slider组件手势与事件冲突解决问题记录
android·javascript·app
用户2018792831675 小时前
浅析Binder通信的三种调用方式
android
用户095 小时前
深入了解 Android 16KB内存页面
android·kotlin
火车叼位6 小时前
Android Studio与命令行Gradle表现不一致问题分析
android
前行的小黑炭8 小时前
【Android】 Context使用不当,存在内存泄漏,语言不生效等等
android·kotlin·app
前行的小黑炭9 小时前
【Android】CoordinatorLayout详解;实现一个交互动画的效果(上滑隐藏,下滑出现);附例子
android·kotlin·app
用户20187928316721 小时前
Android黑夜白天模式切换原理分析
android