Android Jetpack組件是庫的集合,這些庫是為協(xié)同工作而構(gòu)建的,不過也可以單獨采用,同時利用Kotlin語言功能幫助您提高工作效率??扇渴褂?,也可混合搭配!

1.什么是 Lifecycle?:它是可以感知 Activity、 Fragment 的生命周期,并將變化通知到已注冊的觀察者。讓代碼符合生命周期規(guī)范,有效的避免了內(nèi)存泄漏等問題。
2.基本使用:被動的通知 View層生命周期變化讓邏輯層擁有 LifecycleOwner對象,因為view層實現(xiàn)了 LifecycleOwner接口,所以可以在view層初始化的時候,直接賦值,有了 LifecycleOwner對象,就可以通過 getLifecycle方法獲取到 Lifecycle對象了(附圖片)。

-
Lifecycle有4個比較重要的類:LifecycleOwner,LifecycleObserver、Lifecycle和LifecycleRegistry。
3.1 LifecycleOwner,它是一個接口,我們現(xiàn)在用的 Androidx包下的 AppcompatActivty和 Fragment都默認實現(xiàn)了 LifecycleOwner這個接口,這個接口提供了 getLifecycle() 方法來獲取其 Lifecycle 對象。
也就是上面說的直接在 Activity添加 addObserver(new CustomObserver())就能感知 Activity生命周期了。

3.2 LifecycleObserver,它是一個空的接口,這個接口只是來標志這個是對Lifecycle的觀察者,內(nèi)部沒有任何方法,全部都依賴于OnLifecycleEvent注解

3.3 Lifecycle,它是一個抽象的類,定義了2個枚舉類Event和State,addObserver和removeObserver方法。

3.4 LifecycleRegistry:它是 Lifecycle 的唯一實現(xiàn)類。主要用來注冊觀察者( LifecycleObserver),以及分發(fā)宿主狀態(tài)給它們(可以處理多個觀察者)
上面簡單看了下四個類的源碼。真正的源碼如下所示
在看源碼之前,,我們可能產(chǎn)生幾個疑問
- Lifecycle是怎樣感知生命周期的?
- Lifecycle是如何處理生命周期的?
- LifecycleObserver的方法是怎么回調(diào)的呢?
- 為什么LifecycleObserver可以感知到Activity的生命周期?
源碼解析(以LifeCycleActivity.class為例):

上圖中1標注的我們拆分成2步:
getLifecycle()和addObserver()①先看
getLifecycle():它是ComponentActivity里面的
mLifecycleRegistry 是 LifecycleRegistry 對象,LifecycleRegistry 是 LifeCycle 的子類;
②addObserver()

上面代碼可看出,
addObserver()干了以下幾件事:1、可以添加多個觀察者,這時候需要維護他們的狀態(tài),每次添加新的觀察者的初始狀態(tài)是
INITIALIZED;2、然后把
LifecycleObserver包裝成ObserverWithState;3、把
Observer添加到map集合中。觀察者已經(jīng)添加完成了,那么如何將生命周期的變化通知觀察者呢?
再會到
ComponentActivity中,仔細看下ComponentActivity的onCreate()方法有一個ReportFragment.injectIfNeededIn(this);它初始化了一個
ReportFragment,仔細看下ReportFragment源碼可知,它是向Activity添加了一個沒有頁面的Fragment,并且ReportFragment中的各個生命周期都調(diào)用了dispatch(Lifecycle.Event event) 方法,它里面的參數(shù)就是傳遞了不同的
Event值,再仔細看dispatch里面干了2件事:(1)如果
Activity實現(xiàn)了LifecycleRegistryOwner接口的話,就調(diào)用LifecycleRegistryOwner的handleLifecycleEvent的方法;(2)如果
Activity實現(xiàn)了LifecycleOwner接口的話,就調(diào)用LifecycleRegistry的handleLifecycleEvent的方法;經(jīng)過我們上面的介紹,
Activity是實現(xiàn)了LifecycleOwner的接口,所以會執(zhí)行LifecycleRegistry的handleLifecycleEvent的方法。
看到這里我們可以回答第4中的前2個問題了。
接下來看下handleLifecycleEvent方法
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
State next = getStateAfter(event);
moveToState(next);
}
1.首先根據(jù)需要分發(fā)的事件,獲取宿主當前處于什么狀態(tài)
假設分發(fā)的是 ON_START 事件,那么根據(jù) getStateAfter() 方法我們可以知道,宿主當前是處于STARTED 狀態(tài)。
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;
}
2.根據(jù)第一步獲取的宿主狀態(tài)設置當前的狀態(tài)并通知觀察者
private void moveToState(State next) {
if (mState == next) {
return;
}
//設置當前狀態(tài)
mState = next;
...
//通知觀察者
sync();
}
下面來看一下 sync方法:
private void sync() {
while (!isSynced()) {
//如果宿主當前的狀態(tài) 小于 mObserverMap 集合中最先添加的那個觀察者的狀態(tài)
//則說明宿主可能發(fā)生了狀態(tài)回退,比如當前是 RESUMED 狀態(tài),執(zhí)行了onPause 則回退到STARTED 狀態(tài)
//此時調(diào)用 backwardPass 給集合中的每個一觀察者分發(fā)一個 on_pause 事件,并同步它的狀態(tài)。
if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
backwardPass(lifecycleOwner);
}
//如果宿主當前狀態(tài) 大于 mObserverMap 集合中最先添加的那個觀察者的狀態(tài)
//則說明宿主可能發(fā)生了狀態(tài)前進,比如當前是 STARTED 狀態(tài),執(zhí)行了onResume 則前進到RESUMED 狀態(tài)
//此時調(diào)用 forwardPass 給集合中的每個一觀察者分發(fā)一個 on_resume 事件,并同步它的狀態(tài)。
Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
if (!mNewEventOccurred && newest != null
&& mState.compareTo(newest.getValue().mState) > 0) {
forwardPass(lifecycleOwner);
}
}
mNewEventOccurred = false;
}
ObserverWithState源碼分析
ObserverWithState 是LifecycleRegistry中持有觀察者及其狀態(tài)的內(nèi)部類。
static class ObserverWithState {
State mState;
LifecycleEventObserver mLifecycleObserver;
//把傳入的 LifecycleObserver 適配成 LifecycleEventObserver,目的是為了統(tǒng)一事件的分發(fā)形式。
//在之前的文章里介紹過實現(xiàn)觀察者有三種形式,每一種接收的事件類型都不一樣,如果在分發(fā)的時候不統(tǒng)一事件分發(fā)的形式,將會變得很麻煩
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);
//執(zhí)行事件分發(fā)
mLifecycleObserver.onStateChanged(owner, event);
mState = newState;
}
至此LifeCycle源碼講解完成,希望能大家有幫助,謝謝