本文共 2811 字,大约阅读时间需要 9 分钟。
上一篇文章介绍过了Jetpack的Lifecycle的简单使用,使用起来非常方便,帮我们节省了很多复杂的代码,就能允许其他对象对生命周期的感知。这篇文章从Google源码分析其原理。
源码环境:Androidx
android {
compileSdkVersion 30 buildToolsVersion "30.0.2"defaultConfig {
applicationId "com.example.testproject" minSdkVersion 23 targetSdkVersion 30 versionCode 1 versionName "1.0" } }
先从使用的时候最简单代码的地方着手:
从AppCompatActivity.java开始跟踪进去:AppCompatActivity.java----->FragmentActivity.java---->ComponentActivity.java---->androidx.core.app.ComponentActivity.java---->Activity.java;
上面的继承关系中,ComponentActivity.java和androidx.core.app.ComponentActivity.java都实现了LifecycleOwner这个接口,就表明我们的TestActivity是生命周期的拥有者:
其中我们写的代码的getLifecycle()就在第一个ComponentActivity.java中:
获取到的对象是LifecycleRegistry,是抽象类Lifecycle目前(2021.6.22)的唯一的子类。
这行代码getLifecycle().addObserver(new Test());就先看分析到这里,等下再回头看。这里留有一个悬念,没有解释addObserver这个方法。
接下来我们转到androidx.core.app.ComponentActivity.java这个类:在这个类的生命周期onCreate()方法中:
跟踪进去上面红框中的方法:
可以看到,实际上是给我们的activity添加add了一个ReportFragment,这个fragment是没有界面的,依附在传进来的activity参数上面。ReportFragment的生命周期存在:
可以看到在每个生命周期的方法中都把自己的状态分发处理了,dispatch(Event event);
因为我们的activity实现了LifecycleOwner;接着进入handleLifecycleEvent(event),把生命周期的状态传进去了。通过LifecycleRegistry分发对应生命周期事件Lifecycle.Event。
getStateAfter这个方法就是根据生命周期Event(大枚举),合并某些生命周期状态并返回State(枚举)。
接着把合并得到的State状态传给这个方法:moveToState(next);
接着进入同步sync()这个方法看看:
forwardPass(lifecycleOwner)、backwardPass(lifecycleOwner)代码差不多,就是一个往前一个往后的判断:
迭代mObserverMap取到LifecycleObserver包装类调用ObserverWithState;
这里就涉及到一个问题了,上面的向前和向后的两个方法中的这个mObserverMap集合数据哪来的呢?addObserver方法
这里就要解释上面留下的那个悬念了,这个mObserverMap就是在上面的这段代码中:getLifecycle().addObserver(new Test());被观察者添加了观察者,跟进源码分析:
addObserver方法是Lifecycle抽象类的一个抽象方法,具体实现交给唯一的实现类LifecycleRegistry
在这个具体实现的方法中,我们的观察者observer又被ObserverWithState包装了一层:Lifecycling.lifecycleEventObserver(observer),然后mObserverMap.putIfAbsent()添加到集合中
在Lifecycling.lifecycleEventObserver(observer)这个方法中,会将observer对象包装成LifecycleEventObserver的各种实现类:
mLifecycleObserver.onStateChanged(owner, event);通过以上实现类执行onStateChanged();
在上篇文章中,我们使用的是注解的方式来实现的,对应的就ReflectiveGenericLifecycleObserver这个实现类,接下来看看这个反射的集合类如何执行的:构造方法将observer传进去:
接着看如何反射调用Test.java中的被打上@OnLifecycleEvent注解的方法:
mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
这行代码就是拿到观察者对象的反射的相关信息:
在那个向前向后的方法中forwardPass、backwardPass会调到onStateChanged(),因此会在这个方法中执行反射相关的代码,从而会执行我们Test.java对应的方法。
上图就是从集合中遍历,集合中保存了相应的事件(如打开的时候就有oncreate、onstart、onresume这三个)
以下是我打开界面的时候的debug,首先会走oncreate,后面接着会走onstart和onresume,我只截图了oncreate。
原理比较清晰:Activity/Fragment实现LifecycleOwner接口,通过LifecycleRegistry在对应生命周期分发事件Lifecycle.Event,回调到生命周期观察者LifecycleObserver对应订阅方法。
有些细节需要自己看源码慢慢领悟,比如那几个集合的转换,如何数据添加,反射带参和不带参的标志位mCallType,和LifecycleEventObserver的其他的几个实现类。
转载地址:http://drxti.baihongyu.com/