您的选择
据我所知,您有 3 个选项:
LifecycleObserver
它是一个标记接口,它没有任何方法。您的类将实现它,然后您根据需要定义一堆 @OnLifecycleEvent 方法。
生命周期运行时会做两件事之一:
- 使用反射查找带注释的方法,
- 如果您启用了
lifecycle-compiler 注释处理器,则使用生成的适配器。
此接口是lifecycle-common 库的一部分。
LifecycleEventObserver
它提供了一个单一的方法
void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);
这将被称为 而不是 任何带注释的方法。
此接口是lifecycle-common 库的一部分。
DefaultLifecycleObserver
它提供了一个带有几个空方法的接口:
default void onCreate(@NonNull LifecycleOwner owner) {}
default void onStart(@NonNull LifecycleOwner owner) {}
default void onResume(@NonNull LifecycleOwner owner) {}
default void onPause(@NonNull LifecycleOwner owner) {}
default void onStop(@NonNull LifecycleOwner owner) {}
default void onDestroy(@NonNull LifecycleOwner owner) {}
您的类将实现此接口,您可以选择要实现的方法。
此接口是lifecycle-common-java8 库的一部分。自 Java 8 起支持具有一些已实现方法(默认方法)的接口。如果您的项目有 enabled Java 8 language features,则可以使用它。
怎么做
LifecycleEventObserver 和 DefaultLifecycleObserver 向你的类添加方法,这可能不是你想要的。这绝对不是我喜欢的。
我希望您创建一个具有语义准确名称的方法,并仅告诉 Lifecycle 框架何时它应该调用它。像这样:
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void startListening();
它不会用额外的方法污染你的班级。您可以使用注释处理器使其在运行时更快。 (仍然使用反射查找生成的适配器。)
我发现Lifecycle release notes的这个说法不准确:
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version" // For Kotlin use kapt instead of annotationProcessor
// alternately - if using Java8, use the following instead of lifecycle-compiler
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
编译器会生成一个适配器,因此您不必更改类的接口。它与DefaultLifecycleObserver 完全不同。