硬核講解 Jetpack 之 LifeCycle 源碼篇

前一篇 硬核講解 Jetpack 之 LifeCycle 使用篇 主要介紹了 LifeCycle 存在的意義,基本和進階的使用方法。今天話很少說,直接開始擼源碼。java

本文基於我手裏的 android_9.0.0_r45 源碼,全部相關源碼包括註釋都上傳到了個人 Github ,能夠直接 clone 下來對照文章查看。android

LifeCycle 三劍客

在正式閱讀源碼以前,頗有必要先介紹幾個名詞,LifecycleOwnerLifecycleObserverLifecyclegit

LifecycleOwner 是一個接口 , 接口一般用來聲明具有某種能力。LifecycleOwner 的能力就是具備生命週期。典型的生命週期組件有 ActivityFragment 。固然,咱們也能夠自定義生命週期組件。LifecycleOwner 提供了 getLifecycle() 方法來獲取其 Lifecycle 對象。github

public interface LifecycleOwner {

    @NonNull
    Lifecycle getLifecycle();
}

LifecycleObserver 是生命週期觀察者,它是一個空接口。它沒有任何方法,依賴 OnLifecycleEvent 註解來接收生命週期回調。web

public interface LifecycleObserver {

}

生命週期組件生命週期觀察者 都有了,Lifecycle 就是它們之間的橋樑。微信

Lifecycle 是具體的生命週期對象,每一個 LifecycleOwner 都會持有 Lifecycle 。經過 Lifecycle 咱們能夠獲取當前生命週期狀態,添加/刪除 生命週期觀察者等等。架構

Lifecycle 內部定義了兩個枚舉類,EventStateEvent 表示生命週期事件,與 LifecycleOwner 的生命週期事件是相對應的。app

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 比較特殊,它表示任意生命週期事件。爲何要設計 ON_ANY 呢?其實我也不知道,暫時還沒發現它的用處。ide

另外一個枚舉類 State 表示生命週期狀態。svg

public enum State {
        /**
         * 在此以後,Lifecycle 不會再派發生命週期事件。
         * 此狀態在 Activity.onDestroy() 以前
         */
        DESTROYED,

        /**
         * 在 Activity 已經實例化但未 onCreate() 以前
         */
        INITIALIZED,

        /**
         * 在 Activity 的 onCreate() 以後到 onStop() 以前
         */
        CREATED,

        /**
         * 在 Activity 的 onStart() 以後到 onPause() 以前
         */
        STARTED,

        /**
         * 在 Activity 的 onResume() 以後
         */
        RESUMED;

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

State 可能相對比較難以理解,特別是其中枚舉值的順序。這裏先不詳細解讀,可是務必記住這幾個枚舉值的順序,DESTROYED —— INITIALIZED —— CREATED —— STARTED ——RESUMED,這個對於後面源碼的理解特別重要。

簡單梳理一下三劍客的關係。生命週期組件 LifecycleOwner 在進入特定的生命週期後,發送特定的生命週期事件 Event ,通知 Lifcycle 進入特定的 State ,進而回調生命週期觀察者 LifeCycleObserver 的指定方法。

從 addObserver() 下手

面對源碼無從下手的話,咱們就從 Lifecycle 的基本使用入手。

lifecycle.addObserver(LocationUtil( ))

lifecycle 其實就是 getLifecycle()方法,只是在 Kotlin中被 簡寫了。getLifecycle() 是接口 LifecycleOwner 的方法。而 AppCompatActivity 並無直接實現 LifecycleOwner,它的父類 FragmentActivity 也沒有,在它的爺爺類 ComponentActivity 中才找到 LifecycleOwner 的蹤跡,看一下接口的實現。

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

mLifecycleRegistryLifecycleRegistry 對象,LifecycleRegistryLifeCycle 的實現類。那麼這裏的 LifecycleRegistry 就是咱們的生命週期對象了。來看一下它的 addObserver() 方法。

> LifecycleRegistry.java

......

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

 // 當前生命週期狀態
private State mState;

/**
 * 添加生命週期觀察者 LifecycleObserver
 * 另外要注意生命週期事件的 「倒灌」,若是在 onResume() 中調用 addObserver(),
 * 那麼,觀察者依然能夠接收到 onCreate 和 onStart 事件。
 * 這麼作的目的是保證 mObserverMap 中的 LifecycleObserver 始終保持在同一狀態
 */
@Override
public void addObserver(@NonNull LifecycleObserver observer) {
    State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
    // ObserverWithState 是一個靜態內部類
    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++;

    // 若是觀察者的初始狀態小於 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--;
}

這裏面要注意兩個問題。第一個問題是生命週期的 "倒灌問題" ,這是我從 LiveData 那裏借來的一次詞。具體是什麼問題呢?來舉一個例子,即便你在 onResume( ) 中調用 addObserver( ) 方法來添加觀察者,觀察者依然能夠依次接收到 onCreateonStart 事件 ,最終同步到 targetState 。這個 targetState 是經過 calculateTargetState(observer) 方法計算出來的。

/**
 * 計算出的 targetState 必定是小於等於當前 mState 的
 */
  private State calculateTargetState(LifecycleObserver observer) {
    // 獲取當前 Observer 的前一個 Observer
      Entry<LifecycleObserver, ObserverWithState> previous = mObserverMap.ceil(observer);

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

咱們能夠添加多個生命週期觀察者,這時候就得注意維護它們的狀態。每次添加新的觀察者的初始狀態是 INITIALIZED ,須要把它同步到當前生命週期狀態,確切的說,同步到一個不大於當前狀態的 targetState 。從源碼中的計算方式也有所體現,targetState當前狀態 mStatemObserverMap 中最後一個觀察者的狀態有重入狀況下 parentState 的狀態 這三者中的最小值。

爲何要取這個最小值呢?我是這麼理解的,當有新的生命週期事件時,須要將 mObserverMap 中的全部觀察者都同步到新的同一狀態,這個同步過程可能還沒有完成,因此新加入的觀察者只能先同步到最小狀態。注意在 addObserver 方法的 while 循環中,新的觀察者每改變一次生命週期,都會調用 calculateTargetState() 從新計算 targetState

最終的穩定狀態下,沒有生命週期切換,沒有添加新的觀察者,mObserverMap 中的全部觀察者應該處於同一個生命週期狀態。

誰來分發生命週期事件?

觀察者已經添加完成了,那麼如何將生命週期的變化通知觀察者呢?

再回到 ComponentActivity ,你會發現裏面並無重寫全部的生命週期函數。惟一讓人可疑的就只有 onCreate() 當中的一行代碼。

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

這裏的 ReportFragment 就是問題的答案。追進 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 注入了一個沒有頁面的 Fragment 。這就讓我想到了一些動態權限庫也是這個套路,經過注入 Fragment 來代理權限請求。不出意外,ReportFragment 纔是真正分發生命週期的地方。

@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 是處理應用進程生命週期的,暫時不去管它。

先看一下 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) {
            // 調用 LifecycleRegistry.handleLifecycleEvent() 方法
            ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
        }
    }
}

ReportFragment 的各個生命週期函數中經過 dispatch() 方法來分發生命週期事件, 而後調用 LifecycleRegistryhandleLifecycleEvent() 方法來處理 。爲了方便後面的代碼理解,這裏假定 如今要經歷從 onStart() 同步到 onResume() 的過程,即handleLifecycleEvent() 方法中的參數是 ON_RESUME

// 設置當前狀態並通知觀察者
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
    State next = getStateAfter(event);
    moveToState(next);
}

getStateAfter() 的做用是根據 Event 獲取事件以後處於的狀態 ,並通知觀察者同步到今生命週期狀態。

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

參數是 ON_RESUME ,因此須要同步到的狀態是 RESUMED 。接下來看看 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;
}

首先將要同步到的生命週期狀態賦給當前生命週期狀態 mState ,此時 mState 的值就是 RESUMED 。而後調用 sync() 方法同步全部觀察者的狀態。

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 是當前狀態,若是 mState 小於 mObserverMap 中的狀態值,調用 backwardPass()
        if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
            backwardPass(lifecycleOwner);
        }
        Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
        // 若是 mState 大於 mObserverMap 中的狀態值,調用 forwardPass()
        if (!mNewEventOccurred && newest != null
                && mState.compareTo(newest.getValue().mState) > 0) {
            forwardPass(lifecycleOwner);
        }
    }
    mNewEventOccurred = false;
}

這裏會比較 mStatemObserverMap 中觀察者的 State 值,判斷是須要向前仍是向後同步狀態。如今 mState 的值是 RESUMED , 而觀察者還停留在上一狀態 STARTED ,因此觀察者的狀態都得往前挪一步,這裏調用的是 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 的狀態值等於當前狀態值
        while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                && mObserverMap.contains(entry.getKey()))) {
            pushParentState(observer.mState);
            // 分發生命週期事件
            observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
            popParentState();
        }
    }
}

forwardPass() 會同步 mObserverMap 中的全部觀察者到指定生命週期狀態,若是跨度比較大,會依次分發中間狀態。分發生命週期事件最終依賴 ObserverWithStatedispatchEvent() 方法。

這裏先暫停存檔一下,不繼續往下追源碼。上面假定的場景是 ON_STARTON_RESUME 的過程。如今假定另外一個場景,我直接按下 Home 鍵返回桌面,當前 Activity 的生命週期從onResumedonPaused ,流程以下。

  1. ReportFragment 調用 dispatch(Lifecycle.Event.ON_PAUSE) ,分發 ON_PAUSE

  2. 調用 LifecycleRegistry.handleLifecycleEvent() 方法,參數是 ON_PAUSE

  3. getStateAfter() 獲得要同步到的狀態是 STARTED ,並賦給 mState,接着調用 moveToState()

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

  5. sync() 方法中,mState 的值是 STARTED ,而 mObserverMap 中觀察者的狀態都是 RESUMED 。因此觀察者們都須要日後挪一步,這調用的就是 backwardPass() 方法。

backwardPass() 方法其實和 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 的狀態值等於當前狀態值
        while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
                && mObserverMap.contains(entry.getKey()))) {
            Event event = downEvent(observer.mState);
            pushParentState(getStateAfter(event));
            // 分發生命週期事件
            observer.dispatchEvent(lifecycleOwner, event);
            popParentState();
        }
    }
}

兩者惟一的區別就是獲取要分發的事件,一個是 upEvent() ,一個是 downEvent()

upEvent() 是獲取 state 升級所須要經歷的事件,downEvent() 是獲取 state 降級所須要經歷的事件。

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 須要升級,upEvent(STARTED) 的返回值是 ON_RESUME
RESUMEDSTARTED 須要降級,downEvent(RESUMED)的返回值是 ON_PAUSE

看到這不知道你有沒有一點懵,State 和 Event 的關係我也摸索了很長一段時間才理清楚。首先還記得 State 的枚舉值順序嗎?

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

DESTROYED 最小,RESUMED 最大 。onResume 進入到 onPause 階段最後分發的生命週期事件的確是 ON_PAUSE ,可是將觀察者的狀態置爲了 STARTED 。這是爲何呢?

關於 StateEvent 的關係,官網給出了一張圖,以下所所示:

但我不得不說,畫的的確有點抽象,其實應該換個畫法。再來一張我在 這裏 看到的一張圖:

狀態之間的事件事件以後的狀態狀態之間的大小 ,是否是有種一目瞭然的感受?理解這幅圖很重要,能夠說搞不清 Event 和 State 的關係,就看不懂 Lifecycle 的源碼。

誰來回調你的註解方法 ?

再讀取剛纔的暫停存檔,同步 Observer 生命週期的 sync() 方法最終會調用 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 經過 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 的,因此這裏會返回 FullLifecycleObserverAdapter

若是隻是普通的 LifecycleObserver ,那麼就須要經過 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
    // 匿名內部類使用反射
    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;
    }

    // 沒有找到註解生成的 GeneratedAdapter 類,也沒有找到 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));
    }

    // 尋找是否有接口實現
    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;
}

這裏會去尋找 OnLifecycleEvent 註解。因此咱們經過 OnLifecycleEvent 註解實現的 MyObserver 的類型是 REFLECTIVE_CALLBACK ,表示使用反射調用。注意另外一個類型 GENERATED_CALLBACK 表示使用註解生成的代碼,而不是反射。

因此,因此,Lifecycle 能夠選擇使用 apt 編譯期生成代碼來避免使用運行時反射,以優化性能?好像還真是這麼一回事。這就讓我想到了 EventBus 的索引加速 默認也是關閉的。看吧,這就是閱讀源碼的好處,總能發現本身的知識盲區。添加下列依賴,來提速 LifeCycle 吧 !

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

爲了方便解析,仍是回到反射調用上來。

咱們本身定義的在普通的觀察者調用的是 ReflectiveGenericLifecycleObserver.onStateChanged()

class ReflectiveGenericLifecycleObserver implements GenericLifecycleObserver {
    private final Object mWrapped; // Observer 對象
    private final CallbackInfo mInfo; // 反射獲取註解信息

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

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

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

void invokeCallbacks(LifecycleOwner source, Lifecycle.Event event, Object target) {
    // 不只分發了當前生命週期事件,還分發了 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);
    }
}

其實就很簡單了,反射調用 OnLifecycleEvent 註解標記的生命週期回調方法。

Wait For More

本想再接着分析進程生命週期 ProcessLifecycleOwnerLifecycle 的協程使用相關源碼,但是文章篇幅有點過長了,就留到下一篇吧,敬請期待!

參考和推薦

下面幾篇文章一樣優秀,直接仔細研讀,推薦給你們。

文章首發微信公衆號: 秉心說 , 專一 Java 、 Android 原創知識分享,LeetCode 題解。

更多最新原創文章,掃碼關注我吧!

相關文章
相關標籤/搜索