前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android Jetpack Lifecycle 源码解析

Android Jetpack Lifecycle 源码解析

原创
作者头像
Erossssssss
修改2021-04-12 10:06:33
7210
修改2021-04-12 10:06:33
举报
文章被收录于专栏:Eleanor的专栏Eleanor的专栏

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这个实现。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Jetpack 简介
  • Lifecycles使用
  • 源码分析
    • 实现LifecycleOwner,完成生命周期监听
      • OnLifecycleEvent注解
      • 接口LifeOwner
      • 抽象类Lifecycle
      • ReportFragment完成生命周期监听
    • 状态转换
      • LifecycleRegistry.handleLifecycleEvent()
    • 事件派发
      • ReflectiveGenericLifecycleObserver
      • 反射调用监听event的方法
    • UML类图
    相关产品与服务
    数据保险箱
    数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档