在之前的文章中 Android Jetpack系列之Lifecycle 详细介绍了Lifecycle的概念、用法及其实现原理。本文在原来的基础上,来对比新的使用姿势并尝试分析两者的不同。
回顾Lifecycle的用处
Lifecycle可以将一个类或组件变成生命周期感知型的,并且可执行相应操作来响应另一个组件(如 activity 和 fragment)的生命周期状态的变化。Lifecycle使得代码更有条理性、精简、易于维护。
Lifecycle中的两个角色:
- LifecycleOwner: 生命周期拥有者,如Activity/Fragment等类都实现了该接口并通过getLifecycle()获得Lifecycle,进而可通过addObserver()添加观察者。
- LifecycleObserver: 生命周期观察者,实现该接口后就可以添加到Lifecycle中,从而在被观察者类生命周期发生改变时能马上收到通知。
实现LifecycleOwner的生命周期拥有者可与实现LifecycleObserver的观察者完美配合。
老的使用方式(@OnLifecycleEvent 不再推荐使用)
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
原理都不再本文重复介绍了。
新的使用方式(DefaultLifecycleObserver 推荐方式)
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 -> 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
方式;- 如果
@OnLifecycleEvent
与DefaultLifecycleObserver
都写了(一般也不会这么实现),那么会优先走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