所以在分析 LifecycleRegistry
之前我们先看下LifecycleObserver
生命周期观察者 (LifecycleObserver)
LifecycleObserver 基本介绍
标记接口 LifecycleObserver
表示生命周期观察者,是 lifecycle-aware 组件。
public interface LifecycleObserver {
}
这个接口用来声明它的实现类是生命周期观察者 ,我们要在这个类里接收到LifecycleOwner
的生命周期变化事件,然后做自身逻辑。
但当我们看到LifecycleObserver
这个接口时,第一感觉是比较奇怪:这个接口竟然是空的。那我们如何去接受生命周期变化的事件呢?(通常正常的是回调接口)
其实开头就介绍过用法了,google的做法是配合注解 OnLifecycleEvent
使用,LifecycleObserver
只是起一个声明和约束作用。其内部继承数如下图:
看到这么多类似的接口,我猜或许这是因为生命周期钩子比较多,如果全都放在接口里,那么实现者需要添加很多空实现方法,可阅读性降低。
比如FullLifecycleObserver
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);
}
这个接口就将所有的生命周期函数声明了,如果我们实现这个接口,就得重写所有接口,然而我们不一定要用这么多接口。(其实你想用也用不了,这个接口不是public,我们不能实现)
我们知道用注解的话大多数是反射解析的,这就涉及到性能问题,当然使用apt可以在编译期解决这个问题。这点后文会详细分析。
如果我们不想用注解,又不想一下子实现所有的方法,可以吗? 答案是肯定的。java8的接口default方法。而且google也鼓励我们用这种方式,那就是DefaultLifecycleObserver
DefaultLifecycleObserver
注意:在androidx.lifecycle.Lifecycle类的顶部注释里有一段
/**
-
If you use Java 8 Language, then observe events with {@link DefaultLifecycleObserver}.
-
To include it you should add {@code “androidx.lifecycle:common-java8:”} to your
-
build.gradle file.
-
class TestObserver implements DefaultLifecycleObserver {
-
{@literal @}Override
-
public void onCreate(LifecycleOwner owner) {
-
// your code
-
}
-
}
-
If you use Java 7 Language, Lifecycle events are observed using annotations.
-
Once Java 8 Language becomes mainstream on Android, annotations will be deprecated, so between
-
{@link DefaultLifecycleObserver} and annotations,
-
you must always prefer {@code DefaultLifecycleObserver}.
-
class TestObserver implements LifecycleObserver {
-
{@literal @}OnLifecycleEvent(ON_STOP)
-
void onStopped() {}
-
}