生命周期敏感组件Lifecycles机制源码分析

生命周期敏感的组件:可以和Lifecycle一同工作的类。

使用示例:

创建生命周期敏感的组件类 LifecycleObserverSample :

生命周期敏感组件Lifecycles机制源码分析_第1张图片

如果不是使用 LifecycleActivity 和 LifecycleFragment ,其他的 Activity 和 Fragment 需要实现接口 LifecycleRegistryOwner :

生命周期敏感组件Lifecycles机制源码分析_第2张图片

主要实现红色的部分,其实这也是 LifecycleActivity 的实现:

生命周期敏感组件Lifecycles机制源码分析_第3张图片

例子运行效果:

简单点说,Activity 和 Fragment 与 生命周期敏感的组件 之间是观察者和被观察者的关系,生命周期敏感的组件 是观察者,Activity 和 Fragment 是被观察者,只是 生命周期敏感的组件 并不是直接观察 Activity 和 Fragment,而是观察 LifecycleRegistry ,然后 LifecycleRegistry 再观察 Activity 和 Fragment 的生命周期。

先总结一下机制的基本逻辑:

1.  利用 ContentProvider 的机制在应用一开始就给 Application 注册 ActivityLifecycleCallbacks,然后在回调 onActivityCreated() 中给 FragmentActivity类型的Activity 注册 FragmentLifecycleCallbacks 和给所有的 Activity 注入一个 ReportFragment 的 Fragment,然后在 FragmentLifecycleCallbacks 的 onFragmentCreated() 回调中对该 Fragment 注入一个 DestructionReportFragment 类型的子 Fragment,然后在 FragmentLifecycleCallbacks 的生命周期回调和  DestructionReportFragment 的生命周期回调 和 ReportFragment 的生命周期回调调用各自的 LifecycleRegistry 的 handleLifecycleEvent() 处理生命周期事件。这里我的理解是利用 FragmentLifecycleCallbacks 和 DestructionReportFragment 对Fragment 的生命周期进行监听,利用 ReportFragment 对 Activity 的生命周期进行监听。

2. 生命周期敏感的组件 对实现了 LifecycleRegistryOwner 的 Activity 和 Fragment 的 getLifecycle() 返回的 LifecycleRegistry 类型的实例进行观察。

3. 当 Activity 和 Fragment 生命周期发生变化时,该 Activity 和 Fragment 的 LifecycleRegistry 实例会调用对其进行观察的所有 生命周期敏感的组件 的相应事件的处理函数。

接下来进行源码分析:

1. 利用 ContentProvider 的机制在应用一开始就给 Application 注册 ActivityLifecycleCallbacks:

最终生成的 AndroidManifest.xml 会被插入 LifecycleRuntimeTrojanProvider 的注册代码

生命周期敏感组件Lifecycles机制源码分析_第4张图片

在 LifecycleRuntimeTrojanProvider 的 onCreate() 里面对 LifecycleDispatcher 进行初始化

生命周期敏感组件Lifecycles机制源码分析_第5张图片

在 LifecycleDispatcher 的初始化里面给 Application 注册 ActivityLifecycleCallbacks

生命周期敏感组件Lifecycles机制源码分析_第6张图片

2. 在 ActivityLifecycleCallbacks 的 onActivityCreated() 回调中给 FragmentActivity 类型的 Activity 注册 FragmentLifecycleCallbacks 和给所有的 Activity 注入一个 ReportFragment 的 Fragment:

生命周期敏感组件Lifecycles机制源码分析_第7张图片

ReportFragment 的注入代码:

FragmentLifecycleCallbacks 的回调处理 和 DestructionReportFragment 的注入:(只分发ON_CREATE、ON_START、ON_RESUME)

生命周期敏感组件Lifecycles机制源码分析_第8张图片

DestructionReportFragment 的生命周期回调处理(只分发ON_PAUSE、ON_STOP、ON_DESTROY)

生命周期敏感组件Lifecycles机制源码分析_第9张图片

调用各自的 LifecycleRegistry 的 handleLifecycleEvent() 处理生命周期事件

ReportFragment 的 生命周期回调:

生命周期敏感组件Lifecycles机制源码分析_第10张图片

3. LifecycleRegistry 的 handleLifecycleEvent() 处理生命周期事件:

生命周期敏感组件Lifecycles机制源码分析_第11张图片
生命周期敏感组件Lifecycles机制源码分析_第12张图片

4. ObserverWithState 是怎么来的呢?是在 LifecycleRegistry 的 addObserver() 里面把 LifecycleObserver 转化为一个对应的 ObserverWithState。

生命周期敏感组件Lifecycles机制源码分析_第13张图片

转化的代码关键是 mCallback,从上面可以看出 mCallback 包含了 LifecycleObserver 的信息,事件的分发也是由 mCallback 的 onStateChanged()来处理的。

注意:ObserverWithState 是 LifecycleRegistry 的内部类,这里的 LifecycleRegistry.this.mLifecycleOwner 是创建 LifecycleRegistry 的实例(实现 LifecycleRegistryOwner 的实例,比如TestLifeCycleActivity)。

5. mCallback 的生成:

Lifecycling 的 getCallback() :

生命周期敏感组件Lifecycles机制源码分析_第14张图片

a、第一个红框内的代码是从缓存中取出继承 GenericLifecycleObserver 的类的构造函数,然后传入参数 LifecycleObserver 的实例创建实例。该类可能是编译时根据实现 LifecycleObserver 的类自动生成的 XXX_LifecycleAdapter (第二个红色方框)(本例中 LifecycleObserverSample 对应的是 LifecycleObserverSample_LifecycleAdapter),或者是ReflectiveGenericLifecycleObserver (这个是在没有找到自动生成的 XXX_LifecycleAdapter 类的时候用的,第四个红色方框)。

b、第二个红框内的代码是去查找实现 LifecycleObserver 的类对应的 XXX_LifecycleAdapter 类的构造函数:

生命周期敏感组件Lifecycles机制源码分析_第15张图片

本例 LifecycleObserverSample 的代码 和 对应的 LifecycleObserverSample_LifecycleAdapter 的代码:

生命周期敏感组件Lifecycles机制源码分析_第16张图片
生命周期敏感组件Lifecycles机制源码分析_第17张图片

c、第四个方框是没有找到对应的 XXX_LifecycleAdapter ,直接使用 ReflectiveGenericLifecycleObserver 类创建对象:

生命周期敏感组件Lifecycles机制源码分析_第18张图片

getInfo() 取出 LifecycleObserver 实例中用注解注册的事件与相应的处理函数,包含该实例的父类。

生命周期敏感组件Lifecycles机制源码分析_第19张图片
生命周期敏感组件Lifecycles机制源码分析_第20张图片
生命周期敏感组件Lifecycles机制源码分析_第21张图片

6.  mCallback.onStateChanged 处理事件:

a、如果 mCallback 是实现 LifecycleObserver 的类对应的 XXX_LifecycleAdapter 类,那么调用的就是 XXX_LifecycleAdapter 的 onStateChanged(), 比如本例中的LifecycleObserverSample_LifecycleAdapter :

生命周期敏感组件Lifecycles机制源码分析_第22张图片

b、如果 mCallback 是 ReflectiveGenericLifecycleObserver 的实例,调用 ReflectiveGenericLifecycleObserver 的 onStateChanged(),从ReflectiveGenericLifecycleObserver.CallbackInfo mInfo 中取出事件对应的处理函数,然后调用该函数处理事件:

生命周期敏感组件Lifecycles机制源码分析_第23张图片
生命周期敏感组件Lifecycles机制源码分析_第24张图片

你可能感兴趣的:(生命周期敏感组件Lifecycles机制源码分析)