本文主要从源码角度介绍架构组件Lifecycle的实现原理,默认读者已经熟悉Lifecycle的基本使用。
功能与使用场景
功能
外部使用者可以通过Lifecycle来订阅Activity与Fragment的生命周期变化,同时也可以主动去获取当前Activity与Fragment处于哪个生命周期。
使用场景
在实现MVP与MVVM模式的时候,Presenter与ViewModel有时候会有初始化或者回收的逻辑,而这两部分的逻辑一般是与其宿主,也就是Activity或Fragment的生命周期强相关的。这个时候就可以借助Lifecycle赋予Presenter等实例感知宿主生命周期的能力,以更优雅的方式完成需求。
除此之外,有一些自定义View可能也有感知生命周期的需求,同样的也可以借助Lifecycle去实现。
整体架构图
整体的设计采用了订阅者模式以及状态机模式,类结构图如下:

简单介绍下比较重要的几个类:
- LifecycleObserver接口:顾名思义,实现了该接口的对象就可以感知到LifecycleOwner的生命周期。
- LifecycleOwner接口:实现了该接口的对象就有了生命周期,是一个可被观察的对象,通过持有LifecycleRegistry来实现生命周期变化的功能。
- Lifecycle、LifecycleRegistry:前者提供生命周期相关的对外接口,后者是前者的具体实现,提供声明周期变化等的具体实现。
- State、Event:代表状态与生命周期事件的枚举类。
源码分析
下面的源码分析均从Activity相关的实现入手,Fragment相关的实现类似,不再赘述。按照惯例从问题出发,如下:
订阅者如何注册与管理?
首先明确一个局部的持有关系,Activity与LifecycleRegistry是一对一的关系,其对外的生命周期相关功能都是由LifecycleRegistry实现的。自然,注册功能也是如此。先看下注册入口,LifecycleRegistry.addObserver():
1 | public class LifecycleRegistry extends Lifecycle { |
可以看到主要的逻辑就是添加订阅者并发送之前没有发送的生命周期事件。
LifecycleRegistry如何实现状态变更?
首先需要明确的是,状态的管理并不在LifecycleOwner,而是在被它持有的LifecycleRegistry。LifecycleOwner通过handleLifecycleEvent()通知LifecycleRegistry进行状态变更。具体看代码:
1 | public class LifecycleRegistry extends Lifecycle { |
如何将状态变更通知到订阅者?
以SupportActivity为例,它是一个LifecycleOwner,持有了LifecycleRegistry,但它并没有在自己的生命周期函数中调用LifecycleRegistry的分发方法来分发生命周期变化事件,而是通过ReportFragment来代为转发生命周期事件。
先看SupportActivity的onCreate()方法:
1 | public class SupportActivity extends Activity implements LifecycleOwner { |
再看ReportFragment的实现:
1 | public class ReportFragment extends Fragment { |
看到这里可能会疑惑为什么要引入ReportFragment,本人猜测的原因是,如果你项目中使用的BaseActivity并没有继承自support包,那么你就可以将ReportFragment添加到你的BaseActivity,这样它就也有生命周期的功能了。而SupportActivity刚好提供了这样的一种实现的范例。
注解是如何在Lifecycle中工作的?
Lifecycle除了直接使用GenericLifecycleObserver提供的接口进行状态获取,还可以通过直接实现LifecycleObserver接口并配合OnLifecycleEvent注解来实现指定方法在收到生命周期时间后的自动调用。
使用注解与直接使用监听器的区别在于注册的逻辑与后续的事件接收逻辑略有不同,其他的部分基本一致,因此这里只看这两部分是如何实现的。
1、利用注解完成注册:
直接看ObserverWithState的代码:
1 | static class ObserverWithState { |
具体的注解处理可以查看Lifecycling.getCallback(observer);
1 |
|
这里只关注与反射处理注解相关的代码,接下来跟进去看resolveObserverCallbackType()的实现:
1 | private static int resolveObserverCallbackType(Class<?> klass) { |
最核心的实现在hasLifecycleMethods()方法中:
1 | class ClassesInfoCache { |
到此为止,就完成了根据传入的LifecycleObserver,注册它,并记录其需要相应生命周期事件的函数的任务。
2、利用缓存的方法信息完成消息发送
回去看前面getCallback()的实现,可以发现它返回了ReflectiveGenericLifecycleObserver,再看其实现:
1 | class ReflectiveGenericLifecycleObserver implements GenericLifecycleObserver { |
显然其实现就是通过ClassesInfoCache缓存的信息调用对应的被注解标记的方法,细节也不复杂,就不展开了。
其他
上面讨论的源码都是围绕Lifecycle的基础功能的,实际上Lifecycle的extensions包中提供了更丰富的生命周期组件。包括拥有生命周期的服务LifecycleService和提供Application生命周期的组件ProcessLifecycleOwner,具体的使用和源码分析这里不再展开了,有兴趣的可以自己去查询相关资料。