Android Lifecycle机制探究
Android Lifecycle机制探究
前言
为学习Android Jetpack组件,了解ViewModel、LiveData原理,Lifecycle是绕不开的一环
Lifecyle
LifecycleObserver
引入:在控制Activity生命周期时,常常会在onStop或者onResume中写很多开关控制语句,防止内存泄漏等,不好维护;同时onStart有耗时任务,则onStop结束后而耗时任务还没完成,导致内存泄漏
目的:用于构建生命周期感知型组件的类和接口.生命周期感知型组件可执行操作来响应另一个组件(如 activity 和 fragment)的生命周期状态的变化
特点:采用观察者模式
核心组件
- LifecycleOwner:被观察者, Activity与Fragment
- LifecycleObserber: 观察者,自己业务组件需要继承该类
- Lifecycle:存储有关组件的生命周期状态信息
基本概念
State与Event
State
- DESTROYED: 不会再分发事件
- INITIALIZED: 刚创建时
- CREATED: 已创建
- STARTED
- RESUMED
public enum class State {
/**
* Destroyed state for a LifecycleOwner. After this event, this Lifecycle will not dispatch
* any more events. For instance, for an [android.app.Activity], this state is reached
* **right before** Activity's [onDestroy][android.app.Activity.onDestroy] call.
*/
DESTROYED,
/**
* Initialized state for a LifecycleOwner. For an [android.app.Activity], this is
* the state when it is constructed but has not received
* [onCreate][android.app.Activity.onCreate] yet.
*/
INITIALIZED,
/**
* Created state for a LifecycleOwner. For an [android.app.Activity], this state
* is reached in two cases:
*
* * after [onCreate][android.app.Activity.onCreate] call;
* * **right before** [onStop][android.app.Activity.onStop] call.
*
*/
CREATED,
/**
* Started state for a LifecycleOwner. For an [android.app.Activity], this state
* is reached in two cases:
*
* * after [onStart][android.app.Activity.onStart] call;
* * **right before** [onPause][android.app.Activity.onPause] call.
*
*/
STARTED,
/**
* Resumed state for a LifecycleOwner. For an [android.app.Activity], this state
* is reached after [onResume][android.app.Activity.onResume] is called.
*/
RESUMED;
/**
* Compares if this State is greater or equal to the given `state`.
*
* @param state State to compare with
* @return true if this State is greater or equal to the given `state`
*/
public fun isAtLeast(state: State): Boolean {
return compareTo(state) >= 0
}
}
Event
- ON_CREATE
- ON_START
- ON_RESUME
- ON_PAUSE
- ON_STOP
- ON_DESTORY
- ON_ANY: 匹配任何的事件
Core
LifecyleOwner
被观察者,指向持有Lifecycle的对象
public interface LifecycleOwner {
public val lifecycle: Lifecycle
}
LifecycleObserver
观察者,自己业务组件需要继承该类
public interface LifecycleObserver
Lifecycle
具有生命周期的类的实际实现类
public abstract class Lifecycle {
@MainThread
public abstract fun addObserver(observer: LifecycleObserver)
@MainThread
public abstract fun removeObserver(observer: LifecycleObserver)
// 当前对象生命状态
@get:MainThread
public abstract val currentState: State
}
LifecycleRegistry
Lifecycle的具体实现类,能够处理状态变化时对多个Observer的通知
open class LifecycleRegistry private constructor(
provider: LifecycleOwner,
private val enforceMainThread: Boolean
) : Lifecycle() {
constructor(provider: LifecycleOwner) : this(provider, true)
init {
lifecycleOwner = WeakReference(provider)
}
// 维系Observer的Map
private var observerMap = FastSafeIterableMap<LifecycleObserver, ObserverWithState>()
// 当前状态
private var state: State = State.INITIALIZED
/**
* The provider that owns this Lifecycle.
* Only WeakReference on LifecycleOwner is kept, so if somebody leaks Lifecycle, they won't leak
* the whole Fragment / Activity. However, to leak Lifecycle object isn't great idea neither,
* because it keeps strong references on all other listeners, so you'll leak all of them as
* well.
*/
private val lifecycleOwner: WeakReference<LifecycleOwner>
}
简单使用
自定义Observer类继承DefaultLifecycleObserver接口,并重写onResume等默认方法,并在Activity onCreate时,通过lifeCycle.addObserver添加响应Observer即可。一个Activity可以add多个Observer
Android26以后 Activity中默认持有lifeCycle对象,实例为LifeCycleRegistry,自动持有LifecycleOwner的弱引用。且实现了LifecycleOwner接口,已返回lifecycle对象
原理探究
Native如何实现Lifecycle?
Native如何接入Lifecycle?
在AppCompatActivity - FragmentActvity - ComponentActivity 中实现了 LifecycleOwner 接口,并持有lifeCycleRegistry对象,直接进行了初始化
// ComponentActivity
private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 将生命周期事件传递给ReportFragment
ReportFragment.injectIfNeededIn(this);
if (mContentLayoutId != 0) {
setContentView(mContentLayoutId);
}
}
// ReportFragment
public static void injectIfNeededIn(Activity activity) {
if (Build.VERSION.SDK_INT >= 29) {
// 核心方法,但此处先不看这里
// On API 29+, we can register for the correct Lifecycle callbacks directly
LifecycleCallbacks.registerIn(activity);
}
// Prior to API 29 and to maintain compatibility with older versions of
// ProcessLifecycleOwner (which may not be updated when lifecycle-runtime is updated and
// need to support activities that don't extend from FragmentActivity from support lib),
// use a framework fragment to get the correct timing of Lifecycle events
// 将该Fragment通过FragmetnManager添加到Activity中
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();
}
}
因此处理Lifecycle回调的核心类应该是ReportFragment, 那SDK < 29时,什么时候进行回调呢,猜测应该是在Fragment的生命周期中有相关回调
// ReportFragment
@Override
public void onStart() {
super.onStart();
dispatchStart(mProcessListener);
dispatch(Lifecycle.Event.ON_START);
}
private void dispatch(@NonNull Lifecycle.Event event) {
// 如果SDK小于29 则自己进行dispatch,如果大于29,则通过之前的mActivityLifecycleCallbacks进行回调
if (Build.VERSION.SDK_INT < 29) {
// Only dispatch events from ReportFragment on API levels prior
// to API 29. On API 29+, this is handled by the ActivityLifecycleCallbacks
// added in ReportFragment.injectIfNeededIn
dispatch(getActivity(), event);
}
}
static void dispatch(@NonNull Activity activity, @NonNull Lifecycle.Event event) {
// 殊途同归,根据Activity实现接口类型不同最终还是调用到LifecycleRegistry的handleLifecycleEvent方法
// Deprecated
if (activity instanceof LifecycleRegistryOwner) {
((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
return;
}
if (activity instanceof LifecycleOwner) {
// ComponentActivity.getLifecyle()
Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
if (lifecycle instanceof LifecycleRegistry) {
((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
}
}
}
// LifecycleRegistry
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
enforceMainThreadIfNeeded("handleLifecycleEvent");
moveToState(event.getTargetState());
}
private fun moveToState(next: State) {
if (state == next) {
return
}
check(!(state == State.INITIALIZED && next == State.DESTROYED)) {
"no event down from $state in component ${lifecycleOwner.get()}"
}
state = next
if (handlingEvent || addingObserverCounter != 0) {
newEventOccurred = true
// we will figure out what to do on upper level.
return
}
// 设置字段表明正在处理并分发事件
handlingEvent = true
sync()
handlingEvent = false
if (state == State.DESTROYED) {
observerMap = FastSafeIterableMap()
}
}
// 进行状态变更通知
private fun sync() {
val lifecycleOwner = lifecycleOwner.get()
?: throw IllegalStateException(
"LifecycleOwner of this LifecycleRegistry is already " +
"garbage collected. It is too late to change lifecycle state."
)
while (!isSynced) {
newEventOccurred = false
if (state < observerMap.eldest()!!.value.state) {
backwardPass(lifecycleOwner)
}
val newest = observerMap.newest()
if (!newEventOccurred && newest != null && state > newest.value.state) {
forwardPass(lifecycleOwner)
}
}
newEventOccurred = false
}
// 若最早加入Map的Observer与最晚加入Map的Observer状态一致, 且与当前状态一致,则认为是同步的
private val isSynced: Boolean
get() {
if (observerMap.size() == 0) {
return true
}
val eldestObserverState = observerMap.eldest()!!.value.state
val newestObserverState = observerMap.newest()!!.value.state
return eldestObserverState == newestObserverState && state == newestObserverState
}
先搁置一下这里的sync方法,当SDK >= 29时,生命周期响应又走哪条路线?
@RequiresApi(29)
static class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
// ReportFragment
public static void injectIfNeededIn(Activity activity) {
if (Build.VERSION.SDK_INT >= 29) {
// 核心方法
// On API 29+, we can register for the correct Lifecycle callbacks directly
LifecycleCallbacks.registerIn(activity);
}
}
@RequiresApi(29)
static class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
static void registerIn(Activity activity) {
activity.registerActivityLifecycleCallbacks(new LifecycleCallbacks());
}
@Override
public void onActivityCreated(@NonNull Activity activity,
@Nullable Bundle bundle) {
}
@Override
public void onActivityPostCreated(@NonNull Activity activity,
@Nullable Bundle savedInstanceState) {
// 核心:dispatch对应的Lifecycle Event
dispatch(activity, Lifecycle.Event.ON_CREATE);
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
}
@Override
public void onActivityPostStarted(@NonNull Activity activity) {
dispatch(activity, Lifecycle.Event.ON_START);
}
}
// ReportFragment
companion onbject {
@JvmStatic
internal fun dispatch(activity: Activity, event: Lifecycle.Event) {
if (activity is LifecycleRegistryOwner) {
activity.lifecycle.handleLifecycleEvent(event)
return
}
if (activity is LifecycleOwner) {
val lifecycle = (activity as LifecycleOwner).lifecycle
if (lifecycle is LifecycleRegistry) {
lifecycle.handleLifecycleEvent(event)
}
}
}
}
// Activity
// 添加callback到Activity的mActivityLifecycleCallbacks的集合中
public void registerActivityLifecycleCallbacks(
@NonNull Application.ActivityLifecycleCallbacks callback) {
synchronized (mActivityLifecycleCallbacks) {
mActivityLifecycleCallbacks.add(callback);
}
// Activity(注意不是ComponentActivity, 可能是Android新版本中使用了该监听方式,Lifecycle就直接用原生的监听,而不再使用ComponentActivity中使用ReportFragment生命周期的回调方式)
// 何时进行回调?猜测应该在Activity的生命周期中
@CallSuper
protected void onStart() {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onStart " + this);
mCalled = true;
mFragments.doLoaderStart();
// 核心
dispatchActivityStarted();
getAutofillClientController().onActivityStarted();
}
private void dispatchActivityStarted() {
getApplication().dispatchActivityStarted(this);
// 获取ActvityLifecycleCallback总和
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i = 0; i < callbacks.length; i++) {
((Application.ActivityLifecycleCallbacks) callbacks[i]).onActivityStarted(this);
}
}
}
private Object[] collectActivityLifecycleCallbacks() {
Object[] callbacks = null;
// 此处就用到了上文我们所说的mActivityLifecycleCallbacks集合
synchronized (mActivityLifecycleCallbacks) {
if (mActivityLifecycleCallbacks.size() > 0) {
callbacks = mActivityLifecycleCallbacks.toArray();
}
}
return callbacks;
}
总结一下:
- SDK < 29: 通过ReportFragment的生命周期调用dispatch方法,经过LifecycleRegistry ObserverWithStat LifecycleEventObserver.onStateChanged进行回调
- SDK >= 29: 通过Activity的生命周期进行回调,经过mActivityLifecycleCallbacks 与 LifecycleCallbacks,最终还是进入到ReportFragment的dispatch方法中,其余步骤与之前相同
理解State与Event的转换关系
Lifecycle中对状态与事件的运用不复杂,但需要梳理清上述的逻辑关系,还是需要这张图。
先看一下如下的方法,并理解其与图上的顺序关系
// State
// 由高状态向低状态顺序进发时触发的事件
public fun downFrom(state: State): Event? {
return when (state) {
State.CREATED -> ON_DESTROY
State.STARTED -> ON_STOP
State.RESUMED -> ON_PAUSE
else -> null
}
}
// 由低状态向高状态回退时触发的事件
public fun downTo(state: State): Event? {
return when (state) {
State.DESTROYED -> ON_DESTROY
State.CREATED -> ON_STOP
State.STARTED -> ON_PAUSE
else -> null
}
}
// 由低状态向高状态顺序进发时触发的事件
public fun upFrom(state: State): Event? {
return when (state) {
State.INITIALIZED -> ON_CREATE
State.CREATED -> ON_START
State.STARTED -> ON_RESUME
else -> null
}
}
// 由高状态向低状态回退时触发的事件
public fun upTo(state: State): Event? {
return when (state) {
State.CREATED -> ON_CREATE
State.STARTED -> ON_START
State.RESUMED -> ON_RESUME
else -> null
}
}
// Event
// 返回触发指定事件后的下一个State
public val targetState: State
get() {
when (this) {
ON_CREATE, ON_STOP -> return State.CREATED
ON_START, ON_PAUSE -> return State.STARTED
ON_RESUME -> return State.RESUMED
ON_DESTROY -> return State.DESTROYED
ON_ANY -> {}
}
throw IllegalArgumentException("$this has no target state")
}
forward与backward
回到之前的sync函数,现在开始关注与具体状态转换、事件分发密切相关的backwardPass与forwardPass方法
// 进行状态变更通知
private fun sync() {
val lifecycleOwner = lifecycleOwner.get()
?: throw IllegalStateException(
"LifecycleOwner of this LifecycleRegistry is already " +
"garbage collected. It is too late to change lifecycle state."
)
while (!isSynced) {
newEventOccurred = false
if (state < observerMap.eldest()!!.value.state) {
backwardPass(lifecycleOwner)
}
val newest = observerMap.newest()
if (!newEventOccurred && newest != null && state > newest.value.state) {
forwardPass(lifecycleOwner)
}
}
newEventOccurred = false
}
private fun backwardPass(lifecycleOwner: LifecycleOwner) {
// 获得由新到久添加的Observer排列的Iterator
val descendingIterator = observerMap.descendingIterator()
while (descendingIterator.hasNext() && !newEventOccurred) {
val (key, observer) = descendingIterator.next()
// 当observer的状态超过当前lifecycle状态时,需要将Observer的状态进行回退,并触发状态回退时的一系列事件
while (observer.state > state && !newEventOccurred && observerMap.contains(key)
) {
// 获取顺序进发到下一个状态需要触发到事件
val event = Event.downFrom(observer.state)
?: throw IllegalStateException("no event down from ${observer.state}")
// 暂时不了解
pushParentState(event.targetState)
// observer调用dispatchEvent(一般为业务方法)
observer.dispatchEvent(lifecycleOwner, event)
popParentState()
}
}
}
// 与backwardPass相反
private fun forwardPass(lifecycleOwner: LifecycleOwner) {
// 获得由久到新添加的Observer排列的Iterator
val ascendingIterator: Iterator<Map.Entry<LifecycleObserver, ObserverWithState>> =
observerMap.iteratorWithAdditions()
while (ascendingIterator.hasNext() && !newEventOccurred) {
val (key, observer) = ascendingIterator.next()
// 当observer的状态落后于当前lifecycle状态时,需要将Observer的状态进行前进,并触发状态前进后时的一系列事件
while (observer.state < state && !newEventOccurred && observerMap.contains(key)
) {
pushParentState(observer.state)
// 获取顺序进发到下一个状态需要触发到事件
val event = Event.upFrom(observer.state)
?: throw IllegalStateException("no event up from ${observer.state}")
observer.dispatchEvent(lifecycleOwner, event)
popParentState()
}
}
}
// 这里的Observer实际为ObserverWithState(后续有讲到)
fun dispatchEvent(owner: LifecycleOwner?, event: Event) {
// 更新当前observer状态
val newState = event.targetState
// 采用最小的state(为什么?)
state = min(state, newState)
// 这里才是真正Observer的执行处
lifecycleObserver.onStateChanged(owner!!, event)
state = newState
}
总结一下:
- Backward: state < observer.state, 此时由新到久为每个Observer分发Event
- Forward: state > observer.state, 此时由久到新为每个Observer分发Event
为什么此处需要push/pop ParentState?
先别急,先看一下Lifecycle是如何添加Observer的
添加Observer
我们知道Observer是处理具体的业务逻辑的
以ViewModel为例,在ComponentActivity初始化时添加了对应的LifecycleObserver来处理ViewModel的生命周期【关于ViewModel的生命周期在之前的文章有相关探究】
// ComponentActivity
getLifecycle().addObserver(new LifecycleEventObserver() {
@Override
public void onStateChanged(@NonNull LifecycleOwner source,
@NonNull Lifecycle.Event event) {
// 业务逻辑
if (event == Lifecycle.Event.ON_DESTROY) {
// Clear out the available context
mContextAwareHelper.clearAvailableContext();
// And clear the ViewModelStore
if (!isChangingConfigurations()) {
getViewModelStore().clear();
}
}
}
});
Lifecycle(此处为LifecycleRegistry) 如何添加一个Observer呢?
// LifecyleRegistry
override fun addObserver(observer: LifecycleObserver) {
enforceMainThreadIfNeeded("addObserver")
// state状态设置
val initialState = if (state == State.DESTROYED) State.DESTROYED else State.INITIALIZED
// 包装Observer与State
val statefulObserver = ObserverWithState(observer, initialState)
// 若已存在该Observer, 则不再添加
val previous = observerMap.putIfAbsent(observer, statefulObserver)
if (previous != null) {
return
}
val lifecycleOwner = lifecycleOwner.get()
?: // it is null we should be destroyed. Fallback quickly
return
val isReentrance = addingObserverCounter != 0 || handlingEvent
// 计算应该跳转到的state
var targetState = calculateTargetState(observer)
addingObserverCounter++
// 根据targetState使该observer进行dispatchEvent(同步)
while (statefulObserver.state < targetState && observerMap.contains(observer)
) {
pushParentState(statefulObserver.state)
val event = Event.upFrom(statefulObserver.state)
?: throw IllegalStateException("no event up from ${statefulObserver.state}")
statefulObserver.dispatchEvent(lifecycleOwner, event)
popParentState()
// 需要重新计算targetState
// mState / subling may have been changed recalculate
targetState = calculateTargetState(observer)
}
// 仅当最顶层调用时才同步(性能优化?)
if (!isReentrance) {
// we do sync only on the top level.
sync()
}
addingObserverCounter--
}
// LifecycleRegistry
@Override
public void addObserver(@NonNull LifecycleObserver observer) {
enforceMainThreadIfNeeded("addObserver");
State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
// 将自己写的observer包装为一个ObserverWithState
ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
}
static class ObserverWithState {
State mState;
LifecycleEventObserver mLifecycleObserver;
ObserverWithState(LifecycleObserver observer, State initialState) {
mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
mState = initialState;
}
}
// Lifecycling
// 判断observer的类型并创建对应的Adapter
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);
}
// 自定义的lifecycleobserver是基于DefaultLifecycleObserver,而其又是FullLifecycleObserver的派生类,因此这里往往会构造FullLifecycleObserverAdapter
if (isFullLifecycleObserver) {
return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, null);
}
// ...
}
// LifecycleObserver.ObserverWithState
void dispatchEvent(LifecycleOwner owner, Event event) {
State newState = event.getTargetState();
mState = min(mState, newState);
// 关键方法
mLifecycleObserver.onStateChanged(owner, event);
mState = newState;
}
粘性事件
粘性事件
Android Lifecycle 在对Observer分发事件采取的是粘性分发机制,即一个在Lifecycle处于任一State,新添加一个Observer时状态并不会直接跳到该State,而是从INITIALIZE按序经历多个事件一步步走到指定state。
理解Lifecycle到粘性事件机制有助于理解LiveData的粘性事件,因此先来了解一下Lifecycle粘性事件的原理
原理
当lifecycle添加observer时,会通过calculateTargetState
方法计算出当前observer应该跳转到的暂时的最终状态,并且将该observer状态一步步前进到指定的targetState,并分发相应事件。这里是临时的是因为每次observer回调相关事件时可能会对当前observer、其他observer或lifecycle产生改变,导致targetState产生改变,因此需要重新计算。
// LifecyleRegistry
override fun addObserver(observer: LifecycleObserver) {
// ...
val isReentrance = addingObserverCounter != 0 || handlingEvent
// 计算应该跳转到的state
var targetState = calculateTargetState(observer)
addingObserverCounter++
// 核心: 根据targetState使该observer进行dispatchEvent(同步)
while (statefulObserver.state < targetState && observerMap.contains(observer)
) {
pushParentState(statefulObserver.state)
val event = Event.upFrom(statefulObserver.state)
?: throw IllegalStateException("no event up from ${statefulObserver.state}")
statefulObserver.dispatchEvent(lifecycleOwner, event)
popParentState()
// 需要重新计算targetState
// mState / subling may have been changed recalculate
targetState = calculateTargetState(observer)
}
// 仅当最顶层调用时才同步(性能优化?)
if (!isReentrance) {
// we do sync only on the top level.
sync()
}
addingObserverCounter--
}
看完这段代码,会有两个疑问
- 为什么在进行observer进行事件响应前需要push该observer的state
- 如何进行targetState计算的?
这里将以上两个问题一并解答
targetState计算
// LifecycleRegistry
private fun calculateTargetState(observer: LifecycleObserver): State {
val map = observerMap.ceil(observer)
val siblingState = map?.value?.state
val parentState =
if (parentStates.isNotEmpty()) parentStates[parentStates.size - 1] else null
return min(min(state, siblingState), parentState)
}
// FastSafeIterableMap
// 根据key获取上一个添加到这个map中的元素
@Nullable
public Map.Entry<K, V> ceil(K k) {
if (contains(k)) {
return mHashMap.get(k).mPrevious;
}
return null;
}
FastSafeIterableMap
一个线程不安全的HashMap, 同时支持Iterable遍历,基于添加顺序进行迭遍历
calculateTargetState逻辑:对比三者的状态,取最小值。
- 当前lifecycle的state
- 当前元素的上一个元素(兄弟元素)的state
- parentState栈顶元素的state
那为什么一定需要这三个元素才能计算出targetState呢?
- 为什么需要当前lifecycle的state?
不用说,lifecycle的state是核心条件。
- 为什么需要当前元素的上一个元素的stat?
考虑以下情况:
操作步骤:在Lifecycle生命周期为RESUMED时,添加一个ObserverA,在A的接收的事件为ON_CREATE时,为该lifecycle添加一个observerB,并观察此时Log。
override fun onResume() {
super.onResume()
// 确保lifecycle的状态此时为RESUMED(原理为Activity onResume执行步骤)
// super.onResume()后其生命周期并非立马就为RESUMED
lifecycleScope.launch {
delay(2000)
lifecycle.addObserver(MPLifecycleObserver())
}
}
class MPLifecycleObserver : LifecycleEventObserver {
private val TAG = javaClass.name
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
Log.d(
TAG,
"MPLifecycleObserver onStateChanged: source status: ${source.lifecycle.currentState}, event: ${event.name}"
)
if (event.targetState == Lifecycle.State.CREATED) {
Log.d(TAG, "MPLifecycleObserver add KPLifecycleObserver")
source.lifecycle.addObserver(KPLifecycleObserver())
}
}
}
class KPLifecycleObserver : LifecycleEventObserver {
private val TAG = javaClass.name
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
Log.d(
TAG,
"KPLifecycleObserver onStateChanged: source status: ${source.lifecycle.currentState}, event: ${event.name}"
)
}
}
相关Log:
// Log
MPLifecycleObserver onStateChanged: source status: RESUMED, event: ON_CREATE
MPLifecycleObserver add KPLifecycleObserver
MPLifecycleObserver onStateChanged: source status: RESUMED, event: ON_START
MPLifecycleObserver onStateChanged: source status: RESUMED, event: ON_RESUME
KPLifecycleObserver onStateChanged: source status: RESUMED, event: ON_CREATE
KPLifecycleObserver onStateChanged: source status: RESUMED, event: ON_START
KPLifecycleObserver onStateChanged: source status: RESUMED, event: ON_RESUME
先回顾之前forward与backward的顺序,在状态从小到大进发时,是按照Observer添加先后顺序进行通知的,而在状态由大到小进发时,通知的顺序是Observer添加顺序逆序进行的,这也符合观察先来后到的顺序。(A先于B观察,则A便要慢于B结束观察)
如果没有parentState与siblingState,根据addObserver while循环的逻辑,calculateTargetState计算出的state为lifecycle的state,此时ObserveB将一步一步不停歇地走到lifecycle的state,即为RESUMED,但此时observerA的接收的状态为INITIALIZED ,后添加的Observer就比先添加的Observer的状态更靠后了,这是不符合上述提到的Observer事件接收的顺序的。因此需要维护一个sibling的Observer来维护其state,来保证后添加的observer的state在添加时状态一定小于先添加的Observer。
- 为什么需要parentState这个栈结构?为什么要在通知Observer前进行状态的push与pop?
参照注释中原文⏬
即当在Lifecycle某一生命周期时,此时先删除最后添加的observer,随后再添加一个新的Observer
// we have to keep it for cases:
// void onStart() {
// mRegistry.removeObserver(this);
// mRegistry.add(newObserver);
// }
// newObserver should be brought only to CREATED state during the execution of
// this onStart method. our invariant with observerMap doesn't help, because parent observer
// is no longer in the map.
private var parentStates = ArrayList<State>()
考虑这么一种情况:当lifecycle仅存在observer A一个观察者,在onStart时执行下列两个方法,此时remove A后,由于observerMap为空,再次添加newObserver,发现其mPrevious元素,即上一个添加的元素为空,则此时判断依据就为Lifecycle.state,则就会一步步执行到STARTED生命周期,并调用ON_START方法,但问题是,此时observer A的onStart方法还没有执行或还未执行完毕,这就违背了LifecycleResgistry观察者的同步执行顺序原则。
使用栈结构,则记录了上一个元素的当前状态,便能以此作为依据从而避免该问题产生。
可重入
此处是为了避免嵌套调用sync方法
相关成员变量:
val handlingEvent: Boolean = false // 是否正在执行sync方法
handlingEvent = true
sync()
handlingEvent = false
考虑以下情况:
- 目前Lifecycle有2个Obsevrer A B, 此时在B收到某一生命周期事件后,会再次添加一个Observer C
方法调用栈为:moveToState() -> sync() -> forwardPass() -> obsereverA.dispatchEvent -> obsereverB.dispatchEvent -> lifecycle.addObserver
在addObserver的过程中,由于val isReentrance = addingObserverCounter != 0 || handlingEvent
handlingEvent为true,所以这里标识为重入,则不会执行后续的sync方法
- 目前Lifecycle有2个Obsevrer A B, 此时在B收到某一生命周期事件后,改变lifecycle生命周期
方法调用栈为:moveToState() -> sync() -> forwardPass() -> obsereverA.dispatchEvent -> obsereverB.dispatchEvent -> lifecycle.addObserver
核心
Lifecycle机制核心是通过Activity中回调机制,借助依附Activity中的ReportFragment的生命周期来完成具体回调机制
参考资料 🔗