1. Lifecycle
抽象类,定义了Event
及State
, 以及添加和移除Observer
的接口
2.1 Event & State
- Event对应生命周期事件
- getTargetState
获取事件发生后进入的状态
- upTo & downTo
正向和反向到达指定状态需要的事件 (对照状态和事件变化的图)
- upFrom & downFrom
从指定状态出发进入下一个状态(正向和反向)需要的事件
- getTargetState
- State对应生命周期状态
- isAtLeast(State)
当前状态是否则少为 State 指定的状态, 很多时候需要至少在组件 STARTED 的状态下才工作
- isAtLeast(State)
2.2 LifecycleRegistry
Lifecycle
的实现类,实现了Lifecycle
的抽象方法,同时在handleLifecycleEvent
方法中完成了在事件来到时对所有Observer
的状态同步和调用。
2.2.1 LifecycleObserver
标记接口, 实现了该接口的类可以内注册为生命周期的观察者
2.2.2 ObserverWithState
- LifecycleEventObserver
对
LifecycleObserver
接口的拓展,当生命周期发生变化时调用onStateChanged
方法
public interface LifecycleEventObserver extends LifecycleObserver {
void onStateChanged(LifecycleOwner source, Lifecycle.Event event);
}
- ObserverWithState
对生命周期观察者和生命周期状态的封装,在
LifecycleRegistry
的addObserver
的是现在中会将LifecycleObserver
封装成ObserverWithState
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;
}
}
- LifecycleEventObserver实例的获取
Lifecycling.lifecycleEventObserver(observer)
static LifecycleEventObserver lifecycleEventObserver(Object object) { // 这两个条件一般都不符合 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); }
- ReflectiveGenericLifecycleObserver
实现LifecycleEventObserver
接口,一般我们都过注解写的生命周期处理方法都会包装成该类,最后执行到对应方法。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); } }
2.2.3 handleLifecycleEvent
具有生命周期的对象(LifecycleOwner
),如Activity
和Fragment
,其内部会持有一个Lifecycle
的实例,该实例维护了一组生命周期观察者,在组件生命周期发生变化时,Lifecycle
会对生命周期观察者的相应方法进行调用。LifecycleOwner
的生命周期事件如何传递到Lifecycle
实例会在下面分析,这里这要知道生命周期发生变更后会调用到对应Lifecycle
实例的handleLifecycleEvent
方法进行处理。
-
handleLifecycleEvent
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) { // 当前状态的下一个状态 State next = getStateAfter(event); // 移动到新的状态 moveToState(next); } 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); } private void moveToState(State next) { if (mState == next) { return; } mState = next; if (mHandlingEvent || mAddingObserverCounter != 0) { mNewEventOccurred = true; // we will figure out what to do on upper level. return; } mHandlingEvent = true; sync(); // 同步状态 mHandlingEvent = false; }
-
sync 同步状态
同步mState
和ObserverWithState
的状态
生命周期状态的变化参考上图有上下两条路线, 上面从CREATED到RESUMED, 下面从RESUMED回到CREATED在进入DESTROYED
同步操作主要有两个判断
- Lifecycle实例的mState < 最早的Observer的mState
由于Lifecycle实例的mState是领先的(它的状态先变化再去同步Observer的mState),因此这种情况出现在下面那条路线中,走
backwardPass
方法。 - Lifecycle实例的mState > 最新的Observer的mStat
上面那条路线,走
forwardPass
方法。
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; // 1) if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) { backwardPass(lifecycleOwner); } // 2) Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest(); if (!mNewEventOccurred && newest != null && mState.compareTo(newest.getValue().mState) > 0) { forwardPass(lifecycleOwner); } } mNewEventOccurred = false; } // 判断状态是否已经同步了 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; }
- Lifecycle实例的mState < 最早的Observer的mState
2. LifecycleOwner
LifecycleOwner
是一个接口,表示持有生命周期实例的组件,如Activity
和Fragment
,提供getLifecycle
方法用来返回一个Lifecycle
的实例。对于Activity
来说,它在ComponentActivity
中实现了该接口。
public interface LifecycleOwner {
Lifecycle getLifecycle();
}
2.1 ComponentActivity
实现了LifecycleOwner
接口, 返回一个LifecycleRegistry
实例。在onCreate
生命周期方法中调用ReportFragment.injectIfNeededIn(this)
,使用ReportFragment
来完成生命周期的监听。
2.2 ReportFragment
监听Activity的生命周期,并进行对应的处理
以onActivityCreated
方法为例,其他方法类似:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dispatchCreate(mProcessListener); // 给Application用的暂时不用管
dispatch(Lifecycle.Event.ON_CREATE);
}
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) {
// 进入到上面所说的handleLifecycleEvent方法里面
((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
}
}
}
3. ProcessLifecycleOwner
提供应用程序进程的生命周期,可以用来监控应用的前后台切换。