硬核講解 Jetpack 之 LifeCycle 源碼篇

前一篇 硬核講解 Jetpack 之 LifeCycle 使用篇 主要介紹了 LifeCycle 存在的意義,基本和進(jìn)階的使用方法。今天話不多說(shuō),直接開(kāi)始擼源碼。

本文基于我手里的 android_9.0.0_r45 源碼,所有相關(guān)源碼包括注釋都上傳到了我的 Github ,可以直接 clone 下來(lái)對(duì)照文章查看。

LifeCycle 三劍客

在正式閱讀源碼之前,很有必要先介紹幾個(gè)名詞,LifecycleOwner ,LifecycleObserver,Lifecycle

LifecycleOwner 是一個(gè)接口 , 接口通常用來(lái)聲明具備某種能力。LifecycleOwner 的能力就是具有生命周期。典型的生命周期組件有 ActivityFragment 。當(dāng)然,我們也可以自定義生命周期組件。LifecycleOwner 提供了 getLifecycle() 方法來(lái)獲取其 Lifecycle 對(duì)象。

public interface LifecycleOwner {

    @NonNull
    Lifecycle getLifecycle();
}

LifecycleObserver 是生命周期觀察者,它是一個(gè)空接口。它沒(méi)有任何方法,依賴 OnLifecycleEvent 注解來(lái)接收生命周期回調(diào)。

public interface LifecycleObserver {

}

生命周期組件生命周期觀察者 都有了,Lifecycle 就是它們之間的橋梁。

Lifecycle 是具體的生命周期對(duì)象,每個(gè) LifecycleOwner 都會(huì)持有 Lifecycle 。通過(guò) Lifecycle 我們可以獲取當(dāng)前生命周期狀態(tài),添加/刪除 生命周期觀察者等等。

Lifecycle 內(nèi)部定義了兩個(gè)枚舉類,EventState 。Event 表示生命周期事件,與 LifecycleOwner 的生命周期事件是相對(duì)應(yīng)的。

public enum Event {
    /**
     * Constant for onCreate event of the {@link LifecycleOwner}.
     */
    ON_CREATE,
    /**
     * Constant for onStart event of the {@link LifecycleOwner}.
     */
    ON_START,
    /**
     * Constant for onResume event of the {@link LifecycleOwner}.
     */
    ON_RESUME,
    /**
     * Constant for onPause event of the {@link LifecycleOwner}.
     */
    ON_PAUSE,
    /**
     * Constant for onStop event of the {@link LifecycleOwner}.
     */
    ON_STOP,
    /**
     * Constant for onDestroy event of the {@link LifecycleOwner}.
     */
    ON_DESTROY,
    /**
     * An {@link Event Event} constant that can be used to match all events.
     */
    ON_ANY
}

ON_ANY 比較特殊,它表示任意生命周期事件。為什么要設(shè)計(jì) ON_ANY 呢?其實(shí)我也不知道,暫時(shí)還沒(méi)發(fā)現(xiàn)它的用處。

另一個(gè)枚舉類 State 表示生命周期狀態(tài)。

public enum State {
        /**
         * 在此之后,Lifecycle 不會(huì)再派發(fā)生命周期事件。
         * 此狀態(tài)在 Activity.onDestroy() 之前
         */
        DESTROYED,

        /**
         * 在 Activity 已經(jīng)實(shí)例化但未 onCreate() 之前
         */
        INITIALIZED,

        /**
         * 在 Activity 的 onCreate() 之后到 onStop() 之前
         */
        CREATED,

        /**
         * 在 Activity 的 onStart() 之后到 onPause() 之前
         */
        STARTED,

        /**
         * 在 Activity 的 onResume() 之后
         */
        RESUMED;

        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }

State 可能相對(duì)比較難以理解,特別是其中枚舉值的順序。這里先不詳細(xì)解讀,但是務(wù)必記住這幾個(gè)枚舉值的順序,DESTROYED —— INITIALIZED —— CREATED —— STARTED ——RESUMED,這個(gè)對(duì)于后面源碼的理解特別重要。

簡(jiǎn)單梳理一下三劍客的關(guān)系。生命周期組件 LifecycleOwner 在進(jìn)入特定的生命周期后,發(fā)送特定的生命周期事件 Event ,通知 Lifcycle 進(jìn)入特定的 State ,進(jìn)而回調(diào)生命周期觀察者 LifeCycleObserver 的指定方法。

從 addObserver() 下手

面對(duì)源碼無(wú)從下手的話,我們就從 Lifecycle 的基本使用入手。

lifecycle.addObserver(LocationUtil( ))

lifecycle 其實(shí)就是 getLifecycle()方法,只是在 Kotlin中被 簡(jiǎn)寫了。getLifecycle() 是接口 LifecycleOwner 的方法。而 AppCompatActivity 并沒(méi)有直接實(shí)現(xiàn) LifecycleOwner,它的父類 FragmentActivity 也沒(méi)有,在它的爺爺類 ComponentActivity 中才找到 LifecycleOwner 的蹤影,看一下接口的實(shí)現(xiàn)。

@Override
public Lifecycle getLifecycle() {
    return mLifecycleRegistry;
}

mLifecycleRegistryLifecycleRegistry 對(duì)象,LifecycleRegistryLifeCycle 的實(shí)現(xiàn)類。那么這里的 LifecycleRegistry 就是我們的生命周期對(duì)象了。來(lái)看一下它的 addObserver() 方法。

> LifecycleRegistry.java

......

// 保存 LifecycleObserver 及其對(duì)應(yīng)的 State
private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =
        new FastSafeIterableMap<>();

 // 當(dāng)前生命周期狀態(tài)
private State mState;

/**
 * 添加生命周期觀察者 LifecycleObserver
 * 另外要注意生命周期事件的 “倒灌”,如果在 onResume() 中調(diào)用 addObserver(),
 * 那么,觀察者依然可以接收到 onCreate 和 onStart 事件。
 * 這么做的目的是保證 mObserverMap 中的 LifecycleObserver 始終保持在同一狀態(tài)
 */
@Override
public void addObserver(@NonNull LifecycleObserver observer) {
    State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
    // ObserverWithState 是一個(gè)靜態(tài)內(nèi)部類
    ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
    ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);

    if (previous != null) {
        return;
    }
    LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
    if (lifecycleOwner == null) {
        // it is null we should be destroyed. Fallback quickly
        return;
    }

    // 判斷是否重入
    boolean isReentrance = mAddingObserverCounter != 0 || mHandlinengEvent;
    State targetState = calculateTargetState(observer);
    mAddingObserverCounter++;

    // 如果觀察者的初始狀態(tài)小于 targetState ,則同步到 targetState
    while ((statefulObserver.mState.compareTo(targetState) < 0
            && mObserverMap.contains(observer))) {
        pushParentState(statefulObserver.mState);
        statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
        popParentState();
        // mState / subling may have been changed recalculate
        targetState = calculateTargetState(observer);
    }

    if (!isReentrance) {
        // we do sync only on the top level.
        sync();
    }
    mAddingObserverCounter--;
}

這里面要注意兩個(gè)問(wèn)題。第一個(gè)問(wèn)題是生命周期的 "倒灌問(wèn)題" ,這是我從 LiveData 那里借來(lái)的一次詞。具體是什么問(wèn)題呢?來(lái)舉一個(gè)例子,即使你在 onResume( ) 中調(diào)用 addObserver( ) 方法來(lái)添加觀察者,觀察者依然可以依次接收到 onCreateonStart 事件 ,最終同步到 targetState 。這個(gè) targetState 是通過(guò) calculateTargetState(observer) 方法計(jì)算出來(lái)的。

/**
 * 計(jì)算出的 targetState 一定是小于等于當(dāng)前 mState 的
 */
  private State calculateTargetState(LifecycleObserver observer) {
    // 獲取當(dāng)前 Observer 的前一個(gè) Observer
      Entry<LifecycleObserver, ObserverWithState> previous = mObserverMap.ceil(observer);

      State siblingState = previous != null ? previous.getValue().mState : null;
  // 無(wú)重入情況下可不考慮 parentState ,為 null
      State parentState = !mParentStates.isEmpty() ? mParentStates.get(mParentStates.size() - 1)
              : null;
      return min(min(mState, siblingState), parentState);
  }

我們可以添加多個(gè)生命周期觀察者,這時(shí)候就得注意維護(hù)它們的狀態(tài)。每次添加新的觀察者的初始狀態(tài)是 INITIALIZED ,需要把它同步到當(dāng)前生命周期狀態(tài),確切的說(shuō),同步到一個(gè)不大于當(dāng)前狀態(tài)的 targetState 。從源碼中的計(jì)算方式也有所體現(xiàn),targetState當(dāng)前狀態(tài) mState,mObserverMap 中最后一個(gè)觀察者的狀態(tài)有重入情況下 parentState 的狀態(tài) 這三者中的最小值。

為什么要取這個(gè)最小值呢?我是這么理解的,當(dāng)有新的生命周期事件時(shí),需要將 mObserverMap 中的所有觀察者都同步到新的同一狀態(tài),這個(gè)同步過(guò)程可能尚未完成,所以新加入的觀察者只能先同步到最小狀態(tài)。注意在 addObserver 方法的 while 循環(huán)中,新的觀察者每改變一次生命周期,都會(huì)調(diào)用 calculateTargetState() 重新計(jì)算 targetState 。

最終的穩(wěn)定狀態(tài)下,沒(méi)有生命周期切換,沒(méi)有添加新的觀察者,mObserverMap 中的所有觀察者應(yīng)該處于同一個(gè)生命周期狀態(tài)。

誰(shuí)來(lái)分發(fā)生命周期事件?

觀察者已經(jīng)添加完成了,那么如何將生命周期的變化通知觀察者呢?

再回到 ComponentActivity ,你會(huì)發(fā)現(xiàn)里面并沒(méi)有重寫所有的生命周期函數(shù)。唯一讓人可疑的就只有 onCreate() 當(dāng)中的一行代碼。

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mSavedStateRegistryController.performRestore(savedInstanceState);
    ReportFragment.injectIfNeededIn(this);
    if (mContentLayoutId != 0) {
        setContentView(mContentLayoutId);
    }
}

這里的 ReportFragment 就是問(wèn)題的答案。追進(jìn) injectIfNeededIn() 方法。

public static void injectIfNeededIn(Activity activity) {
    // 使用 android.app.FragmentManager 保持兼容
    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();
    }
}

這里向 Activity 注入了一個(gè)沒(méi)有頁(yè)面的 Fragment 。這就讓我想到了一些動(dòng)態(tài)權(quán)限庫(kù)也是這個(gè)套路,通過(guò)注入 Fragment 來(lái)代理權(quán)限請(qǐng)求。不出意外,ReportFragment 才是真正分發(fā)生命周期的地方。

@Override
 public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);
     dispatchCreate(mProcessListener);
     dispatch(Lifecycle.Event.ON_CREATE);
 }

 @Override
 public void onStart() {
     super.onStart();
     dispatchStart(mProcessListener);
     dispatch(Lifecycle.Event.ON_START);
 }

 @Override
 public void onResume() {
     super.onResume();
     dispatchResume(mProcessListener);
     dispatch(Lifecycle.Event.ON_RESUME);
 }

 @Override
 public void onPause() {
     super.onPause();
     dispatch(Lifecycle.Event.ON_PAUSE);
 }

 @Override
 public void onStop() {
     super.onStop();
     dispatch(Lifecycle.Event.ON_STOP);
 }

 @Override
 public void onDestroy() {
     super.onDestroy();
     dispatch(Lifecycle.Event.ON_DESTROY);
     // just want to be sure that we won't leak reference to an activity
     mProcessListener = null;
 }

mProcessListener 是處理應(yīng)用進(jìn)程生命周期的,暫時(shí)不去管它。

先看一下 dispatch() 方法。

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) {
            // 調(diào)用 LifecycleRegistry.handleLifecycleEvent() 方法
            ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
        }
    }
}

ReportFragment 的各個(gè)生命周期函數(shù)中通過(guò) dispatch() 方法來(lái)分發(fā)生命周期事件, 然后調(diào)用 LifecycleRegistryhandleLifecycleEvent() 方法來(lái)處理 。為了方便后面的代碼理解,這里假定 現(xiàn)在要經(jīng)歷從 onStart() 同步到 onResume() 的過(guò)程,即handleLifecycleEvent() 方法中的參數(shù)是 ON_RESUME 。

// 設(shè)置當(dāng)前狀態(tài)并通知觀察者
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
    State next = getStateAfter(event);
    moveToState(next);
}

getStateAfter() 的作用是根據(jù) Event 獲取事件之后處于的狀態(tài) ,并通知觀察者同步到此生命周期狀態(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;
    }
    throw new IllegalArgumentException("Unexpected event value " + event);
}

參數(shù)是 ON_RESUME ,所以需要同步到的狀態(tài)是 RESUMED 。接下來(lái)看看 moveToState() 方法的邏輯。

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;
}

首先將要同步到的生命周期狀態(tài)賦給當(dāng)前生命周期狀態(tài) mState ,此時(shí) mState 的值就是 RESUMED 。然后調(diào)用 sync() 方法同步所有觀察者的狀態(tài)。

private void sync() {
    LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
    if (lifecycleOwner == null) {
        Log.w(LOG_TAG, "LifecycleOwner is garbage collected, you shouldn't try dispatch "
                + "new events from it.");
        return;
    }
    while (!isSynced()) {
        mNewEventOccurred = false;
        // mState 是當(dāng)前狀態(tài),如果 mState 小于 mObserverMap 中的狀態(tài)值,調(diào)用 backwardPass()
        if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
            backwardPass(lifecycleOwner);
        }
        Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
        // 如果 mState 大于 mObserverMap 中的狀態(tài)值,調(diào)用 forwardPass()
        if (!mNewEventOccurred && newest != null
                && mState.compareTo(newest.getValue().mState) > 0) {
            forwardPass(lifecycleOwner);
        }
    }
    mNewEventOccurred = false;
}

這里會(huì)比較 mStatemObserverMap 中觀察者的 State 值,判斷是需要向前還是向后同步狀態(tài)?,F(xiàn)在 mState 的值是 RESUMED , 而觀察者還停留在上一狀態(tài) STARTED ,所以觀察者的狀態(tài)都得往前挪一步,這里調(diào)用的是 forwardPass() 方法。

private void forwardPass(LifecycleOwner lifecycleOwner) {
    Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
            mObserverMap.iteratorWithAdditions();
    while (ascendingIterator.hasNext() && !mNewEventOccurred) {
        Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
        ObserverWithState observer = entry.getValue();
        // 向上傳遞事件,直到 observer 的狀態(tài)值等于當(dāng)前狀態(tài)值
        while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                && mObserverMap.contains(entry.getKey()))) {
            pushParentState(observer.mState);
            // 分發(fā)生命周期事件
            observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
            popParentState();
        }
    }
}

forwardPass() 會(huì)同步 mObserverMap 中的所有觀察者到指定生命周期狀態(tài),如果跨度比較大,會(huì)依次分發(fā)中間狀態(tài)。分發(fā)生命周期事件最終依賴 ObserverWithStatedispatchEvent() 方法。

這里先暫停存檔一下,不繼續(xù)往下追源碼。上面假定的場(chǎng)景是 ON_STARTON_RESUME 的過(guò)程?,F(xiàn)在假定另一個(gè)場(chǎng)景,我直接按下 Home 鍵返回桌面,當(dāng)前 Activity 的生命周期從onResumedonPaused ,流程如下。

  1. ReportFragment 調(diào)用 dispatch(Lifecycle.Event.ON_PAUSE) ,分發(fā) ON_PAUSE

  2. 調(diào)用 LifecycleRegistry.handleLifecycleEvent() 方法,參數(shù)是 ON_PAUSE

  3. getStateAfter() 得到要同步到的狀態(tài)是 STARTED ,并賦給 mState,接著調(diào)用 moveToState()

  4. moveToState(Lifecycle.State.STARTED) 中調(diào)用 sync() 方法同步

  5. sync() 方法中,mState 的值是 STARTED ,而 mObserverMap 中觀察者的狀態(tài)都是 RESUMED 。所以觀察者們都需要往后挪一步,這調(diào)用的就是 backwardPass() 方法。

backwardPass() 方法其實(shí)和 forwardPass() 差不多。

private void backwardPass(LifecycleOwner lifecycleOwner) {
    Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
            mObserverMap.descendingIterator();
    while (descendingIterator.hasNext() && !mNewEventOccurred) {
        Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();
        ObserverWithState observer = entry.getValue();
        // 向下傳遞事件,直到 observer 的狀態(tài)值等于當(dāng)前狀態(tài)值
        while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
                && mObserverMap.contains(entry.getKey()))) {
            Event event = downEvent(observer.mState);
            pushParentState(getStateAfter(event));
            // 分發(fā)生命周期事件
            observer.dispatchEvent(lifecycleOwner, event);
            popParentState();
        }
    }
}

二者唯一的區(qū)別就是獲取要分發(fā)的事件,一個(gè)是 upEvent() ,一個(gè)是 downEvent()

upEvent() 是獲取 state 升級(jí)所需要經(jīng)歷的事件,downEvent() 是獲取 state 降級(jí)所需要經(jīng)歷的事件。

private static Event upEvent(State state) {
    switch (state) {
        case INITIALIZED:
        case DESTROYED:
            return ON_CREATE;
        case CREATED:
            return ON_START;
        case STARTED:
            return ON_RESUME;
        case RESUMED:
            throw new IllegalArgumentException();
    }
    throw new IllegalArgumentException("Unexpected state value " + state);
}

private static Event downEvent(State state) {
    switch (state) {
        case INITIALIZED:
            throw new IllegalArgumentException();
        case CREATED:
            return ON_DESTROY;
        case STARTED:
            return ON_STOP;
        case RESUMED:
            return ON_PAUSE;
        case DESTROYED:
            throw new IllegalArgumentException();
    }
    throw new IllegalArgumentException("Unexpected state value " + state);
}

STARTEDRESUMED 需要升級(jí),upEvent(STARTED) 的返回值是 ON_RESUME 。
RESUMEDSTARTED 需要降級(jí),downEvent(RESUMED)的返回值是 ON_PAUSE 。

看到這不知道你有沒(méi)有一點(diǎn)懵,State 和 Event 的關(guān)系我也摸索了很長(zhǎng)一段時(shí)間才理清楚。首先還記得 State 的枚舉值順序嗎?

DESTROYED —— INITIALIZED —— CREATED —— STARTED —— RESUMED

DESTROYED 最小,RESUMED 最大 。onResume 進(jìn)入到 onPause 階段最后分發(fā)的生命周期事件的確是 ON_PAUSE ,但是將觀察者的狀態(tài)置為了 STARTED 。這是為什么呢?

關(guān)于 StateEvent 的關(guān)系,官網(wǎng)給出了一張圖,如下所所示:

[圖片上傳失敗...(image-60675b-1582731355051)]

但我不得不說(shuō),畫的的確有點(diǎn)抽象,其實(shí)應(yīng)該換個(gè)畫法。再來(lái)一張我在 這里 看到的一張圖:

狀態(tài)之間的事件,事件之后的狀態(tài),狀態(tài)之間的大小 ,是不是有種一目了然的感覺(jué)?理解這幅圖很重要,可以說(shuō)搞不清 Event 和 State 的關(guān)系,就看不懂 Lifecycle 的源碼。

誰(shuí)來(lái)回調(diào)你的注解方法 ?

再讀取剛才的暫停存檔,同步 Observer 生命周期的 sync() 方法最終會(huì)調(diào)用 ObserverWithStatedispatchEvent() 方法。

static class ObserverWithState {
    State mState;
    GenericLifecycleObserver mLifecycleObserver;

    ObserverWithState(LifecycleObserver observer, State initialState) {
        mLifecycleObserver = Lifecycling.getCallback(observer);
        mState = initialState;
    }

    void dispatchEvent(LifecycleOwner owner, Event event) {
        State newState = getStateAfter(event);
        mState = min(mState, newState);
        // ReflectiveGenericLifecycleObserver.onStateChanged()
        mLifecycleObserver.onStateChanged(owner, event);
        mState = newState;
    }
}

mLifecycleObserver 通過(guò) Lifecycling.getCallback() 方法賦值。

@NonNull
static GenericLifecycleObserver getCallback(Object object) {
    if (object instanceof FullLifecycleObserver) {
        return new FullLifecycleObserverAdapter((FullLifecycleObserver) object);
    }

    if (object instanceof GenericLifecycleObserver) {
        return (GenericLifecycleObserver) object;
    }

    final Class<?> klass = object.getClass();
    int type = getObserverConstructorType(klass);
    // 獲取 type
    // GENERATED_CALLBACK 表示注解生成的代碼
    // REFLECTIVE_CALLBACK 表示使用反射
    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);
}

如果使用的是 DefaultLifecycleObserver ,而 DefaultLifecycleObserver 又是繼承 FullLifecycleObserver 的,所以這里會(huì)返回 FullLifecycleObserverAdapter

如果只是普通的 LifecycleObserver ,那么就需要通過(guò) getObserverConstructorType() 方法判斷使用的是注解還是反射。

private static int getObserverConstructorType(Class<?> klass) {
    if (sCallbackCache.containsKey(klass)) {
        return sCallbackCache.get(klass);
    }
    int type = resolveObserverCallbackType(klass);
    sCallbackCache.put(klass, type);
    return type;
}

private static int resolveObserverCallbackType(Class<?> klass) {
    // anonymous class bug:35073837
    // 匿名內(nèi)部類使用反射
    if (klass.getCanonicalName() == null) {
        return REFLECTIVE_CALLBACK;
    }

    // 尋找注解生成的 GeneratedAdapter 類
    Constructor<? extends GeneratedAdapter> constructor = generatedConstructor(klass);
    if (constructor != null) {
        sClassToAdapters.put(klass, Collections
                .<Constructor<? extends GeneratedAdapter>>singletonList(constructor));
        return GENERATED_CALLBACK;
    }

    // 尋找被 OnLifecycleEvent 注解的方法
    boolean hasLifecycleMethods = ClassesInfoCache.sInstance.hasLifecycleMethods(klass);
    if (hasLifecycleMethods) {
        return REFLECTIVE_CALLBACK;
    }

    // 沒(méi)有找到注解生成的 GeneratedAdapter 類,也沒(méi)有找到 OnLifecycleEvent 注解,
    // 則向上尋找父類
    Class<?> superclass = klass.getSuperclass();
    List<Constructor<? extends GeneratedAdapter>> adapterConstructors = null;
    if (isLifecycleParent(superclass)) {
        if (getObserverConstructorType(superclass) == REFLECTIVE_CALLBACK) {
            return REFLECTIVE_CALLBACK;
        }
        adapterConstructors = new ArrayList<>(sClassToAdapters.get(superclass));
    }

    // 尋找是否有接口實(shí)現(xiàn)
    for (Class<?> intrface : klass.getInterfaces()) {
        if (!isLifecycleParent(intrface)) {
            continue;
        }
        if (getObserverConstructorType(intrface) == REFLECTIVE_CALLBACK) {
            return REFLECTIVE_CALLBACK;
        }
        if (adapterConstructors == null) {
            adapterConstructors = new ArrayList<>();
        }
        adapterConstructors.addAll(sClassToAdapters.get(intrface));
    }
    if (adapterConstructors != null) {
        sClassToAdapters.put(klass, adapterConstructors);
        return GENERATED_CALLBACK;
    }

    return REFLECTIVE_CALLBACK;
}

注意其中的 hasLifecycleMethods() 方法。

boolean hasLifecycleMethods(Class klass) {
    if (mHasLifecycleMethods.containsKey(klass)) {
        return mHasLifecycleMethods.get(klass);
    }

    Method[] methods = getDeclaredMethods(klass);
    for (Method method : methods) {
        OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);
        if (annotation != null) {
            createInfo(klass, methods);
            return true;
        }
    }
    mHasLifecycleMethods.put(klass, false);
    return false;
}

這里會(huì)去尋找 OnLifecycleEvent 注解。所以我們通過(guò) OnLifecycleEvent 注解實(shí)現(xiàn)的 MyObserver 的類型是 REFLECTIVE_CALLBACK ,表示使用反射調(diào)用。注意另一個(gè)類型 GENERATED_CALLBACK 表示使用注解生成的代碼,而不是反射。

所以,所以,Lifecycle 可以選擇使用 apt 編譯期生成代碼來(lái)避免使用運(yùn)行時(shí)反射,以優(yōu)化性能?好像還真是這么一回事。這就讓我想到了 EventBus 的索引加速 默認(rèn)也是關(guān)閉的??窗桑@就是閱讀源碼的好處,總能發(fā)現(xiàn)自己的知識(shí)盲區(qū)。添加下列依賴,來(lái)提速 LifeCycle 吧 !

kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"

為了方便解析,還是回到反射調(diào)用上來(lái)。

我們自己定義的在普通的觀察者調(diào)用的是 ReflectiveGenericLifecycleObserver.onStateChanged() 。

class ReflectiveGenericLifecycleObserver implements GenericLifecycleObserver {
    private final Object mWrapped; // Observer 對(duì)象
    private final CallbackInfo mInfo; // 反射獲取注解信息

    ReflectiveGenericLifecycleObserver(Object wrapped) {
        mWrapped = wrapped;
        mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
    }

    @Override
    public void onStateChanged(LifecycleOwner source, Event event) {
        // 調(diào)用 ClassesInfoCache.CallbackInfo.invokeCallbacks()
        mInfo.invokeCallbacks(source, event, mWrapped);
    }
}

再追進(jìn) ClassesInfoCache.CallbackInfo.invokeCallbacks() 方法。

void invokeCallbacks(LifecycleOwner source, Lifecycle.Event event, Object target) {
    // 不僅分發(fā)了當(dāng)前生命周期事件,還分發(fā)了 ON_ANY
    invokeMethodsForEvent(mEventToHandlers.get(event), source, event, target);
    invokeMethodsForEvent(mEventToHandlers.get(Lifecycle.Event.ON_ANY), source, event,
            target);
}

private static void invokeMethodsForEvent(List<MethodReference> handlers,
        LifecycleOwner source, Lifecycle.Event event, Object mWrapped) {
    if (handlers != null) {
        for (int i = handlers.size() - 1; i >= 0; i--) {
            handlers.get(i).invokeCallback(source, event, mWrapped);
        }
    }
}

void invokeCallback(LifecycleOwner source, Lifecycle.Event event, Object target) {
    //noinspection TryWithIdenticalCatches
    try {
        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;
        }
    } catch (InvocationTargetException e) {
        throw new RuntimeException("Failed to call observer method", e.getCause());
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}

其實(shí)就很簡(jiǎn)單了,反射調(diào)用 OnLifecycleEvent 注解標(biāo)記的生命周期回調(diào)方法。

Wait For More

本想再接著分析進(jìn)程生命周期 ProcessLifecycleOwnerLifecycle 的協(xié)程使用相關(guān)源碼,可是文章篇幅有點(diǎn)過(guò)長(zhǎng)了,就留到下一篇吧,敬請(qǐng)期待!

參考和推薦

下面幾篇文章同樣優(yōu)秀,直接仔細(xì)研讀,推薦給大家。

文章首發(fā)微信公眾號(hào): 秉心說(shuō) , 專注 Java 、 Android 原創(chuàng)知識(shí)分享,LeetCode 題解。

更多最新原創(chuàng)文章,掃碼關(guān)注我吧!

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

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

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