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

相关推荐
HX43639 分钟前
MP - Realm (not just realm)
android·ios·全栈
嘉小华1 小时前
Android 协程全景式深度解析:第一章 协程基础本质论
android
嘉小华1 小时前
Kotlin初始化全解析:深入理解对象创建的内部机制,避开常见陷阱
android
嘉小华1 小时前
Android 协程全景式深度解析:第二章 结构化并发全解
android
东风西巷3 小时前
ProCCD复古相机:捕捉复古瞬间
android·数码相机·智能手机·生活·软件需求
何盖(何松影)11 小时前
Android T startingwindow使用总结
android
小李飞飞砖12 小时前
Android 依赖注入框架详解
android
SUNxuetian12 小时前
【Android Studio】升级AGP-8.6.1,Find Usage对Method失效的处理方法!
android·ide·gradle·android studio·安卓
阿华的代码王国13 小时前
【Android】搭配安卓环境及设备连接
android·java
__water13 小时前
RHA《Unity兼容AndroidStudio打Apk包》
android·unity·jdk·游戏引擎·sdk·打包·androidstudio