1.Lifecycle源码解析
Lifecycle源码解析
作者:Gs 转载地址: /post/
1、源码猜想
如果是下载我们实现Lifecycle的功能,我们会如何设计?
2、源码入口
既然Activity或者Fragment作为生命周期的下载所有者,并且在他们中增加了LifecycleObserver,源码那么我们就从Activity或者Fragment作为探索Lifecycle原理的下载霸屏源码破解入口。在Activity或者Fragment中使用Lifecycle时,源码我们通常会看到如下代码:
我们进入getLifecycle()方法。下载注:以Activity中的源码代码为例。
这是下载Activity的父类ComponentActivity中的代码:
getLifecycle()返回的mLifecycleRegistry,直接使用new创建。源码
LifecycleRegistry的下载构造方法必须传递LifecycleOwner参数。而ComponentActivity已经实现了LifecycleOwner接口,源码ms影视源码所以可以直接
LifecycleOwner接口很简单,下载只有一个getLifecycle()抽象方法。源码
所以我们的Activity或者Fragment作为生命周期的所有者,同时也实现了LifecycleOwner接口,通过getLifecycle()方法获取LifecycleRegistry对象,LifecycleRegistry也就是tp改源码实现生命周期分发的类。
LifecycleRegistry在lifecycle-runtime包中。
3、生命周期事件分发
我们看到Activity的父类ComponentActivity实现了LifecycleOwner接口,并且创建了LifecycleRegistry对象。那么生命周期的分发也应该在ComponentActivity的各个生命周期方法中吧。然而,58的源码我们看到ComponentActivity中只复写了onCreate()方法,没有其他生命周期方法。
里面有一句代码
ReportFragment不是在上面中和LifecycleRegistry在lifecycle-runtime包中一起出现的吗?所以ReportFragment一定是为了实现Lifecycle功能。
injectIfNeededIn()方法很简单,就是创建ReportFragment加入到Activity中。但是Java克隆源码它里面包含了各个生命周期方法,而且都调用了分发方法dispatch()。参数就是我们在自定义LifecycleObserver中给方法加的注释事件。
至此,我们找到了生命周期事件的分发方法dispatch(Event event),方法内部使用LifecycleRegistry的handleLifecycleEvent(event)分发事件。上面我们也说过LifecycleRegistry就是实现生命周期分发的类。而ReportFragment的作用就是获取生命周期而已,因为Fragment生命周期是依附Activity的。好处是把这部分逻辑抽离出来,实现Activity的无侵入。如果你对加载库Glide比较熟悉,就会知道它也是使用透明Fragment获取生命周期的。
4、生命周期事件处理
LifecycleRegistry继承自Lifecycle。
Lifecycle使用两种主要枚举跟踪其关联组件的生命周期状态:
Event触发的时机:
您可以将状态看作图中的节点,将事件看作这些节点之间的边。上一节中,我们知道ReportFragment生命周期发生变化时,都会调用LifecycleRegistry中的handleLifecycleEvent()方法。因此,我们先看一下handleLifecycleEvent()方法。