Lifecycle
生命周期感知型组件,用来执行、操作、响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。
本文Lifecycle版本为2.2.0
:
implementation 'androidx.lifecycler:lifecycle-common:2.2.0' //22.2.23 更新 2.5 ,2.2是用的比较多的版本
你真的了解Lifecycle了吗?
Lifecycle使用非常非常简单。默认你已经使用过Lifecycle。但如果我问你以下几个问题。你能回答出来几个?
-
Lifecycle
的创建方式有几种?- 有什么不同?推荐使用哪种?为什么?
-
Event
事件和State
状态是什么关系-
onStop()
生命周期,处于什么State
状态
-
-
Lifecycle
是如何进行生命周期同步- 如果在
onResume()
注册观察者
会收到那几个种回调?为什么?
- 如果在
-
Activity
/Fragment
实现Lifecycle能力的方式一样吗?- 为什么要这么设计?有什么好处?
- Application能感知Activity生命周期吗?(如何使用Lifecycle监听前后台的能力)
-
Lifecycle
从源码角度,简述Lifecycle
的注册,派发,感知的过程 - 什么
嵌套事件
?发生的时机?Lifecycle
是如何解决的?
如果我是面试官,遇到简历上写掌握Jetpack组件,我一定是会问Lifecycle
这几个问题。因为它首先是Jetpack另外两个超级核心组件ViewModel
,LiveData
,实现能力的基石。同时它的使用频率也非常高,看似简单,容易被忽略,但却很多东西值得学习。
这十几个问题,从用法到源码,从表面到延伸。如果全懂,说明你真正掌握了Lifecycle的80%
,没错~!仅仅是8成。因为下面的源码分析,还会有更多延伸的问题.
Lifecycle基本使用
作为生命周期感知组件、它的作用就是监听宿主Activity/Fragment,然后派发给观察者。这句看似简单的概括,却倒出3个重要的角色:
宿主
,观察者
,用来派发的调度器
[图片上传失败...(image-614e69-1649222135014)] 使用Lifecycle的方法很简单:
- 先创建Observer,可以直接继承父类:
LifecycleObserver
public class LocationObserver implements LifecycleObserver {
private static final String TAG = "LocationObserver";
//1. 自定义的LifecycleObserver观察者,用注解声明每个方法观察的宿主的状态
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
void onCreate(@NotNull LifecycleOwner owner) {
Timber.e("onCreate_ON_CREATE");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
void onStart(@NotNull LifecycleOwner owner) {
Timber.e("onStart_ON_START");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
void onResume(@NotNull LifecycleOwner owner) {
Timber.e("onResume_ON_RESUME");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
void onPause(@NotNull LifecycleOwner owner) {
Timber.e("onPause_ON_PAUSE");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
void onStop(@NotNull LifecycleOwner owner) {
Timber.e("onStop_ON_STOP");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
void onDestroy(@NotNull LifecycleOwner owner) {
Timber.e("onDestroy_ON_DESTROY");
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
void onAny(LifecycleOwner owner) {
Timber.e("onAny_ON_ANY-->%s", owner.getLifecycle().getCurrentState());
}
}
自己定义
生命周期方法,并在每个方法上面标记对应生命周期的注解。同时还能获得LifecycleOwner
也就是宿主Activity
- 继承:
LifecycleEventObserver
,复写onStateChanged
方法:
public class EventObserver implements LifecycleEventObserver {
@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
switch (event) {
case ON_CREATE:
Timber.d("ON_CREATE");
break;
case ON_START:
Timber.d("ON_START");
break;
case ON_RESUME:
Timber.d("ON_RESUME");
break;
case ON_PAUSE:
Timber.d("ON_PAUSE");
break;
case ON_STOP:
Timber.d("ON_STOP");
break;
case ON_DESTROY:
Timber.d("ON_DESTROY");
break;
default:
break;
}
}
}
- 继承:
FullLifecycleObserver
,直接复写对应的生命周期回调:
public class FullLocationObserver implements DefaultLifecycleObserver {
@Override
public void onCreate(@NonNull LifecycleOwner owner) {
Timber.e("onCreate");
}
@Override
public void onStart(@NonNull LifecycleOwner owner) {
Timber.e("onStart");
}
@Override
public void onResume(@NonNull LifecycleOwner owner) {
Timber.e("onResume");
}
@Override
public void onPause(@NonNull LifecycleOwner owner) {
Timber.e("onPause");
}
@Override
public void onStop(@NonNull LifecycleOwner owner) {
Timber.e("onStop");
}
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
Timber.e("onDestroy");
}
}
此时你会发现,你无法直接继承FullLifecycleObserver
这时你要添加一个依赖:
implementation 'androidx.lifecycler:lifecycle-common:2.2.0' 替换上面引入的依赖(默认会集成上面的) implementation "androidx.lifecycle:lifecycle-common-java8:2.2.0"
继承:DefaultLifecycleObserver
,它是FullLifecycleObserver
的子类,因为在Java8以后,支持interface
接口类型,可以有自己的默认实现。
然后在Activity#OnCreate()
中调用如下方法:
lifecycle.addObserver(LocationObserver())
接着,你就可以使用Lifecycle的能力了。
从源码了解过程
如果是MVP,你可以让你的Presenter
去实现Observer
,在处理逻辑时获得感知
的能力。但如果我们把注册的代码lifecycle.addObserver(LocationObserver())
放入onResume()
方法中,会发生什么?你会发现Observer
除了可以收到onResume
事件,竟然还可以收到onCreate,onStart
。也就说宿主的状态,会同步给观察者
。这是怎么做到的?
感知监听
getLifecycle
点进去,会进入到ComponentActivity
核心代码:
public class ComponentActivity extends Activity implements LifecycleOwner{
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
protected void onCreate(Bundle bundle) {
super.onCreate(savedInstanceState);
//往Activity上添加一个fragment,用以报告生命周期的变化
//目的是为了兼顾不是继承自AppCompactActivity的场景.
ReportFragment.injectIfNeededIn(this);
}
-
LifecycleRegistry
是Lifecycle
的子类,通过new LifecycleRegistry(this);
把宿主Owner
,也就是当前Activity
作为构造参数传递进去 -
Activity
并不是直接派发生命周期,而是利用ReportFragment.injectIfNeededIn(this)
,
public class ReportFragment extends Fragment{
public static void injectIfNeededIn(Activity activity) {
android.app.FragmentManager manager = activity.getFragmentManager();
if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
manager.executePendingTransactions();
}
}
@Override
public void onStart() {
super.onStart();
dispatch(Lifecycle.Event.ON_START);
}
@Override
public void onResume() {
super.onResume();
dispatch(Lifecycle.Event.ON_RESUME);
}
@Override
public void onPause() {
super.onPause();
dispatch(Lifecycle.Event.ON_PAUSE);
}
@Override
public void onDestroy() {
super.onDestroy();
dispatch(Lifecycle.Event.ON_DESTROY);
}
private void dispatch(Lifecycle.Event event) {
//调用宿主的Lifecycle
Lifecycle lifecycle = activity.getLifecycle();
if (lifecycle instanceof LifecycleRegistry) {
((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
}
}
ReportFragment.injectIfNeededIn(this)
的作用是在Activity之上,创建一个不可见的Fragment
的。当Fragment
的生命周期发生变化,会通过dispatch()
,接着调用((LifecycleRegistry) lifecycle).handleLifecycleEvent(event)
来分发事件。这样做的目的是为了,当页面不是继承ComponentActivity
,而是直接继承Activity
,那么它就没有了感知的能力。此时需要自己实现LifecycleOwner
,复写getLifecycle()
,然后将自己传入进new LifecycleRegistry(this)
,就可以成为宿主
,让其他Observer
来监听。ReportFragment.injectIfNeededIn(this)
另一个使用的地方LifecycleDispatcher
:
class LifecycleDispatcher {
private static AtomicBoolean sInitialized = new AtomicBoolean(false);
static void init(Context context) {
if (sInitialized.getAndSet(true)) {
return;
}
((Application) context.getApplicationContext())
.registerActivityLifecycleCallbacks(new DispatcherActivityCallback());
}
@SuppressWarnings("WeakerAccess")
@VisibleForTesting
static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
ReportFragment.injectIfNeededIn(activity);
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
}
private LifecycleDispatcher() {
直接为Activity
注入ReportFragment
,使得每个页面都能成为宿主,让观察者感知,当然,你里面要自己实现LifecycleOwner
,复写getLifecycle()
,然后将自己传入进new LifecycleRegistry(this)
。==这部分与Lifecycle关系不大,只是作为知识扩展==
[图片上传失败...(image-376d45-1649222135014)] 总结:
- 监听过程就是,
Activity/Fragment
继承LifecycleOwner
,并在子类CommponentActivity
中创建Lifecycle
的子类LifecycleRegistry
。在复写getLifecycle()
的方法中将子类LifecycleRegistry
返回。 - 在
onCreate()
中注入ReportFragment
,在生命周期回调后,通过getLifecycle()
的方法得到LifecycleRegistry
对象中的handleLifecycleEvent(event)
方法给每个观察者派发生命周期事件。
为什么以Activity为例子,而不是像其他文章,以Fragement为例子,是因为你去看眼源码就会发现ReportFragment
类中的dispatch()
过程和Fragement
如出一辙:
public class Fragment implements xxx, LifecycleOwner {
//...
void performCreate(Bundle savedInstanceState) {
onCreate(savedInstanceState); //1.先执行生命周期方法
//...省略代码
//2.生命周期事件分发
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
}
void performStart() {
onStart();
//...
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
}
void performResume() {
onResume();
//...
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
}
void performPause() {
//3.注意,调用顺序变了
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
//...
onPause();
}
void performStop() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
//...
onStop();
}
void performDestroy() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
//...
onDestroy();
}
}
参照Android 架构组件(一)——Lifecycle, @ShymanZhu文中的时序图: [图片上传失败...(image-6393d7-1649222135014)]
同时,你会发现Fragment中performCreate()、performStart()、performResume()会先调用自身的onXXX()方法,然后再调用LifecycleRegistry的handleLifecycleEvent()方法;而在performPause()、performStop()、performDestroy()中会先LifecycleRegistry的handleLifecycleEvent()方法 ,然后调用自身的onXXX()方法。摘抄自-Lifecycle:生命周期组件详解&原理分析
同步
上面是监听过程,getLifecycle().addObserver(LocationObserver())
注册代码的前半部分。现在我们获得感知宿主
的能力,并将事件event
转发给LifecycleRegistry
,他是整个流程的核心
。现在来看后半部分,如何注册Observer
后可以在任何时机(onDestory
除外),感知完整生命周期。
不过在此之前,我们要先搞懂什么是状态State
和事件Event
public abstract class Lifecycle {
@MainThread
public abstract void addObserver(@NonNull LifecycleObserver observer);
@MainThread
public abstract void removeObserver(@NonNull LifecycleObserver observer);
@MainThread
@NonNull
public abstract State getCurrentState();
public enum Event {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY
}
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
/**
* <li>after {@link android.app.Activity#onStart() onStart} call;
* <li><b>right before</b> {@link android.app..Activity#onPause( onPause} call.
* </ul>
*/
STARTED,
RESUMED;
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
}
在Lifecycle
类中除了add
,remove
外,还有两个枚举类,Event
事件对应的就是Activty
的onCreate,onStart()
事件,而状态却只有5种。以STARTED
状态为例:这个状态发生在Activity#onStart()
之后,Activity#onPause()
之前。什么意思呢?请看下面这张图:
[图片上传失败...(image-7f8905-1649222135014)]
这张图我们一定见过,但这次我们横着对半切一刀
,上面表示生命周期的前进
,下面表示生命周期的后退
,一定要记住,这对我们后的理解源码非常重要,接着我们在解释下:
Activity
刚刚创建的时候它一定是INITIALIZED
状态,执行onCreate()
方法后,进入到CREATED
状态, 执行onStart()
方法后,进入到STARTED
状态,执行onResume()
方法后,进入到RESUMED
状态,这个过程就表示生命周期的前进
。当我们跳转下一个
Activity
后,执行onPase()
方法后,又重新回到STARTED
状态,执行onStop()
方法后,进入到CREATED
状态,最后执行onDestory()
方法后,进入到DESTROYED
状态。这个过程表示生命周期的后退
参照Android 架构组件(一)——Lifecycle, @ShymanZhu文中的关系图: [图片上传失败...(image-2de08c-1649222135014)]
这个图片仅作参考,
ObserverWithState
类中的关系有所变换,mLifeCycleObserver->LifeCycleEventObserver
LifecycleRegistry
shi生命周期注册,记录,派发事件的地方,理解状态和事件的关系,对我们搞清楚LifecycleRegistry
非常有帮助,下面以在onResume()
中调用lifecycle.addObserver(LocationObserver())
为例:
public LifecycleRegistry(@NonNull LifecycleOwner provider) {
mLifecycleOwner = new WeakReference<>(provider);
mState = INITIALIZED;
}
public void addObserver(@NonNull LifecycleObserver observer) {
//1
State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
//2
ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
//3
ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
if (previous != null) {
return;
}
LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
if (lifecycleOwner == null) {
// it is null we should be destroyed. Fallback quickly
return;
}
boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
//4
State targetState = calculateTargetState(observer);
mAddingObserverCounter ;
while ((statefulObserver.mState.compareTo(targetState) < 0
&& mObserverMap.contains(observer))) {
pushParentState(statefulObserver.mState);
//5
statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
popParentState();
// mState / subling may have been changed recalculate
targetState = calculateTargetState(observer);
}
if (!isReentrance) {
// we do sync only on the top level.
sync();
}
mAddingObserverCounter--;
}
//并不是继承自`Observer`
static class ObserverWithState {
State mState;
LifecycleEventObserver mLifecycleObserver;
ObserverWithState(LifecycleObserver observer, State initialState) {
mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
mState = initialState;
}
void dispatchEvent(LifecycleOwner owner, Event event) {
State newState = getStateAfter(event);
mState = min(mState, newState);
mLifecycleObserver.onStateChanged(owner, event);
mState = newState;
}
}
private State calculateTargetState(LifecycleObserver observer) {
Entry<LifecycleObserver, ObserverWithState> previous = mObserverMap.ceil(observer);
State siblingState = previous != null ? previous.getValue().mState : null;
State parentState = !mParentStates.isEmpty() ? mParentStates.get(mParentStates.size() - 1)
: null;
return min(min(mState, siblingState), parentState);
}
private static Event upEvent(State state) {
switch (state) {
case INITIALIZED:
case DESTROYED:
return ON_CREATE;
case CREATED:
return ON_START;
case STARTED:
return ON_RESUME;
//发生生命周期的前进,RESUMED处于前进阶段的末尾,无法前进了。因为之后要发生生命周期后退
//所以抛出异常
case RESUMED:
throw new IllegalArgumentException();
}
throw new IllegalArgumentException("Unexpected state value " state);
}
//根据事件,判断所处的状态
static State getStateAfter(Event event) {
switch (event) {
case ON_CREATE:
case ON_STOP:
return CREATED;
case ON_START:
case ON_PAUSE:
return STARTED;
case ON_RESUME:
return RESUMED;
case ON_DESTROY:
return DESTROYED;
case ON_ANY:
break;
}
throw new IllegalArgumentException("Unexpected event value " event);
}
-
mState
表示宿主
的状态
或是Observer
应该处于正确的状态,如果不是DESTROYED
,那么就赋值为INITIALIZED
状态,什么意思?就是当你添加一个Observer
的时机是在onDestory()
那么直接设置为DESTROYED
,之后便不会给这个观察者派发事件,否则即便你是在onReume()
注册,都是INITIALIZED
,为什么要这样做,而不是直接派发RESUMED
。这就是LifecycleRegistry
的高明之处,因为他下面要做事件同步
.如果直接派发RESUMED
,观察者且不是丢失了ON_CREATE
,ON_START
事件?这与Lifecycycle
设计的初衷肯定是不相符的 - 将
observer
和initialState
,封装进ObserverWithState
,从类名可以看出,他是持有观察者
和它当前状态
的包装类,。 - 观察者
Observer
为key,ObserverWithState
为Value封装进Map,mObserverMap
这个存储集合它的作用没啥可说的,但它的数据结构很特别,可以理解为是一个链表结构的Map,记录了链头Start,和链未End,同时每个Value元素,还记录了当前值的Next和Previous。 -
calculateTargetState
翻译为:计算目标状态,也就是计算传入的Observer
应该是什么状态。而它里面计算的逻辑很有意思。展开说涉及到嵌套事件
下面再讲,简单来说就是根据集合中的前一个Observer
状态和宿主
的状态与当前Observer
应该处于正确的状态mState
作min()
比较。从这里我们可以得出:一个Activity/Fragment可以有多个观察者,每个观察者的状态全部一致
- 循环判断,如果观察者状态小于目标状态,表示
发生生命周期的前进
。调用upEvent(State state)
计算前进事件。初始化是INITIALIZED
状态,发生前进事件,根据前面的图,应该发生ON_CREATE
事件。这有点不好理解。就是小于
的情况下。肯定发生生命周期的前进,所以INITIALIZED
状态下,下一个事件必然是ON_CREATE
事件。然后调用ObserverWithState #dispatchEvent()
,通过getStateAfter(event)
来根据事件,判断所处的状态。ON_CREATE
事件一定是CREATED
状态。接着保存起来newState
,调用注册进来的观察者的回调方法mLifecycleObserver.onStateChanged(owner, event)
把事件分发出去,然后更新mStatemState = newState
. 下次循环mState=CREATED
还是小于目标状态,upEvent():CREATED
-->ON_START
,getStateAfter(event):ON_START
-->STARTED
,保存状态newState
,回调监听onStateChanged
,保存状态:mState = newState
,直到mState = RESUMED
[图片上传失败...(image-845e20-1649222135014)]
经过循环之后。新注册的Observer
和宿主同步
到相同的生命周期。
派发
当宿主
生命周期发生变化,会调用mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
来向观察者派发,直接看分析然后再结合源码
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
State next = getStateAfter(event);
moveToState(next);//1
}
private void moveToState(State next) {
mState = next;
sync();//2
}
private void sync() {
while (!isSynced()) {//3
//当宿主状态小于 最早添加进来的观察者,为什么是最早,首先集合中的观察者是按顺序添加的,State应该是一致的,小于最早观察者,一定小于后面最后观察者
if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
backwardPass(lifecycleOwner);//4
}
Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
if (!mNewEventOccurred && newest != null
//当宿主状态大于最新的道理相同
&& mState.compareTo(newest.getValue().mState) > 0) {
forwardPass(lifecycleOwner);//5
}
}
}
private boolean isSynced() {
if (mObserverMap.size() == 0) {
return true;
}
State eldestObserverState = mObserverMap.eldest().getValue().mState;
State newestObserverState = mObserverMap.newest().getValue().mState;
return eldestObserverState == newestObserverState && mState == newestObserverState;
}
private void backwardPass(LifecycleOwner lifecycleOwner) {
while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
&& mObserverMap.contains(entry.getKey()))) {
Event event = downEvent(observer.mState);
observer.dispatchEvent(lifecycleOwner, event);
}
}
private void forwardPass(LifecycleOwner lifecycleOwner) {
while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
&& mObserverMap.contains(entry.getKey()))) {
observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
}
}
private static Event downEvent(State state) {
switch (state) {
//最初的状态 无法再后退
case INITIALIZED:
throw new IllegalArgumentException();
case CREATED:
return ON_DESTROY;
case STARTED:
return ON_STOP;
case RESUMED:
return ON_PAUSE;
//最末的状态 无法再回退
case DESTROYED:
throw new IllegalArgumentException();
}
throw new IllegalArgumentException("Unexpected state value " state);
}
- 根据传入的事件
event
,判断宿主的状态 - 进行复制
mState = next
,然后调用sync()
开始同步所有观察者
-
isSynced()
是否已经同步过了,取出Map中首尾元素,两者相等同时尾部元素,也就是最后添加,最新的元素和宿主状态mState
相同,就说明同步过了不用同步。再次印证:一个Activity/Fragment可以有多个观察者,每个观察者的状态全部一致
,但注意sync()
中是取的非while (!isSynced())
所以不一致时进入接下来的循环 -
if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0)
,宿主状态小于
观察者的状态,这是什么情况?如果你看懂前面的表,这里就不难理解,举个例子:观察者为RESUMED
状态,此时宿主发生onPase()
生命周期,那么宿主
会进入STARTED
状态。进入生命周期后退
过程.所以会调用backwardPass(lifecycleOwner)
向后传递。 -
(observer.mState.compareTo(mState) > 0
上面判断是宿主小于
观察者,backwardPass
判断观察者大于
宿主,完全是一个意思,接着会调用downEvent
,根据状态回退RESUMED
-->ON_PAUSE
-
observer.dispatchEvent(lifecycleOwner, event)
更新状态,分发观察者
事件,更新mState
-
mState.compareTo(newest.getValue().mState) > 0
事件前进forwardPass(lifecycleOwner);
与之前同步
过程完全相同 [图片上传失败...(image-4e36d3-1649222135014)]
统一Observer
思考一个问题:ObserverWithState#dispatch
是给观察者分发事件的位置,但他调用的是onStateChange()
,但我们回调方式的实现,是完全不同的,他是如何做到统一的呢?
static class ObserverWithState {
State mState;
LifecycleEventObserver mLifecycleObserver;
ObserverWithState(LifecycleObserver observer, State initialState) {
mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
mState = initialState;
}
void dispatchEvent(LifecycleOwner owner, Event event) {
State newState = getStateAfter(event);
mState = min(mState, newState);
mLifecycleObserver.onStateChanged(owner, event);
mState = newState;
}
}
mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer)
答案就是适配器模式
,看就在这里:
@NonNull
static LifecycleEventObserver lifecycleEventObserver(Object object) {//Object 就是传入的observer
boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver;
boolean isFullLifecycleObserver = object instanceof FullLifecycleObserver;
if (isLifecycleEventObserver && isFullLifecycleObserver) {
return new FullLifecycleObserverAdapter((FullLifecycleObserver) object,
(LifecycleEventObserver) object);
}
if (isFullLifecycleObserver) {
return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, null);
}
if (isLifecycleEventObserver) {
return (LifecycleEventObserver) object;
}
final Class<?> klass = object.getClass();
//关键代码
int type = getObserverConstructorType(klass);
if (type == GENERATED_CALLBACK) {
List<Constructor<? extends GeneratedAdapter>> constructors =
sClassToAdapters.get(klass);
if (constructors.size() == 1) {
GeneratedAdapter generatedAdapter = createGeneratedAdapter(
constructors.get(0), object);
return new SingleGeneratedAdapterObserver(generatedAdapter);
}
GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
for (int i = 0; i < constructors.size(); i ) {
adapters[i] = createGeneratedAdapter(constructors.get(i), object);
}
return new CompositeGeneratedAdaptersObserver(adapters);
}
return new ReflectiveGenericLifecycleObserver(object);
}
- Object 就是传入的
observer
,如果是如果同时实现LifecycleEventObserver
,FullLifecycleObserver
,创建FullLifecycleObserverAdapter
- 如果是
isFullLifecycleObserver
,创建FullLifecycleObserverAdapter
- 如果是
isLifecycleEventObserver
,直接返回
而FullLifecycleObserverAdapter
,FullLifecycleObserverAdapter
,所有适配器Adapter都是继承自LifecycleEventObserver
这样就可以收拢统一后调用
而直接继承LifecycleObserver
又是怎么判断的呢?:
int type = getObserverConstructorType(klass);
最终调用
/**
* Create a name for an adapter class.
*/
public static String getAdapterName(String className) {
return className.replace(".", "_") "_LifecycleAdapter";
}
当引入androidx.lifecycle:lifecycle-compiler:2.2.0
会利用APT,运行时注解处理器生成工具类并拼接类名:MyObserver_LifecycleAdapter
,然后调取注解标记的观察者,否者会用ReflectiveGenericLifecycleObserver
,反射执行。
嵌套事件
这部分不好理解,目前个人的理解就是,先弄清楚:什么时候回出现嵌套事件,两种情况:
- 在新添加观察者时,同步还未完成,此时
宿主
又发生了生命周期变化,那么此时就会导致不同步的问题 - 在派发
生命周期
给观察者时,又有新的观察者添加进来,那么新的观察者可能和其他观察者状态不同步的问题。
嵌套事件
,说白了就是同步冲突。因为所有观察者和宿主的状态是完全相同的,一旦生命周期派发,或是新的观察者添加进来时,如果生命周期或观察者集合
元素发生变化,就可能会导致不同步。这错乱
不是来自多线程
。因为细心的你会发现。LifeCycleRegistry
的大部分方法都标注@MainThread
注解。也就说,冲突并非是多线程,而是上面两种情况。
那么LifeCycleRegistry
又是如何如何处理的呢?答案是利用多个标记位表示状态,同时将新添加的观察者,或是正在变化的观察者压入栈。正确同步后后再出栈
,也就是mParentStates
这个mParentStates
类型的集合。所以一旦出现观察者状态不一致导致无法正常出栈。这个栈mParentStates
内的元素就不是空。就需要来重新处理或者判断。核心思想大概是这样样子。就是多个标记位
和栈
管理,来确保状态的同步和一致。
以上是个人理解。对嵌套事件感兴趣,想深入理解,可以看这篇:LifeCycle对于嵌套事件的处理
总结:
LifeCycle
组件简单,深入却有很复杂,理解后又会发现很有意思。但大部分文章却无法做到既深入,又能体现却他人的不同。更无法完全解答开头的十几个问题。不过现在你应该有了自己的答案。