Lifecycler原理解析

官網(wǎng)Lifecycle文檔

一:Lifecycle的集成

1.1采用下面的方式骇笔,添加注解和集成implementation找到默認(rèn)的DefaultLifecycleObserver

老版本  
    def lifecycle_version = "2.4.0"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
    // alternately - if using Java8, use the following instead of lifecycle-compiler
  implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
      
新版本
  // Annotation processor
    annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
    // alternately - if using Java8, use the following instead of lifecycle-compiler存在DefaultLifecycleObserver
    api "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
    //暫時(shí)還么有生效,采用lifecycle-common-java8:
//    api "androidx.lifecycle:lifecycle-common:$lifecycle_version"

截止2021.12.17更新的時(shí)候發(fā)現(xiàn)最新并不是2.4.0,二是2.3.1,但是該版本并沒(méi)有默認(rèn)的DefaultLifecycleObserver,所以還是改用老方式,或者自己實(shí)現(xiàn)FullLifecycleObserver是一樣的結(jié)果,自己復(fù)寫(xiě)里面的oncreate等方法灸叼,實(shí)現(xiàn)需要的邏輯


image.png

image.png

image.png

二:使用樣例

2.1推薦使用DefaultLifecycleObserver或者LifecycleEventObserver

官網(wǎng)說(shuō)明:自 2.3.0 以來(lái)的重要變更廢棄了 @OnLifecycleEvent。應(yīng)改用 LifecycleEventObserver 或 DefaultLifecycleObserver你画。

2.1.1:創(chuàng)建觀察者抵碟,默認(rèn)繼承DefaultLifecycleObserver,實(shí)現(xiàn)里面的默認(rèn)生命周期
package com.cc.qq.jetpack;


import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;

public class LifeCycleListener implements DefaultLifecycleObserver {
    @Override
    public void onCreate(@NonNull LifecycleOwner owner) {

    }

    @Override
    public void onResume(@NonNull LifecycleOwner owner) {

    }

    @Override
    public void onPause(@NonNull LifecycleOwner owner) {
        
    }

    @Override
    public void onDestroy(@NonNull LifecycleOwner owner) {

    }
}

2.1.2:MainActivity添加創(chuàng)建的Observer:LifeCycleListener

package com.cc.qq.jetpack;

import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.cc.qq.R;


public class LifeCyclerActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rx);
        getLifecycle().addObserver(new LifeCycleListener());
    }
}

三:原理分析

3.1:LifeCyclerActivity層級(jí)關(guān)系

image.png

3.2:分析父類在app/ComponetActivity和activity/CompoentActivity

  • 1坏匪、兩個(gè)目錄下的Activity均存在一個(gè)ReportFragment
  • 2拟逮、兩個(gè)ComponetActivity均實(shí)現(xiàn)了LifecycleOwner接口
  • 3、LifecycleOwner中持有一個(gè)Lifecycle生命周期适滓,在兩個(gè)ComponetActivity都實(shí)現(xiàn)了LifecycleOwner接口的getLifecycle()方法獲取生命周期敦迄,該生命周期實(shí)現(xiàn)類為L(zhǎng)ifecycleRegistry
3.2.1:先看看ComponentActivity
1、 app/ComponetActivity和activity/CompoentActivity
@SuppressLint("RestrictedApi")
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ReportFragment.injectIfNeededIn(this);
    }

    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
    
    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
3.2.2:看看 ReportFragment中的injectIfNeededIn創(chuàng)建Fragment凭迹,F(xiàn)ragment中還有生命周期和dispatch方法

當(dāng)ReportFragment生命周期變化的時(shí)候會(huì)調(diào)用dispatch(event)發(fā)方法罚屋,猶豫Activity實(shí)現(xiàn)了LifecycleOwner接口,所以會(huì)調(diào)用LifecycleRegistry#handleLifecycleEvent()

public static void injectIfNeededIn(Activity activity) {
        // ProcessLifecycleOwner should always correctly work and some activities may not extend
        // FragmentActivity from support lib, so we use framework fragments for activities
        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();
        }
    }

    @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);
            }
        }
    }
3.2.3:LifecycleRegistry#handleLifecycleEvent方法

根據(jù)handleLifecycleEvent傳遞進(jìn)來(lái)的Lifecycle.Event 參數(shù)蕊苗,返回對(duì)應(yīng)的State

1、LifecycleRegistry#handleLifecycleEvent
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        State next = getStateAfter(event);
        moveToState(next);
    }
2沿彭、LifecycleRegistry#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);
    }
3朽砰、LifecycleRegistry#3、LifecycleRegistry#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;
    }
4、LifecycleRegistry#sync
private void sync() {
        //得到的是Activity
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already"
                    + "garbage collected. It is too late to change lifecycle state.");
        }
        //由下面5處得知isSynced為false,則繼續(xù)往下執(zhí)行瞧柔。
        //枚舉比較大小漆弄,越前面越小,
        //a造锅、如果新傳遞過(guò)來(lái)的生命周期狀態(tài)比所有觀察者中最先添加進(jìn)去的觀察者生命周期還小
        //那么執(zhí)行backwardPass(lifecycleOwner被觀察者Activity)撼唾,什么情況下會(huì)觸發(fā)次場(chǎng)景呢?
        //b哥蔚、如果新傳遞過(guò)來(lái)的生命周期狀態(tài)比所有觀察者中最先添加進(jìn)去的觀察者生命周期還大
        //那么執(zhí)行forwardPass(lifecycleOwner被觀察者Activity)倒谷,什么情況下會(huì)觸發(fā)次場(chǎng)景呢?
        
        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;
    }
 5糙箍、 LifecycleRegistry#isSynced
 private boolean isSynced() {
        if (mObserverMap.size() == 0) {
            return true;
        }
        //匹配里面mObserverMap所有的觀察者最老的和最新的狀態(tài)是否一致
        State eldestObserverState = mObserverMap.eldest().getValue().mState;
        State newestObserverState = mObserverMap.newest().getValue().mState;
        //先檢查是否一致
        //mState = INITIALIZED;mState默認(rèn)初始狀態(tài)
        //當(dāng)Fragment生命周期發(fā)生變化時(shí)將Event生命周期事件傳遞過(guò)來(lái)moveToState(event)
        //傳遞過(guò)來(lái)后調(diào)用mState=event渤愁,
        //判斷條件1是否只存在一個(gè)觀察者:一般不止一個(gè)
        //判斷條件2最新的觀察者生命周期是否為傳遞過(guò)來(lái)的:一般不相等,所以一般是false深夯,走到上面分析4處
        return eldestObserverState == newestObserverState && mState == newestObserverState;
    }
 6抖格、LifecycleRegistry#mObserverMap是一個(gè)存有State的觀察者,addObserve的時(shí)候添加值
 private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =
            new FastSafeIterableMap<>();
7咕晋、
public enum State {
    //按照這個(gè)正向走則是forwardPass雹拄,因?yàn)閭鬟f過(guò)來(lái)的往后,相當(dāng)于創(chuàng)建Activity的過(guò)程掌呜。
    //逆向走則是往后backwardPass滓玖,因?yàn)槭堑怪呖梢钥闯鰜?lái)是生命周期結(jié)束的過(guò)程
    DESTROYED,INITIALIZED站辉,CREATED呢撞,STARTED,RESUMED
}
8饰剥、
public enum Event {
    ON_CREATE殊霞,ON_START,ON_RESUME汰蓉,ON_PAUSE绷蹲,ON_STOP,ON_DESTROY顾孽,ON_ANY
}

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

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



9祝钢、
  private void forwardPass(LifecycleOwner lifecycleOwner) {
        Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
                mObserverMap.iteratorWithAdditions();
        //循環(huán)遍歷mObserverMap觀察者
        while (ascendingIterator.hasNext() && !mNewEventOccurred) {
            Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
            ObserverWithState observer = entry.getValue();
            //小于《狀態(tài)順流走,也就是往右走若厚,往下走拦英,往前走
            while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                    && mObserverMap.contains(entry.getKey()))) {
                    //添加新的狀態(tài)進(jìn)去
                pushParentState(observer.mState);
                //觀察者分發(fā)事件,執(zhí)行裝飾模式后的Observable的onStateChanged()
                //DefaultLifecycleObserver extends FullLifecycleObserver测秸,
                //FullLifecycleObserverAdapter extends LifecycleEventObserver extends LifecycleObserver
                //FullLifecycleObserverAdapter#onStateChanged()通過(guò)switch語(yǔ)句判斷生命周期疤估,
                //從而讓觀察者調(diào)用自己實(shí)現(xiàn)的生命周期方法灾常,就是上面自定義的LifecycleListener,可以換一個(gè)名字铃拇。钞瀑。
                //注意:如果直接 extends LifecycleObserver,那需要添加事件注解慷荔,通過(guò)反射來(lái)達(dá)到目的雕什,損失性能
                所以官方推薦DefaultLifecycleObserver或者LifecycleEventObserver
                observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
                popParentState();
            }
        }
    }

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

結(jié)論:

1、以上說(shuō)明Activity實(shí)現(xiàn)了LifecycleOwner并持有一個(gè)生命周期显晶,在創(chuàng)建Activity的時(shí)候也同時(shí)創(chuàng)建了ReportFragment贷岸,ReportFragment生命周期變化時(shí)會(huì)觸發(fā)dispatch事件。

2吧碾、由LifecycleRegistry讓MainActivity得到一個(gè)Lifecycle凰盔,也就是MainActivity通過(guò)實(shí)現(xiàn)了LifecycleOwner持有生命周期Lifecycle。

3倦春、通過(guò)添加addObserver(觀察者)得到一個(gè)ObserverWithState對(duì)象户敬,將ObserverWithState對(duì)象添加到mObserverMap中。

4睁本、創(chuàng)建ObserverWithState該對(duì)象的時(shí)候會(huì)創(chuàng)建新的裝飾的觀察者FullLifecycleObserverAdapter implements LifecycleEventObserver尿庐。有個(gè)onStateChange()方法,該方法由上面的1生命周期變化的時(shí)候觸發(fā)呢堰。onStateChange該方法有個(gè)switch判斷生命周期事件抄瑟,從而調(diào)用我們自己創(chuàng)建的觀察者對(duì)應(yīng)的方法。

5枉疼、ReportFragment什么周期變化時(shí)觸發(fā)的dispatch會(huì)經(jīng)過(guò)一系列轉(zhuǎn)換皮假,最后通過(guò)forwardPass/backwardPass調(diào)用FullLifecycleObserverAdapter 的onStateChange。轉(zhuǎn)換過(guò)程中涉及到的類LifecycleRegister骂维。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惹资,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子航闺,更是在濱河造成了極大的恐慌褪测,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潦刃,死亡現(xiàn)場(chǎng)離奇詭異侮措,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)乖杠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門分扎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人胧洒,你說(shuō)我怎么就攤上這事畏吓』防浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵庵佣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我汛兜,道長(zhǎng)巴粪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任粥谬,我火速辦了婚禮肛根,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漏策。我一直安慰自己派哲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布掺喻。 她就那樣靜靜地躺著芭届,像睡著了一般。 火紅的嫁衣襯著肌膚如雪感耙。 梳的紋絲不亂的頭發(fā)上褂乍,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音即硼,去河邊找鬼逃片。 笑死,一個(gè)胖子當(dāng)著我的面吹牛只酥,可吹牛的內(nèi)容都是我干的褥实。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼裂允,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼损离!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起叫胖,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤草冈,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瓮增,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體怎棱,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年绷跑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拳恋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砸捏,死狀恐怖谬运,靈堂內(nèi)的尸體忽然破棺而出隙赁,到底是詐尸還是另有隱情,我是刑警寧澤梆暖,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布伞访,位于F島的核電站,受9級(jí)特大地震影響轰驳,放射性物質(zhì)發(fā)生泄漏厚掷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一级解、第九天 我趴在偏房一處隱蔽的房頂上張望冒黑。 院中可真熱鬧,春花似錦勤哗、人聲如沸抡爹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)冬竟。三九已至,卻和暖如春民逼,著一層夾襖步出監(jiān)牢的瞬間诱咏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工缴挖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袋狞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓映屋,卻偏偏與公主長(zhǎng)得像苟鸯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棚点,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容