Android Jetpack Lifecycle 源码解析

2021-04-12 10:06:33 浏览数 (1)

Jetpack 简介

我们在开发中会遇到很多问题,比如:产品交互、用户体验、代码结构、数据获取、数据存储、网络优化、任务调度等等,每个项目由于项目特点和需求的不同,都会出现一套基于开发者所设计的架构模式,分层、组件化、模块化,每一种设计都是基于项目所在场景的,很难适合所有项目场景。

Android Jetpack是谷歌正式推出的一整套用来构建APP开发的组件,它是为加快开发,消除冗余代码,提升质量而设计的,使开发者专注于应用本身。

Jetpack设计初衷Jetpack设计初衷

Lifecycles使用

Lifecycle用于帮助开发者管理Activity和Fragment 的生命周期,由于Lifecycle是LiveData和ViewModel的基础,所以需要先学习它。

一种常见的模式是在 Activity 和 Fragment 的生命周期方法中实现依赖组件的操作。但是,这种模式会导致代码条理性很差而且会扩散错误。通过使用生命周期感知型组件,您可以将依赖组件的代码从生命周期方法移入组件本身中。

之前分析过Activity差异化的来源,这正是App难以维护的痛点。

在build.gradle中依赖仅lifecycle库,方便代码分析。(实际上有lifecycle全家桶)

dependencies { def lifecycle_version = "2.2.0" // Lifecycles only (without ViewModel or LiveData) implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" }

Jetpack 包含与平台 API 解除捆绑的 androidx.* 软件包库,也正是它目前所推荐的。

实际上Jetpack库初期也提供了非Androidx的版本。这对目前还没有迁移到AndroidX的app是有利的。

dependencies { def lifecycle_version = "1.1.1" implementation "android.arch.lifecycle:runtime:$lifecycle_version" }

官网给出了一个使用示例的对比:

class MyActivity extends AppCompatActivity { private MyLocationListener myLocationListener; public void onCreate(...) { // manage other component myLocationListener = new MyLocationListener(this, location -> { // update UI }); } @Override public void onStart() { super.onStart(); // manage other component Util.checkUserStatus(result -> { // what if this callback is invoked AFTER activity is stopped? if (result) { myLocationListener.start(); } }); } @Override public void onStop() { super.onStop(); // manage other component myLocationListener.stop(); } }

App代码中也存在这种真实的示例,最终会有太多管理界面和其他组件的调用,以响应生命周期的当前状态。管理多个组件会在生命周期方法(如 onStart()onStop())中放置大量的代码,这使得它们难以维护。

此外,无法保证组件会在 Activity 或 Fragment 停止之前启动。在我们需要执行长时间运行的操作(如 onStart() 中的某种配置检查)时尤其如此。这可能会导致出现一种竞争条件,在这种条件下,onStop() 方法会在 onStart() 之前结束,这使得组件留存的时间比所需的时间要长。这也是App中crash防治的重点。

那么,使用Lifecycle该怎么做呢?

Lifecycle 是一个类,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并允许其他对象观察此状态。

Lifecycle 使用两种主要枚举跟踪其关联组件的生命周期状态:

图 1. 构成 Android Activity 生命周期的状态和事件图 1. 构成 Android Activity 生命周期的状态和事件

抽象类Lifecycle 内维护了两个Enum,Events,States,来维护用户可监听的事件,以及事件切换时,所属的状态。

public class MyObserver implements LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void connectListener() { ... } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) public void disconnectListener() { ... } } // 注释1使用LifecycleOwner只有的Lifecycle添加一个观察者 myLifecycleOwner.getLifecycle().addObserver(new MyObserver());

示例中新建一个MyObserver类,它实现了LifecycleObserver接口,说明MyObserver成为了一个Lifecycle的观察者。 并且使用注解,监听对应Event。

然后在注释1处将MyObserver添加到LifecycleOwner中。LifecycleOwner是一个接口,其内部只有一个方法getLifecycle(),getLifecycle方法用于获取Lifecycle,

这样就可以将MyObserver添加到Lifecycle中,当Lifecycle的生命周期发生变化时,MyObserver就会观察到,或者说是感知到。

那么接下来,我们就可以坐享其成,监听到生命周期变化的事件了吗?

因为在Android Support Library 26.1.0 及其之后的版本,Activity和Fragment已经默认实现了LifecycleOwner接口,所以在注释1处可以直接使用getLifecycle方法获取Lifecycle对象,这样MyObserver就可以观察MainActivity的生命周期变化了,LifecycleOwner可以理解为被观察者。

实际,官方API对LifecycleOwner的实现,就是个很好的范例,我们以此1.1.0版本,分析Lifecycle 实现监听的实现原理。

源码分析

实现LifecycleOwner,完成生命周期监听

在查看LifecycleOwner实现之前,我们先讲一下上面出现的类。

OnLifecycleEvent注解

package android.arch.lifecycle @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface OnLifecycleEvent { Lifecycle.Event value(); }

@Retention标记OnLifecycleEvent的存活时间到运行时,也就是运行时反射class,还能获取到。

代码语言:javascript复制
@Target标记OnLifecycleEvent的作用区域是Method。
代码语言:javascript复制
这里没有@Repeatable 注解,说明一个方法,只能标注接收一个Event(这个Event可能是ON_ANY,即接收所有事件)。
接口LifeOwner

package android.arch.lifecycle @SuppressWarnings({"WeakerAccess", "unused"}) public interface LifecycleOwner { @NonNull Lifecycle getLifecycle(); }

抽象类Lifecycle

那么Lifecycle这个抽象类又是怎么定义的呢?

package android.arch.lifecycle; 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(); @SuppressWarnings("WeakerAccess") public enum Event { ON_CREATE, ON_START, ON_RESUME, ON_PAUSE, ON_STOP, ON_DESTROY, /** * An {@link Event Event} constant that can be used to match all events. */ ON_ANY } @SuppressWarnings("WeakerAccess") public enum State { DESTROYED, INITIALIZED, CREATED, STARTED, RESUMED; public boolean isAtLeast(@NonNull State state) { return compareTo(state) >= 0; } } }

androidx的support库在ComponentActivity中实现,android.support库是SupportActivity。不同版本不一而足。现在以 SupportActivity 为例。

package android.support.v4.app; @RestrictTo({Scope.LIBRARY_GROUP}) public class SupportActivity extends Activity implements LifecycleOwner, Component { private SimpleArrayMap<Class<? extends SupportActivity.ExtraData>, SupportActivity.ExtraData> mExtraDataMap = new SimpleArrayMap(); // 注释0 Lifecycle的实现类,LifecycleRegistry private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); ... protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 注释1: Fragment 监听事件变化 ReportFragment.injectIfNeededIn(this); } // 注释2:onSaveInstanceState回调,切换状态到State.CREATED。 @CallSuper //子类override 时必须call super.onSaveInstanceState(outState); 防止状态丢失。 protected void onSaveInstanceState(Bundle outState) { this.mLifecycleRegistry.markState(State.CREATED); super.onSaveInstanceState(outState); } // 注释3 实现getLifecycle().LifecycleOwner接口 public Lifecycle getLifecycle() { return this.mLifecycleRegistry; } ... }

代码语言:javascript复制
注释3:
代码语言:javascript复制
SupportActivity实现了LifecycleOwner.getLifecycle(),返回 Lifecycle 的子类 LifecycleRegistry. 这个实现呢,我们后面再看。

现在关注注释1,注入Fragment, 监听生命周期变化。

ReportFragment完成生命周期监听

public static void injectIfNeededIn(Activity activity) { // ProcessLifecycleOwner should always correctly work and some activities may not extend // FragmentActivity from support lib, so we use framework fragments for activities android.app.FragmentManager manager = activity.getFragmentManager(); if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) { manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit(); // Hopefully, we are the first to make a transaction. manager.executePendingTransactions(); } }

注入之后,跟随Activity生命周期完成事件分发。

... @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); dispatchCreate(mProcessListener); dispatch(Lifecycle.Event.ON_CREATE); } @Override public void onStart() { super.onStart(); dispatchStart(mProcessListener); dispatch(Lifecycle.Event.ON_START); } @Override public void onResume() { super.onResume(); dispatchResume(mProcessListener); dispatch(Lifecycle.Event.ON_RESUME); } @Override public void onPause() { super.onPause(); dispatch(Lifecycle.Event.ON_PAUSE); } @Override public void onStop() { super.onStop(); dispatch(Lifecycle.Event.ON_STOP); } @Override public void onDestroy() { super.onDestroy(); dispatch(Lifecycle.Event.ON_DESTROY); // just want to be sure that we won't leak reference to an activity mProcessListener = null; } private void dispatch(Lifecycle.Event event) { Activity activity = getActivity(); if (activity instanceof LifecycleRegistryOwner) { ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event); return; } if (activity instanceof LifecycleOwner) { Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle(); if (lifecycle instanceof LifecycleRegistry) { ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event); } } }

状态转换

LifecycleRegistry.handleLifecycleEvent()

LifecycleRegistry.handleLifecycleEvent()是Lifecycle的继承类,实现了addObserver,removeObserver方法。并且维护了监听者的列表,负责生命周期事件分发。

先来到注释2,onSaveInstanceState 回调切换状态到State.CREATED。与上述回调分发方法不同。

onSaveInstanceState的小细节

那么 mLifecycleRegistry.markState(State.CREATED) 与 handleLifecycleEvent(event) 有什么区别呢?且为什么要设置State.CREATED呢?

此时此刻,我们已经知道LifeOwner是怎么将状态分发给Lifecycle的了(我们也可以这样自定义)。下面看一下LifecycleRegistry的实现。

package android.arch.lifecycle; public LifecycleRegistry(@NonNull LifecycleOwner provider) { mLifecycleOwner = new WeakReference<>(provider); mState = INITIALIZED; } // 注释0 将Lifecycle的状态,移到给出的状态,并且向观察者分发所需的事件:假如Lifecycle处于RESUMED状态,正好有一个刚注册的ObserverA。 // ObserverA 会连续收到 ON_CREATE,ON_START,ON_RESUME 三个事件。 @SuppressWarnings("WeakerAccess") @MainThread public void markState(@NonNull State state) { moveToState(state); } // 注释1:根据发来的event,设置当前的状态,并且通知观察者当前的event。 public void handleLifecycleEvent(@NonNull Lifecycle.Event event) { State next = getStateAfter(event); moveToState(next); } // 注释2:完成状态转换。 private void moveToState(State next) { if (mState == next) { return; } mState = next; // 注释3:防止状态快速切换 if (mHandlingEvent || mAddingObserverCounter != 0) { // 注释4: 防止漏掉新事件 mNewEventOccurred = true; // we will figure out what to do on upper level. return; } mHandlingEvent = true; sync(); mHandlingEvent = false; } // 注释5: 根据event 获取下一个状态 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); }

从注释0,注释1,可以回答上面的问题,markState直接进行状态转换,handleLifecycleEvent还需根据当前event,获取state。

getStateAfter函数,可以翻译为下面这张图。但是为什么只有5个状态呢(没有PAUSED,STOPD呢)

个人理解:

在Activity,onStop之后,用户还有可能回到onStart,也可能onDestoryed, 所以复用了CREATED的状态(只是名称有些令人费解)。

在Activity,onPaused之后,用户还有可能回到onResume,所以复用了STARTED的状态。

Lifecycle状态切换Lifecycle状态切换

针对这个写法,还有个问题,那就是为什么onSaveInstanceState,要设置State.CREATED呢?

什么情况下,Lifecycle的状态会切换到onCreate呢?在派发 ON_CREATE 或者 ON_STOP事件之后。

onSaveInstanceState调用,往往发生在onPause和onStop之间,代表系统资源紧张,马上要回收了。

这么做是等价于ON_STOP事件派发。

状态获取结束后,回到moveToState方法,sync(), 执行事件派发操作。

事件派发

// happens only on the top of stack (never in reentrance), // so it doesn't have to take in account parents private void sync() { while (!isSynced()) { mNewEventOccurred = false; // no need to check eldest for nullability, because isSynced does it for us. if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) { // 注释0 backwardPass(); } // 注释2 Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest(); if (!mNewEventOccurred && newest != null && mState.compareTo(newest.getValue().mState) > 0) { // 注释1 forwardPass(); } } mNewEventOccurred = false; }

sync方法中,注释0与注释1会根据当前状态和mObserverMap中的eldest和newest的状态做对比 ,判断当前状态是向前还是向后,比如由STARTED到RESUMED是状态向前,反过来就是状态向后,这个不要和Activity的生命周期搞混。向前还是向后的代码大同小异,这里以向后为例。

(ObserverMap里eldest是最先加入的观察这,newest是最后加入的观察者)

private void forwardPass() { Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator = mObserverMap.iteratorWithAdditions(); while (ascendingIterator.hasNext() && !mNewEventOccurred) { // 注释1 重要的ObserverWithState Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next(); ObserverWithState observer = entry.getValue(); while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred && mObserverMap.contains(entry.getKey()))) { pushParentState(observer.mState); // 注释0 最重要的一环,派发新事件,给观察者 observer.dispatchEvent(mLifecycleOwner, upEvent(observer.mState)); popParentState(); } } }

代码语言:javascript复制
forwardPass()从当前的观察者队列中,升序地向后遍历(一般正常的遍历,而descensing是降序地遍历,即向前遍历)

注释1,用到的ObserverWithState,是一个可执行派发操作的Observer和state的封装。

代码语言:javascript复制
注意,在事件派发前后,是修改了observer.mState,这符合我们对这个 中间存储对象的预期。observer.mState只是被观察者的状态,在个阶段修改了LifecycleRegistry的状态,到这里我们还要同步。
代码语言:javascript复制
注释0,即向观察者,派发事件。 upEvent(observer.mState), 是通过observer当前的状态,返回一个可以进入下一个状态的事件。

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; case RESUMED: throw new IllegalArgumentException(); } throw new IllegalArgumentException("Unexpected state value " state); }

接下来就是重要的 dispatchEvent。

static State min(@NonNull State state1, @Nullable State state2) { return state2 != null && state2.compareTo(state1) < 0 ? state2 : state1; } static class ObserverWithState { State mState; GenericLifecycleObserver mLifecycleObserver; ObserverWithState(LifecycleObserver observer, State initialState) { // 注释1 mLifecycleObserver = Lifecycling.getCallback(observer); mState = initialState; } void dispatchEvent(LifecycleOwner owner, Event event) { State newState = getStateAfter(event); mState = min(mState, newState); // 注释2 mLifecycleObserver.onStateChanged(owner, event); mState = newState; } } }

从名称就可以看出来,它内部包括了State和GenericLifecycleObserver,GenericLifecycleObserver是一个接口,它继承了LifecycleObserver接口。

ReflectiveGenericLifecycleObserver

注释1 Lifecycling.getCallback(observer),LifecycleObserver是如何转换为 ReflectiveGenericLifecycleObserver呢?

也就是ObserverWithState创建时,使用Lifecycling反射创建的。new一个不好吗?为什么要专门创建一个callbackCache缓存一下?

sCallbackCache这个map,存的是什么?key是LifecycleObserver,或子类,value是什么呢?任何继承GenericLifecycleObserver的类(或者它本身)的class 结构。

不同版本,不同Jetpack组件里,针对GenericLifecycleObserver的扩展不同。

@NonNull static GenericLifecycleObserver getCallback(Object object) { // step 0: 如果是GenericLifecycleObserver,直接返回。 if (object instanceof GenericLifecycleObserver) { return (GenericLifecycleObserver) object; } //noinspection TryWithIdenticalCatches try { // step2,获取缓存的class构造器,(一个class注册过,就把它放入缓存) final Class<?> klass = object.getClass(); Constructor<? extends GenericLifecycleObserver> cachedConstructor = sCallbackCache.get( klass); // if (cachedConstructor != null) { return cachedConstructor.newInstance(object); } // 根据LifecycleObserver类或子类,获得GenericLifecycleObserver类或子类的构造器 cachedConstructor = getGeneratedAdapterConstructor(klass); if (cachedConstructor != null) { if (!cachedConstructor.isAccessible()) { cachedConstructor.setAccessible(true); } } else { cachedConstructor = sREFLECTIVE; } sCallbackCache.put(klass, cachedConstructor); return cachedConstructor.newInstance(object); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InstantiationException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } }

ReflectiveGenericLifecycleObserver和CompositeGeneratedAdaptersObserver(非AndroidX的库没有)是GenericLifecycleObserver的实现类,这里主要查看ReflectiveGenericLifecycleObserver的onStateChanged方法是如何实现的。

创建反射数据结构

下面涉及到的内容就比较多了。

class ReflectiveGenericLifecycleObserver implements GenericLifecycleObserver { private final Object mWrapped; // LifecycleObserver,为什么是它,看后边。 private final CallbackInfo mInfo; @SuppressWarnings("WeakerAccess") static final Map<Class, CallbackInfo> sInfoCache = new HashMap<>(); ReflectiveGenericLifecycleObserver(Object wrapped) { mWrapped = wrapped; // 注释0 mInfo = getInfo(mWrapped.getClass()); } @Override public void onStateChanged(LifecycleOwner source, Event event) { // 注释1 invokeCallbacks(mInfo, source, event); }

在onStateChange事件里,使用了invokeCallbacks,这个方法最终,是反射通知观察者的。通过 @OnLifecycleEvent 这个注解,其实我们对这种实现已经有所预期。

那么 mInfo 是怎么创建的呢?

private static CallbackInfo getInfo(Class klass) { CallbackInfo existing = sInfoCache.get(klass); // step0: 取缓存 if (existing != null) { return existing; } // step1, 无缓存就创建 existing = createInfo(klass); return existing; } private static CallbackInfo createInfo(Class klass) { // step 2 获得当前类的父类 Class superclass = klass.getSuperclass(); Map<MethodReference, Event> handlerToEvent = new HashMap<>(); // step 3 如果父类不为null,为其创建CallbackInfo(是个递归的过程,最终将此类继承结构中,所有层级注册过的方法都添加至handlerToEvent中) if (superclass != null) { CallbackInfo superInfo = getInfo(superclass); if (superInfo != null) { handlerToEvent.putAll(superInfo.mHandlerToEvent); } } // step 4 获取当前类,声明的所有方法(public,private,等所有方法) Method[] methods = klass.getDeclaredMethods(); // step 5,获取当前类实现的所有监听event方法,添加到当前handlerToEvent里。 Class[] interfaces = klass.getInterfaces(); for (Class intrfc : interfaces) { for (Entry<MethodReference, Event> entry : getInfo(intrfc).mHandlerToEvent.entrySet()) { verifyAndPutHandler(handlerToEvent, entry.getKey(), entry.getValue(), klass); } } // step6 遍历所有的方法,获取包含OnLifecycleEvent注解的方法, 分析每个注册方法的调用类型,并且创建MethodReference,添加到handlerToEvent中 for (Method method : methods) { OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class); if (annotation == null) { continue; } Class<?>[] params = method.getParameterTypes(); // 注意对监听event事件参数的要求,要么没参数,要么参数0是LifecycleOwner的子类,要么参数1也还是Event类型的,这时还要求监听的Event得是onAny。 // 而且参数最长,3个,不能再多了。 // 为啥会有这等要求呢?1)反射invoke方法要传参,lifecyle作为一个通用框架,获取到的真正的参数的对象,也是有限的。2)给监听onAny的方法,一个知道当前event的入口。 3) 也给监听者一个获取到生命周期对象(Activity,Fragment)的机会。 int callType = CALL_TYPE_NO_A if (params.length > 0) { callType = CALL_TYPE_PROVIDER; if (!params[0].isAssignableFrom(LifecycleOwner.class)) { throw new IllegalArgumentException( "invalid parameter type. Must be one and instanceof LifecycleOwner"); } } Event event = annotation.value(); if (params.length > 1) { callType = CALL_TYPE_PROVIDER_WITH_EVENT; if (!params[1].isAssignableFrom(Event.class)) { throw new IllegalArgumentException( "invalid parameter type. second arg must be an event"); } if (event != Event.ON_ANY) { throw new IllegalArgumentException( "Second arg is supported only for ON_ANY value"); } } if (params.length > 2) { throw new IllegalArgumentException("cannot have more than 2 params"); } // step 7创建MethodReference,添加到handlerToEvent。 MethodReference methodReference = new MethodReference(callType, method); verifyAndPutHandler(handlerToEvent, methodReference, event, klass); } // step8,通过handlerToEvent,创建CallbackInfo,并添加到sInfoCache中 CallbackInfo info = new CallbackInfo(handlerToEvent); sInfoCache.put(klass, info); return info; }

不断的遍历各个方法,获取方法上的名为OnLifecycleEvent的注解,这个注解正是实现LifecycleObserver接口时用到的。step6处获取该注解的值,也就是在@OnLifecycleEvent中定义的事件。

那CallbackInfo是什么呢?

@SuppressWarnings("WeakerAccess") static class CallbackInfo { // 注释0:监听同一个event的方法列表 final Map<Event, List<MethodReference>> mEventToHandlers; // 注释1: 包含方法引用,与event的Map,在createInfo阶段被创建。 final Map<MethodReference, Event> mHandlerToEvent; // 注释2: 将mHandlerToEvent,转换为mEventToHandlers CallbackInfo(Map<MethodReference, Event> handlerToEvent) { mHandlerToEvent = handlerToEvent; mEventToHandlers = new HashMap<>(); for (Entry<MethodReference, Event> entry : handlerToEvent.entrySet()) { Event event = entry.getValue(); List<MethodReference> methodReferences = mEventToHandlers.get(event); if (methodReferences == null) { methodReferences = new ArrayList<>(); mEventToHandlers.put(event, methodReferences); } methodReferences.add(entry.getKey()); } } }

代码语言:javascript复制
注释2,将mHandlerToEvent,转换为mEventToHandlers,这个数据结构的转变,方便State变化时,去通知监听event的所有方法。
反射调用监听event的方法

下面就要回过头看上面的invokeCallbacks方法了。

@Override public void onStateChanged(LifecycleOwner source, Event event) { // step0:拿着mInfo,和真正的对象类型,去反射该调用的方法。 invokeCallbacks(mInfo, source, event); } // step2,根据info里缓存的信息,遍历所有监听方法,挨个反射调用一下。 private void invokeMethodsForEvent(List<MethodReference> handlers, LifecycleOwner source, Event event) { if (handlers != null) { for (int i = handlers.size() - 1; i >= 0; i--) { MethodReference reference = handlers.get(i); invokeCallback(reference, source, event); } } } // step1,通知监听该event的方法;同时通知监听所有event的方法。 @SuppressWarnings("ConstantConditions") private void invokeCallbacks(CallbackInfo info, LifecycleOwner source, Event event) { invokeMethodsForEvent(info.mEventToHandlers.get(event), source, event); invokeMethodsForEvent(info.mEventToHandlers.get(Event.ON_ANY), source, event); } // step3,按照缓存的方法参数类型,反射方法。 private void invokeCallback(MethodReference reference, LifecycleOwner source, Event event) { //noinspection TryWithIdenticalCatches try { switch (reference.mCallType) { case CALL_TYPE_NO_ARG: reference.mMethod.invoke(mWrapped); break; case CALL_TYPE_PROVIDER: reference.mMethod.invoke(mWrapped, source); break; case CALL_TYPE_PROVIDER_WITH_EVENT: reference.mMethod.invoke(mWrapped, source, event); break; } } catch (InvocationTargetException e) { throw new RuntimeException("Failed to call observer method", e.getCause()); } catch (IllegalAccessException e) { throw new RuntimeException(e); } }

至此,监听者收到了event事件,整个过程的时序图如下:

可以拆解为步骤:

  1. ReportFragment : 生命周期监听
  2. LifecycleRegistry:生命周期事件派发,并且切换state
  3. ObserverWithState:根据新的state通知观察者
  4. ReflectiveGenericLifecycleObserver:观察者无法直接获取,所以通过反射调用。

Lifecycle 分发时序图Lifecycle 分发时序图

UML类图

GenericLifecycleObserver 具有多个实现,在1.1.0 版本的lifecycle里,只有RelectiveGenericLifecycleObserver这个实现。

0 人点赞