Lifecycle 是一个专门用来处理生命周期的库,它能够帮助我们将 Acitivity、Framgent 的生命周期处理与业务逻辑处理进行解耦,让我们能够更加专注于业务; 基于 Lifecycle 的特性,在任意生命周期方法内注册观察者都能接收到完整的生命周期事件,比如在onResume 中注册一个观察者它会依次收到 LifecycleEvent.onCreate -> LifecycleEvent.onStart -> LifecycleEvent.onResume 事件。
相关依赖库如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 dependencies { def lifecycle_version = "2.3.0" def arch_version = "2.1.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version " implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version " implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version " implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version " implementation "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha01" kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version " implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version " implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version " implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version " implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:$lifecycle_version " testImplementation "androidx.arch.core:core-testing:$arch_version " }
相关类介绍:
Lifecycle 抽象类,用于管理 Observer,包括 Event 和 State 两个枚举类型。
LifecycleOwner 持有 Lifecycle 类的接口。如 AppCompatActivity 和 Fragment。
LifecycleObserver 生命周期观察者,直接实现类有 LifecycleEventObserver 和 FullLifecycleObserver 。
LifecycleRegistry Lifecycle 的实现类。可以自定义 LifecycleOwner。
Lifecycle 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 public abstract class Lifecycle { public abstract void addObserver (LifecycleObserver observer) ; public abstract void removeObserver (LifecycleObserver observer) ; 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, STARTED, RESUMED; public boolean isAtLeast (State state) { return compareTo(state) >= 0 ; } } }
Lifecycle 是一个抽象类,其内部不仅包括了添加和移除观察者的方法,还包括 Event 和 State 枚举。State 指的是 Lifecycle 的生命周期所处的状态。Event 代表 Lifecycle 生命周期对应的事件,这些事件会映射到 Activity 和 Fragment 中的回调事件中。
LifecycleRegistry 1 2 3 4 5 6 7 8 9 10 11 12 public class LifecycleRegistry extends Lifecycle { public LifecycleRegistry (@NonNull LifecycleOwner provider) { this (provider, true ); } private LifecycleRegistry (@NonNull LifecycleOwner provider, boolean enforceMainThread) { mLifecycleOwner = new WeakReference <>(provider); mState = INITIALIZED; mEnforceMainThread = enforceMainThread; } }
LifecycleRegistry 是 Lifecycle 的实现类。必须在主线程。对目标对象是弱引用,不会导致 Activity 内存泄漏。
源码分析 ComponentActivity 和 Fragment 都实现了 LifecycleOwner 接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public class ComponentActivity extends androidx .core.app.ComponentActivity implements LifecycleOwner ,... { private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry (this ); @Override protected void onCreate (@Nullable Bundle savedInstanceState) { super .onCreate(savedInstanceState); ReportFragment.injectIfNeededIn(this ); } @CallSuper @Override protected void onSaveInstanceState (@NonNull Bundle outState) { Lifecycle lifecycle = getLifecycle(); if (lifecycle instanceof LifecycleRegistry) { ((LifecycleRegistry) lifecycle).setCurrentState(Lifecycle.State.CREATED); } super .onSaveInstanceState(outState); } @Override public Lifecycle getLifecycle () { return mLifecycleRegistry; } }
Activity 的生命周期代理给 ReportFragment 分发。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 public class ReportFragment extends Fragment { public static void injectIfNeededIn (Activity activity) { if (Build.VERSION.SDK_INT >= 29 ) { activity.registerActivityLifecycleCallbacks( new LifecycleCallbacks ()); } 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 onActivityCreated (Bundle savedInstanceState) { super .onActivityCreated(savedInstanceState); dispatch(Lifecycle.Event.ON_CREATE); } private void dispatch (@NonNull Lifecycle.Event event) { if (Build.VERSION.SDK_INT < 29 ) { dispatch(getActivity(), event); } } static void dispatch (@NonNull Activity activity, @NonNull Lifecycle.Event event) { 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); } } } static class LifecycleCallbacks implements Application .ActivityLifecycleCallbacks { @Override public void onActivityPostCreated (@NonNull Activity activity, @Nullable Bundle savedInstanceState) { dispatch(activity, Lifecycle.Event.ON_CREATE); } @Override public void onActivityPrePaused (@NonNull Activity activity) { dispatch(activity, Lifecycle.Event.ON_PAUSE); } } }
在 API 29 及以上直接使用 Activity#registerActivityLifecycleCallbacks 直接注册了生命周期回调,然后给当前 activity 添加一个无界面的 ReportFragment 代理生命周期回调。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 public class Fragment implements LifecycleOwner ,...{ LifecycleRegistry mLifecycleRegistry; public Fragment () { initLifecycle(); } private void initLifecycle () { mLifecycleRegistry = new LifecycleRegistry (this ); } @Override public Lifecycle getLifecycle () { return mLifecycleRegistry; } void performCreate (Bundle savedInstanceState) { onCreate(savedInstanceState); mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); } void performPause () { mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); onPause(); } }
观察者都是通过 LifecycleRegistry
类注册的,是 Lifecycle 的唯一实现类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 public class LifecycleRegistry extends Lifecycle { private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap = new FastSafeIterableMap <>(); private final WeakReference<LifecycleOwner> mLifecycleOwner; private State mState; public LifecycleRegistry (@NonNull LifecycleOwner provider) { mLifecycleOwner = new WeakReference <>(provider); mState = INITIALIZED; } public void handleLifecycleEvent (@NonNull Lifecycle.Event event) { State next = getStateAfter(event); moveToState(next); } private void moveToState (State next) { if (mState == next) { return ; } mState = next; if (mHandlingEvent || mAddingObserverCounter != 0 ) { mNewEventOccurred = true ; return ; } mHandlingEvent = true ; sync(); mHandlingEvent = false ; } private void sync () { LifecycleOwner lifecycleOwner = mLifecycleOwner.get(); if (lifecycleOwner == null ) { throw new IllegalStateException ("LifecycleOwner of this LifecycleRegistry is already" + "garbage collected. It is too late to change lifecycle state." ); } while (!isSynced()) { mNewEventOccurred = false ; if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0 ) { backwardPass(lifecycleOwner); } Map.Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest(); if (!mNewEventOccurred && newest != null && mState.compareTo(newest.getValue().mState) > 0 ) { forwardPass(lifecycleOwner); } } mNewEventOccurred = false ; } private void backwardPass (LifecycleOwner lifecycleOwner) { Iterator<Map.Entry<LifecycleObserver, ObserverWithState>> descendingIterator = mObserverMap.descendingIterator(); while (descendingIterator.hasNext() && !mNewEventOccurred) { Map.Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next(); ObserverWithState observer = entry.getValue(); while ((observer.mState.compareTo(mState) > 0 && ...)) { Event event = Event.downFrom(observer.mState); observer.dispatchEvent(lifecycleOwner, event); } } } private void forwardPass (LifecycleOwner lifecycleOwner) { Iterator<Map.Entry<LifecycleObserver, ObserverWithState>> ascendingIterator = mObserverMap.iteratorWithAdditions(); while (ascendingIterator.hasNext() && !mNewEventOccurred) { Map.Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next(); ObserverWithState observer = entry.getValue(); while ((observer.mState.compareTo(mState) < 0 && ...)) { final Event event = Event.upFrom(observer.mState); observer.dispatchEvent(lifecycleOwner, event); } } } @Override public void addObserver (@NonNull LifecycleObserver observer) { State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED; ObserverWithState statefulObserver = new ObserverWithState (observer, initialState); ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver); if (previous != null ) { return ; } State targetState = calculateTargetState(observer); while ((statefulObserver.mState.compareTo(targetState) < 0 && mObserverMap.contains(observer))) { final Event event = Event.upFrom(statefulObserver.mState); statefulObserver.dispatchEvent(lifecycleOwner, event); targetState = calculateTargetState(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) { mLifecycleObserver.onStateChanged(owner, event); } } }
ObserverWithState#mState 的作用是新的事件触发后 遍历通知所有观察者时,判断是否已经通知这个观察者了,即防止重复通知。
如果在目标对象 RESUMED 状态注册观察者,那么观察者会接收到三次生命周期事件:
第一次:分发 ON_CREATE 事件,观察者状态 INITIALIZED->CREATED
第二次:分发 ON_START 事件,观察者状态 CREATED->STARTED
第三次:分发 ON_RESUME 事件,观察者状态 STARTED->RESUMED
1 2 3 4 5 6 7 8 9 10 11 12 13 public class Lifecycling { static LifecycleEventObserver lifecycleEventObserver (Object object) { final Class<?> klass = object.getClass(); int type = getObserverConstructorType(klass); if (type == GENERATED_CALLBACK) { } return new ReflectiveGenericLifecycleObserver (object); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 class ReflectiveGenericLifecycleObserver implements LifecycleEventObserver { private final Object mWrapped; private final CallbackInfo mInfo; ReflectiveGenericLifecycleObserver(Object wrapped) { mWrapped = wrapped; mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass()); } @Override public void onStateChanged (@NonNull LifecycleOwner source, @NonNull Event event) { mInfo.invokeCallbacks(source, event, mWrapped); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 final class ClassesInfoCache { private final Map<Class<?>, CallbackInfo> mCallbackMap = new HashMap <>(); private final Map<Class<?>, Boolean> mHasLifecycleMethods = new HashMap <>(); CallbackInfo getInfo (Class<?> klass) { CallbackInfo existing = mCallbackMap.get(klass); if (existing != null ) { return existing; } existing = createInfo(klass, null ); return existing; } private CallbackInfo createInfo (Class<?> klass, @Nullable Method[] declaredMethods) { Map<MethodReference, Lifecycle.Event> handlerToEvent = new HashMap <>(); Method[] methods = declaredMethods != null ? declaredMethods : getDeclaredMethods(klass); boolean hasLifecycleMethods = false ; for (Method method : methods) { OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class); if (annotation == null ) { continue ; } hasLifecycleMethods = true ; Class<?>[] params = method.getParameterTypes(); int callType = CALL_TYPE_NO_ARG; MethodReference methodReference = new MethodReference (callType, method); verifyAndPutHandler(handlerToEvent,; methodReference, event, klass); } CallbackInfo info = new CallbackInfo (handlerToEvent); mCallbackMap.put(klass, info); mHasLifecycleMethods.put(klass, hasLifecycleMethods); return info; } static class CallbackInfo { final Map<Lifecycle.Event, List<MethodReference>> mEventToHandlers; final Map<MethodReference, Lifecycle.Event> mHandlerToEvent; CallbackInfo(Map<MethodReference, Lifecycle.Event> handlerToEvent) { mHandlerToEvent = handlerToEvent; mEventToHandlers = new HashMap <>(); } void invokeCallbacks (LifecycleOwner source, Lifecycle.Event event, Object target) { invokeMethodsForEvent(mEventToHandlers.get(event), source, event, target); invokeMethodsForEvent(mEventToHandlers.get(Lifecycle.Event.ON_ANY), source, event, target); } private static void invokeMethodsForEvent (List<MethodReference> handlers,...) { for (int i = handlers.size() - 1 ; i >= 0 ; i--) { handlers.get(i).invokeCallback(source, event, mWrapped); } } } static final class MethodReference { void invokeCallback (LifecycleOwner source, Lifecycle.Event event, Object target) { switch (mCallType) { case CALL_TYPE_NO_ARG: mMethod.invoke(target); break ; case CALL_TYPE_PROVIDER: mMethod.invoke(target, source); break ; case CALL_TYPE_PROVIDER_WITH_EVENT: mMethod.invoke(target, source, event); break ; } } } }
总结
Activity 或 Fragemnt 的生命周期是通过 ReportFragment 实现的。
注册观察者,通过反射
收集观察者中被 OnLifecycleEvent
注解的方法,封装成 ObserverWithState
保存在 mObserverMap
中。
同步观察者状态。如果间隔多个状态,观察者会依次收到多个生命周期事件,直到状态一致。
收到事件时,从 mObserverMap
中获取观察者信息,通过反射回调观察者中的方法。
参考 [1]Lifecycle - developer [2] Jetpack架构组件库-Lifecycle源码解析之知其所以然