生命周期敏感的组件:可以和Lifecycle一同工作的类。
使用示例:
创建生命周期敏感的组件类 LifecycleObserverSample :
如果不是使用 LifecycleActivity 和 LifecycleFragment ,其他的 Activity 和 Fragment 需要实现接口 LifecycleRegistryOwner :
主要实现红色的部分,其实这也是 LifecycleActivity 的实现:
例子运行效果:
简单点说,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 的注册代码
在 LifecycleRuntimeTrojanProvider 的 onCreate() 里面对 LifecycleDispatcher 进行初始化
在 LifecycleDispatcher 的初始化里面给 Application 注册 ActivityLifecycleCallbacks
2. 在 ActivityLifecycleCallbacks 的 onActivityCreated() 回调中给 FragmentActivity 类型的 Activity 注册 FragmentLifecycleCallbacks 和给所有的 Activity 注入一个 ReportFragment 的 Fragment:
ReportFragment 的注入代码:
FragmentLifecycleCallbacks 的回调处理 和 DestructionReportFragment 的注入:(只分发ON_CREATE、ON_START、ON_RESUME)
DestructionReportFragment 的生命周期回调处理(只分发ON_PAUSE、ON_STOP、ON_DESTROY)
调用各自的 LifecycleRegistry 的 handleLifecycleEvent() 处理生命周期事件
ReportFragment 的 生命周期回调:
3. LifecycleRegistry 的 handleLifecycleEvent() 处理生命周期事件:
4. ObserverWithState 是怎么来的呢?是在 LifecycleRegistry 的 addObserver() 里面把 LifecycleObserver 转化为一个对应的 ObserverWithState。
转化的代码关键是 mCallback,从上面可以看出 mCallback 包含了 LifecycleObserver 的信息,事件的分发也是由 mCallback 的 onStateChanged()来处理的。
注意:ObserverWithState 是 LifecycleRegistry 的内部类,这里的 LifecycleRegistry.this.mLifecycleOwner 是创建 LifecycleRegistry 的实例(实现 LifecycleRegistryOwner 的实例,比如TestLifeCycleActivity)。
5. mCallback 的生成:
Lifecycling 的 getCallback() :
a、第一个红框内的代码是从缓存中取出继承 GenericLifecycleObserver 的类的构造函数,然后传入参数 LifecycleObserver 的实例创建实例。该类可能是编译时根据实现 LifecycleObserver 的类自动生成的 XXX_LifecycleAdapter (第二个红色方框)(本例中 LifecycleObserverSample 对应的是 LifecycleObserverSample_LifecycleAdapter),或者是ReflectiveGenericLifecycleObserver (这个是在没有找到自动生成的 XXX_LifecycleAdapter 类的时候用的,第四个红色方框)。
b、第二个红框内的代码是去查找实现 LifecycleObserver 的类对应的 XXX_LifecycleAdapter 类的构造函数:
本例 LifecycleObserverSample 的代码 和 对应的 LifecycleObserverSample_LifecycleAdapter 的代码:
c、第四个方框是没有找到对应的 XXX_LifecycleAdapter ,直接使用 ReflectiveGenericLifecycleObserver 类创建对象:
getInfo() 取出 LifecycleObserver 实例中用注解注册的事件与相应的处理函数,包含该实例的父类。
6. mCallback.onStateChanged 处理事件:
a、如果 mCallback 是实现 LifecycleObserver 的类对应的 XXX_LifecycleAdapter 类,那么调用的就是 XXX_LifecycleAdapter 的 onStateChanged(), 比如本例中的LifecycleObserverSample_LifecycleAdapter :
b、如果 mCallback 是 ReflectiveGenericLifecycleObserver 的实例,调用 ReflectiveGenericLifecycleObserver 的 onStateChanged(),从ReflectiveGenericLifecycleObserver.CallbackInfo mInfo 中取出事件对应的处理函数,然后调用该函数处理事件: