Lifecycle是Jetpack的核心组件,他可以无侵入的观测到Activity/Fragment的生命周期变化,解耦代码。对于ViewModel,LifeData,以及一些需要感知生命周期的方法或组件可以提供帮助。官网使用介绍地址是lifecycle。
依赖
1 | // 推荐引入提供DefaultLifecycleObserver,只要继承该类,按需要重写对应生命周期回调,然后注册,即可收到回调 |
使用
我们使用它的最基础的功能,然后再分析它的具体的几个类和分别在Activity的调用情况。我们的版本是2.2.0
,androidx版本是1.3.2
。
假如我们有一个组件需要监测生命周期的变化,例如
1 | class TestLife : DefaultLifecycleObserver { |
我们只需要在Activity中通过lifecycle.addObserver(TestLife())
把他作为一个组件添加到lifecycle
中即可,TestLife
就可以收到Activity的生命周期回调。
源码分析
他的类图结构大概是这样的:
主要的逻辑集中在LifecycleRegistry,我们先列举出几个关键的类和他的作用。
1.Lifecycle,是一个抽象类,可以添加或者删除需要观测Activity生命周期的组件
1 | //增加 |
2.State,是Lifecycle的内部枚举类,他提供了一些值用于判断当前Activity的状态
1 | DESTROYED, //在调用了onDestory之后getCurrentState()变为它,他是最小的 |
3.Event类,也是Lifecycle的内部枚举类,他一一对应了Activity的所有生命周期,可以作为OnLifecycleEvent
注解的值,被OnLifecycleEvent
注解的方法可以收到对应的生命周期回调(后续再说)
1 | ON_CREATE, |
4.LifecycleRegistry,是Lifecycle的具体实现类,提供了所有的关键实现
5.LifecycleOwner,是一个接口,提供了一个获取Lifecycle的方法Lifecycle getLifecycle()
,实际用是用来获取LifecycleRegistry。
6.ComponentActivity,是位于androidx.activity
包下的Activity,FragmentActivity继承自他,AppCompatActivity继承自ComponentActivity。
7.LifecycleObserver,他是一个空接口,他主要有两种实现,第一类是LifecycleEventObserver
,第二类是FullLifecycleObserver
,他们二者的区别如下
1 | //LifecycleEventObserver接口的方法 |
8.Lifecycling,处理各种不同的生命周期监听方式,是一个工具类的定位。
LifecycleRegistry的源码实现
基本构成
他是继承自Lifecycle
的,他是每一个Act都拥有一个实例。我们先看他的成员变量
mObserverMap
,是FastSafeIterableMap<LifecycleObserver, ObserverWithState>
类型,用于存储包装LifecycleObserver作为key,把拥有的组件状态包装为value,FastSafeIterableMap
的相关介绍文章Jetpack之FastSafeIterableMap源码WeakReference<LifecycleOwner> mLifecycleOwner
,他是生命周期组件的引用持有者,使用弱引用避免内存泄漏int mAddingObserverCounter
,用于维护事件嵌套发生时LifecycleRegistry的状态维护。下面三个属性也是boolean mHandlingEvent
,用于维护事件嵌套发生时LifecycleRegistry的状态维护boolean mNewEventOccurred
,用于维护事件嵌套发生时LifecycleRegistry的状态维护ArrayList<State> mParentStates
,用于维护事件嵌套发生时LifecycleRegistry的状态维护
首先我们先明确一下LifecycleRegistry维护的状态他是有大小的,即State枚举类,从小打到是
1 | DESTROYED<INITIALIZED<CREATED<STARTED<RESUMED |
LifecycleRegistry维护的LifecycleObserver有一个规则,在任意时候,新的订阅者的状态小于等于之前的订阅者的状态,即状态的有序性。
订阅者之前的状态为何不一致?因为LifecycleRegistry通知所有的LifecycleObserver是一个同步的过程,前面的订阅者先同步到了后面的订阅者还没有,所以会存在订阅者状态不一致的情况。
LifecycleRegistry中最重要的一个方法是addObserver
,他的实现如下
1 | @Override |
上面已经解析了他的大概流程,我们就分析mObserverMap如何维护状态,为何需要ObserverWithState,如何通知以及同步状态给各个观察者。
ObserverWithState
首先是ObserverWithState,我们先看它的源码
1 | static class ObserverWithState { |
我们先看如何把LifecycleObserver转为LifecycleEventObserver以及他的作用
1 | @NonNull |
其中FullLifecycleObserverAdapter,SingleGeneratedAdapterObserver,CompositeGeneratedAdaptersObserver,ReflectiveGenericLifecycleObserver是实现了LifecycleEventObserver的类,在onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event)
中调用各个观察者的方法。他的作用是统一观测者的接口,方便不同方式的观测者接受到事件更新。
从上面返回LifecycleEventObserver的方式我们就知道我们观察者需要观察生命周期的方式一般是由四种方式
- 直接继承FullLifecycleObserver,也可以同时继承LifecycleEventObserver(一般不用)
- 直接继承LifecycleEventObserver,选择性继承FullLifecycleObserver(一般不用)
- 直接继承自LifecycleObserver,然后需要观察的生命周期添加
OnLifecycleEvent
注解 - 直接继承自LifecycleObserver,然后需要观察的生命周期添加
OnLifecycleEvent
注解,并且添加kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
依赖,通过注解生成文件。
以上四种方式,其中第一种是最简单的值得推荐的,所以我们一开始就不推荐引入lifecycle-compiler
而是直接使用lifecycle-common-java8
。
然后我们再次把眼光回到ObserverWithState
的dispatchEvent(LifecycleOwner owner, Event event)
中,他通过调用转化得来的mLifecycleObserver
,通过它去调用观测者的对应方法。
状态更新和同步
我们先看上面提到的getStateAfter(event)
方法
1 | //他是把Act的生命周期转换成State的方法 |
downEvent
则是把State转为Event,方向是向下的,即ON_STOP,ON_DESTROY,ON_PAUSE
,upEvent
则是向上的,把State转为Event,对应的是ON_CREATE,ON_START,ON_RESUME
。
外部更新LifecycleRegistry的状态,一般是通过setCurrentState(@NonNull State state)
或者是handleLifecycleEvent(@NonNull Lifecycle.Event event)
,他们都最终调用到了moveToState(State next)
中。
1 | private void moveToState(State next) { |
可以看到最终是来到我们的核心方法sync()
1 | //判断是否同步过 |
其实一般而言,newest
是等于eldest
的,一个LifecycleObserver
只会被存入mObserverMap一次。
然后我们再看最后的两个方法
1 | private void backwardPass(LifecycleOwner lifecycleOwner) { |
可以看到观测者接受的生命周期的顺序不是断开的而是联系的
以上基本就是LifecycleRegistry的源码解析了
LifecycleRegistry源码总结
- 需要观测声明周期的组件一般是继承
DefaultLifecycleObserver
,重写需要的方法,然后在Activity中调用(也可以是其他三种方式)lifecycle.addObserver(life)
,然后就可以收到生命周期回调 - 在
addObserver(@NonNull LifecycleObserver observer)
过程中,把observer存入到mObserverMap中,后续生命周期发生变化进行通知。如果observer的初始状态比当前Act的小则进行同步,比如我们可以在onResume中才去addObserver,但是life又有onCreate
,这是Act执行了onResume
会通知到life
的onCreate
和onResume
- 外部通过调用LifecycleRegistry的
markState(@NonNull State state)
或者是handleLifecycleEvent(@NonNull Lifecycle.Event event)
去更新State,然后通知所有的observer
触发LifecycleRegistry
具有生命周期的组件只有在对应的生命周期调用LifecycleRegistry的方法更新即可,常见的有下面两种种方式
- 对于Activity而言,使用ReportFragment,它内部封装了对LifecycleRegistry的调用,我们的
ComponentActivity
就是使用这种方式,我们的lifecycle-process
依赖也是,关于lifecycle-process
后续再说 - 自己直接拥有LifecycleRegistry对象,然后调用它,比如Fragment中,比如自己直接继承Activity然后需要管理生命周期,就可以声明一个LifecycleRegistry对象然后在声明周期调用他
我们主要是讲解第一种,我们平常假如没有引入lifecycle-process
,既可以直接继承ComponentActivity
或者他的子类AppCompatActivity
或者是通过ProcessLifecycleOwner.get().lifecycle
来得到LifecycleOwner
,但是这种方式是有缺陷的,他是用来监听应用程序的生命周期的,后续再说他的用法。
ReportFragment
他的源码也比较的简单,他有一个注入Act的方法,
1 | public static void injectIfNeededIn(Activity activity) { |
他的主要思路就是利用一个无内容的,ReportFragment在他的生命周期当中可以回调到LifecycleOwner中(比如AppCompatActivity),假如他的宿主是实现了LifecycleOwner就可以调动Lifecycle组件的方法更新观测者了。
他的代码并不复杂,主要是重写Activity对应的生命周期方法,然后最终都调用到dispatch
方法中
1 | private void dispatch(Lifecycle.Event event) { |
为什么不直接在ComponentActivity里面去调用呢?这是因为要解耦,有的Activity不一定是要间接或者是直接继承ComponentActivity的,但是假如他们也需要使用Lifecycle组件的话,就可以直接使用ReportFragment了。
总结
LifeCycle的几个类的职责我们再说下
- LifeCycleOwner是定义获取Lifecycle的接口
- Lifecycle,他是一个接口,定义了一些方法,是用来管理需要观测生命周期的组件的。他有一个实现类LifecycleRegistry,都是使用这个类去实现Lifecycle的逻辑
- LifecycleObserver,他是用于生命周期的具体感知回调接口,观测者需要间接或者直接的实现它。然后要么是通过注解(apt可以选择性添加),要么是继承FullLifecycleObserver,要么是继承LifecycleEventObserver。
- ReportFragment,是用它来触发LifecycleRegistry的方法。他是一个无内容的Fragment,绑定了Activity的生命周期。