推荐阅读
Lifecycle 是什么?
Lifecycle 是 Jetpack 中一个库,能帮助开发者更好的处理一些组件的生命周期,包括我们平常用的 AppCompatActivity ,Fragment 。
Lifecycle 的意义
这个问题官方也给出了答案: developer.android.google.cn/topic/libra…
在 Android 框架中定义的大多数应用组件都存在生命周期。生命周期由操作系统或进程中运行的框架代码管理。它们是 Android 工作原理的核心,应用必须遵循它们。如果不这样做,可能会引发内存泄漏甚至应用崩溃。
假设我们有一个在屏幕上显示设备位置的 Activity。常见的实现可能如下所示:
class MyLocationListener {
public MyLocationListener(Context context, Callback callback) {
// ...
}
void start() {
// 连接系统定位服务
}
void stop() {
// 断开连接
}
}
class MyActivity extends AppCompatActivity {
private MyLocationListener myLocationListener;
@Override
public void onCreate(...) {
myLocationListener = new MyLocationListener(this, (location) -> {
// update UI
});
}
@Override
public void onStart() {
super.onStart();
myLocationListener.start();
// 管理其他需要响应 activity 生命周期的组件
}
@Override
public void onStop() {
super.onStop();
myLocationListener.stop();
// 管理其他需要响应 activity 生命周期的组件
}
}
虽然此示例看起来没问题,但在真实的应用中,最终会有太多管理界面和其他组件的调用,以响应生命周期的当前状态。管理多个组件会在生命周期方法(如 onStart() 和 onStop())中放置大量的代码,这使得它们难以维护。
此外,无法保证组件会在 Activity 或 Fragment 停止之前启动。在我们需要执行长时间运行的操作(如 onStart() 中的某种配置检查)时尤其如此。这可能会导致出现一种竞态条件,在这种条件下,onStop() 方法会在 onStart() 之前结束,这使得组件留存的时间比所需的时间要长。
到这里你是否会有个问题:为什么用了 Lifecycle 就能轻松处理生命周期事件呢?难道它不需要 Activity 在 onStart() , onStop() 的时候通知其他组件吗?其实并没有这么神奇, Activity 内部已经将这些工作做好了,也就是在 onStart() , onStop() 的时候会向外发送生命周期事件,我们只需要使用 Lifecycle 就好了。具体实现原理后面会讲到
状态与事件
既然是帮助我们处理生命周期的,那 Lifecycle 是怎么表示生命周期的呢?实际上跟我们平常用的生命周期方法是差不多的,这里贴一张官方的图:
可以看到,有6个边箭头:ON_CREATE,ON_START,ON_RESUME,ON_PAUSE,ON_STOP,ON_DESTROY,它们对应我们常用的
onCreate() , onStart() 等生命周期方法,而5条边/结点就是组件的状态。
它们的具体实现在 Lifecycle 类中:
public abstract class Lifecycle {
...
public enum Event {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY
}
@SuppressWarnings("WeakerAccess")
public enum State {
/**
* 刚要onDestroy()调用前的状态
*/
DESTROYED,
/**
* Activity构造后,OnCreate()前
*/
INITIALIZED,
/**
* 两种情况:1.调用onCreate()后
* 2.刚要调用onStop()前
*/
CREATED,
/**
* 两种情况:1.调用onStart()后
* 2.刚要调用onPause()前
*/
STARTED,
/**
* 调用onResume()之后
*/
RESUMED;
/**
* Compares if this State is greater or equal to the given {@code state}.
*
* @param state State to compare with
* @return true if this State is greater or equal to the given {@code state}
*/
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
}
三大组成部分
Lifecycle 的实现主要是有三个部分实现:LifecycleOwner,LifecycleObserver,Lifecycle。下面让我们对这三个部分有个大致的了解
LifecycleOwner
顾名思义,生命周期拥有者。哪些组件有生命周期呢?我们很容易想到的有 Activity , Fragment , Service 这些。它们就是生命周期拥有者,但这跟这个 LifecycleOwner 有什么关系呢?我们来看看它的实现:
public interface LifecycleOwner {
@NonNull
Lifecycle getLifecycle();
}
LifecycleOwner 就是这么简单,本身是一个接口,只有一个方法:getLifecycle() , 看名字就知道这个方法是用来获取生命周期的。
接下来找找上面说的 Activity , Fragment , Service 这些类与 LifecycleOwner 之间联系:
我们常用的 AppCompatActivity 的超类 ComponentActivity 就实现了 LifecycleOwner 这个接口:
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
ContextAware,
LifecycleOwner,
ViewModelStoreOwner,
HasDefaultViewModelProviderFactory,
SavedStateRegistryOwner,
OnBackPressedDispatcherOwner,
ActivityResultRegistryOwner,
ActivityResultCaller {
...
}
Fragment 也是:
public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener, LifecycleOwner,
ViewModelStoreOwner, HasDefaultViewModelProviderFactory, SavedStateRegistryOwner,
ActivityResultCaller {
...
}
这样看来,只要实现 LifecycleOwner 这个接口,就跟 Lifecycle 对接上了。
不知道你是否好奇还有哪些类实现 LifecycleOnwer 这个接口,这里官方也给出答案:developer.android.google.cn/reference/k…
LifecycleOwner 的直接实现类如下:
所以对于这些类,我们能够使用 Lifecycle 轻松处理生命周期事件。不过一些类可能需要我们引用一些库,比如 LifecycleService , ProcessLifecycleOwner 就需要引用:
implementation 'android.arch.lifecycle:extensions:1.1.1'
LifecycleObserver
观察者。观察 Activity , Fragment 这些组件的生命周期,接收它们发送的生命周期事件,然后作出响应。 LifecycleObserver 实现如下:
public interface LifecycleObserver {
}
可以看到 LifecycleObserver 就是一个空接口,那它的作用就是标记,实现这个接口的类就抽象为观察者,与 Lifecycle 对接上了。
Lifecycle
Lifecycle,翻译就是生命周期的意思,但是它并不管理 Activity 的生命周期,Activity 等组件的生命周期由操作系统或进程中运行的框架代码管理,那这个类的作用是什么呢?
实际上它相当于 LifecycleOwner (Activity等组件) 和 LifecycleObserver(观察者) 的中介,复杂接收 LifecycleOwner 的生命周期事件,然后把这些事件分发给 LifecycleObserver 。
来看看它的实现:
public abstract class Lifecycle {
public abstract void addObserver(@NonNull LifecycleObserver observer);
public abstract void removeObserver(@NonNull LifecycleObserver observer);
public abstract State getCurrentState();
public enum Event {
...
}
public enum State {
...
}
}
可以看到 Lifecycle 是一个抽象类,有3个抽象方法,2个枚举类(上面提到了),这三个方法的意思看名字就知道分别是:添加观察者,移除观察者,获取当前状态。
使用方法
掌握使用方法才能更好地理解源码,Lifecycle 的使用方法可以分为两步:
写一个 LifecycleObserver 的实现类
直接实现 LifecycleObserver , 然后使用 OnLifecycleEvent 注解。
public class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(value = Lifecycle.Event.ON_START)
public void onStart(){
}
@OnLifecycleEvent(value = Lifecycle.Event.ON_RESUME)
public void onResume(LifecycleOwner owner){
}
@OnLifecycleEvent(value = Lifecycle.Event.ON_ANY)
public void onAny(LifecycleOwner owner, Lifecycle.Event event){
}
}
要求:
OnLifecycleEvent注解的参数 value 的取值就是 Lifecycle 中枚举类 Event 的值。- 所注解的方法可以无参数,也可以有1个或2个参数,参数个数不能超过2个,且第一个参数类型为 LifecycleOwner ,表示观察者所观察的组件实例,第二个参数类型为 Event。
- 如果方法又两个参数,则注解的参数 value 只能取 Lifecycle.Event.ON_ANY 。
实际上 OnLifecycleEvent 注解已经被弃用,那让我们看看其他的写法:
DefaultLifecycleObserver
public class MyObserver implements DefaultLifecycleObserver {
@Override
public void onCreate(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onCreate(owner);
}
@Override
public void onStart(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onStart(owner);
}
@Override
public void onResume(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onResume(owner);
}
}
DefaultLifecycleObserver 实现如下:
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) {
}
}
我们用一个类实现 DefaultLifecycleObserver 这个接口时,只需要根据需要重写部分方法就好了。
APT
这种方法写法上和第一种方法一样,只不过使用了 APT 技术。添加依赖:
//java
annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.5.1'
//kotlin
kapt 'androidx.lifecycle:lifecycle-compiler:2.5.1'
然后在 rebulid 一下项目,这时就会自动生成一个类,如下:
public class MyObserver_LifecycleAdapter implements GeneratedAdapter {
final MyObserver mReceiver;
MyObserver_LifecycleAdapter(MyObserver receiver) {
this.mReceiver = receiver;
}
@Override
public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
MethodCallsLogger logger) {
boolean hasLogger = logger != null;
if (onAny) {
if (!hasLogger || logger.approveCall("onAny", 4)) {
mReceiver.onAny(owner,event);
}
return;
}
if (event == Lifecycle.Event.ON_START) {
if (!hasLogger || logger.approveCall("onStart", 1)) {
mReceiver.onStart();
}
return;
}
if (event == Lifecycle.Event.ON_RESUME) {
if (!hasLogger || logger.approveCall("onResume", 2)) {
mReceiver.onResume(owner);
}
return;
}
}
}
该方法与第一种方法的区别是:在调用观察者的回调方法时,第一种方法是通过反射调用MyObserver的回调方法,而这种方法则是直接调用所生成类(MyObserver_LifecycleAdapter)的方法,运行时性能更好。
Activity等组件添加观察者
生命周期组件调用getLifecycle()获得与自己相关的 Lifecycle 实例, 再调用 Lifecycle 的 addObserver() 即可添加观察者。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
MyObserver observer = new MyObserver();
getLifecycle().addObserver(observer);
}
}
感谢与参考: