Jetpack之Lifecycle源碼

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

JetPack組件.png

1.什么是 Lifecycle?:它是可以感知 Activity、 Fragment 的生命周期,并將變化通知到已注冊的觀察者。讓代碼符合生命周期規(guī)范,有效的避免了內(nèi)存泄漏等問題。

2.基本使用:被動的通知 View層生命周期變化讓邏輯層擁有 LifecycleOwner對象,因為view層實現(xiàn)了 LifecycleOwner接口,所以可以在view層初始化的時候,直接賦值,有了 LifecycleOwner對象,就可以通過 getLifecycle方法獲取到 Lifecycle對象了(附圖片)。

image.png

  1. Lifecycle有4個比較重要的類: LifecycleOwner, LifecycleObserverLifecycleLifecycleRegistry。

3.1 LifecycleOwner,它是一個接口,我們現(xiàn)在用的 Androidx包下的 AppcompatActivtyFragment都默認實現(xiàn)了 LifecycleOwner這個接口,這個接口提供了 getLifecycle() 方法來獲取其 Lifecycle 對象。
也就是上面說的直接在 Activity添加 addObserver(new CustomObserver())就能感知 Activity生命周期了。

可以看到LifecycleOwner源碼.png

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

四個類之間的關系 .png

3.3 Lifecycle,它是一個抽象的類,定義了2個枚舉類EventState,addObserverremoveObserver方法。

image.png

3.4 LifecycleRegistry:它是 Lifecycle 的唯一實現(xiàn)類。主要用來注冊觀察者( LifecycleObserver),以及分發(fā)宿主狀態(tài)給它們(可以處理多個觀察者)

上面簡單看了下四個類的源碼。真正的源碼如下所示
在看源碼之前,,我們可能產(chǎn)生幾個疑問

  • Lifecycle是怎樣感知生命周期的?
  • Lifecycle是如何處理生命周期的?
  • LifecycleObserver的方法是怎么回調(diào)的呢?
  • 為什么LifecycleObserver可以感知到Activity的生命周期?

源碼解析(以LifeCycleActivity.class為例):

image.png

上圖中1標注的我們拆分成2步:getLifecycle()addObserver()
①先看getLifecycle():它是ComponentActivity里面的
image.png

mLifecycleRegistryLifecycleRegistry 對象,LifecycleRegistryLifeCycle 的子類;

②addObserver()

image.png

上面代碼可看出,addObserver()干了以下幾件事:
1、可以添加多個觀察者,這時候需要維護他們的狀態(tài),每次添加新的觀察者的初始狀態(tài)是INITIALIZED;
2、然后把LifecycleObserver包裝成ObserverWithState;
3、把Observer添加到map集合中。
觀察者已經(jīng)添加完成了,那么如何將生命周期的變化通知觀察者呢?
再會到ComponentActivity中,仔細看下ComponentActivityonCreate()方法有一個
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)用LifecycleRegistryOwnerhandleLifecycleEvent的方法;
(2)如果Activity實現(xiàn)了LifecycleOwner接口的話,就調(diào)用LifecycleRegistryhandleLifecycleEvent的方法;
經(jīng)過我們上面的介紹,Activity是實現(xiàn)了LifecycleOwner的接口,所以會執(zhí)行LifecycleRegistryhandleLifecycleEvent的方法。

看到這里我們可以回答第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源碼分析
ObserverWithStateLifecycleRegistry中持有觀察者及其狀態(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源碼講解完成,希望能大家有幫助,謝謝

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容