Android架構組件之Lifecycle源碼解析

Lifecycle-Aware是Google官方的生命周期感知組件。同時,在Google推出的Android Jetpack組件中,也將Lifecycle-Aware放在了Architecture類別之中。我們可以利用 android.arch.lifecycle 包提供的類來控制數(shù)據(jù)、監(jiān)聽器等的 lifecycle。同時,LiveData和ViewModel的lifecycle也依賴于Lifecycle框架,所以我們有必要去了解一下Lifecycle。

Google官方Lifecycle組件跟蹤狀態(tài)圖

一、Lifecycle組件初始化

/app/build/intermediates/manifests/full/debug/AndroidManifest.xml,是我們應用在構建完成之后完整生成的AndroidManifest.xml文件。其中,我們可以找到Lifecycle-Aware組件在AndroidManifest的定義。

    <provider
        android:name="android.arch.lifecycle.ProcessLifecycleOwnerInitializer"
        android:authorities="com.boohee.one.lifecycle-trojan"
        android:exported="false"
        android:multiprocess="true" />

ProcessLifecycleOwnerInitializer是ContentProvider的子類,利用其onCreate()生命周期方法,處理Lifecycle組件初始化。因此,這是一種隱式初始化的方式。

    @Override
    public boolean onCreate() {
        LifecycleDispatcher.init(getContext());
        ProcessLifecycleOwner.init(getContext());
        return true;
    }

二、Lifecycle生命周期事件感知

繼續(xù)關注ProcessLifecycleOwnerInitializer的onCreate()方法,其調(diào)用了LifecycleDispatcher的init()方法進行相應初始化。

    static void init(Context context) {
        if (sInitialized.getAndSet(true)) {
            return;
        }
        ((Application) context.getApplicationContext())
                .registerActivityLifecycleCallbacks(new DispatcherActivityCallback());
    }

    @SuppressWarnings("WeakerAccess")
    @VisibleForTesting
    static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks {
        private final FragmentCallback mFragmentCallback;

        DispatcherActivityCallback() {
            mFragmentCallback = new FragmentCallback();
        }

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            if (activity instanceof FragmentActivity) {
                ((FragmentActivity) activity).getSupportFragmentManager()
                        .registerFragmentLifecycleCallbacks(mFragmentCallback, true);
            }
            ReportFragment.injectIfNeededIn(activity);
        }

        @Override
        public void onActivityStopped(Activity activity) {
            if (activity instanceof FragmentActivity) {
                markState((FragmentActivity) activity, CREATED);
            }
        }

        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            if (activity instanceof FragmentActivity) {
                markState((FragmentActivity) activity, CREATED);
            }
        }
    }

init()方法其實就是在Application中注冊了一個ActivityLifecycleCallbacks監(jiān)聽(即DispatcherActivityCallback),用來監(jiān)聽每個Activity的生命周期變化。
我們再看下DispatcherActivityCallback的onActivityCreated()回調(diào)方法,如果Activity是FragmentActivity,則注冊一個FragmentLifecycleCallbacks(即FragmentCallback)用來監(jiān)聽Activity中Fragment的生命周期。

    static class FragmentCallback extends FragmentManager.FragmentLifecycleCallbacks {

        @Override
        public void onFragmentCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) {
            dispatchIfLifecycleOwner(f, ON_CREATE);

            if (!(f instanceof LifecycleRegistryOwner)) {
                return;
            }

            if (f.getChildFragmentManager().findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
                f.getChildFragmentManager().beginTransaction().add(new DestructionReportFragment(),
                        REPORT_FRAGMENT_TAG).commit();
            }
        }

        @Override
        public void onFragmentStarted(FragmentManager fm, Fragment f) {
            dispatchIfLifecycleOwner(f, ON_START);
        }

        @Override
        public void onFragmentResumed(FragmentManager fm, Fragment f) {
            dispatchIfLifecycleOwner(f, ON_RESUME);
        }
    }

我們看到FragmentCallback的onFragmentCreated()回調(diào)方法中,當Fragment如果實現(xiàn)了LifecycleRegistryOwner,就會為其添加一個DestructionReportFragment,用來監(jiān)聽Fragment的生命周期。
之后,會在Activity中添加一個ReportFragment,用來監(jiān)聽Activity生命周期。

    // ReportFragment
    @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;
    }

    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) lifecycle).handleLifecycleEvent(event);
            }
        }
    }

如此,利用一個附著在Activity上無UI的Fragment,通過相應的生命周期回調(diào)方法,實質(zhì)上是對Activity生命周期的監(jiān)聽。
至此,我們知道了Lifecycle組件通過ActivityLifecycleCallbacks、FragmentLifecycleCallbacks及 無UI的Fragment來感知Activity/Fragment的生命周期變化并產(chǎn)生相應的事件。

三、Lifecycle生命周期事件分發(fā)

在上面的分析中,我們只是重點關注了Lifecycle如何感知生命周期,也就是如何監(jiān)聽Activity/Fragment的生命周期。在相應的回調(diào)方法當中,其實都包含了很多生命周期事件分發(fā)相關的邏輯。通過相關的源碼分析,我們可以發(fā)現(xiàn)最終都會調(diào)用到Activity/Fragment的getLifecycle()方法獲取Lifecycle對象,之后再調(diào)用Lifecycle對象的handleLifecycleEvent()方法進行事件分發(fā)。26.1.0及更高版本Support支持庫中的Activity和Fragment已經(jīng)實現(xiàn)了LifecycleOwner接口。

public interface LifecycleOwner {
    /**
     * Returns the Lifecycle of the provider
     * @return The lifecycle of the provider.
     */
    @NonNull
    Lifecycle getLifecycle();
}
public class Fragment implements implements ComponentCallbacks, OnCreateContextMenuListener, LifecycleOwner {
    ... ...
   LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
    ... ...
}
public class FragmentActivity extends BaseFragmentActivityApi16 implements
        ActivityCompat.OnRequestPermissionsResultCallback,
        ActivityCompat.RequestPermissionsRequestCodeValidator {
    ... ...
    // FragmentActivity最終繼承自SupportActivity
   @Override
    public Lifecycle getLifecycle() {
        return super.getLifecycle();
    }
    ... ...
}
public class SupportActivity extends Activity implements LifecycleOwner {
    ... ...
    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
    ... ...
}

有上述源碼可以,其實getLifecycle() 方法最終返回的都是LifecycleRegistry對象,事件分發(fā)最后也都是調(diào)用LifecycleRegistry的handleLifecycleEvent()方法。

    public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        State next = getStateAfter(event);
        moveToState(next);
    }

    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;
    }
    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;
            // no need to check eldest for nullability, because isSynced does it for us.
            if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
                backwardPass(lifecycleOwner);
            }
            Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
            if (!mNewEventOccurred && newest != null
                    && mState.compareTo(newest.getValue().mState) > 0) {
                forwardPass(lifecycleOwner);
            }
        }
        mNewEventOccurred = false;
    }
    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();
            while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                    && mObserverMap.contains(entry.getKey()))) {
                pushParentState(observer.mState);
                observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
                popParentState();
            }
        }
    }

    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();
            while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
                    && mObserverMap.contains(entry.getKey()))) {
                Event event = downEvent(observer.mState);
                pushParentState(getStateAfter(event));
                observer.dispatchEvent(lifecycleOwner, event);
                popParentState();
            }
        }
    }

這些只是分發(fā)的邏輯,那么在事件分發(fā)之前,肯定要有事件的注冊,這就得看一下addObserver()方法。

    @Override
    public void addObserver(@NonNull LifecycleObserver observer) {
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        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 || mHandlingEvent;
        State targetState = calculateTargetState(observer);
        mAddingObserverCounter++;
        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--;
    }
    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);
            mLifecycleObserver.onStateChanged(owner, event);
            mState = newState;
        }
    }

至此,我們可以知道,當lifecycle發(fā)生變化時,handleLifecycleEvent
會通過 getStateAfter()方法獲取當前應處的狀態(tài)并修改mState值,緊接著遍歷所有 ObserverWithState并調(diào)用他們的sync方法來同步且通知LifecycleObserver狀態(tài)發(fā)生變化。

總結

Lifecycle生命周期事件感知由LifecycleDispatcher(ActivityLifecycleCallbacks, FragmentLifecycleCallbacks, Fragment)完成,并通過 LifecycleRegistry傳遞給 LifecycleObserver。

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

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