Lifecycle源碼解析

是什么

是具備宿主生命周期感知能力的組件闲擦。它能持有組件(如 Activity 或 Fragment)生命周期狀態(tài)的信息,并且允許其他觀察者監(jiān)聽(tīng)宿主的狀態(tài)场梆。

各類之間的關(guān)系

各類之間的關(guān)系

如何使用 Lifecycle 觀察宿主狀態(tài)

1. LifecycleObserver 配合注解
這種方式需要添加lifecycle-compiler注解處理器墅冷。

//1. 自定義的LifecycleObserver觀察者,在對(duì)應(yīng)方法上用注解聲明想要觀  察的宿主的生命周期事件即可
class LocationObserver extends LifecycleObserver{

  //宿主執(zhí)行了onstart時(shí)辙谜,會(huì)分發(fā)該事件
  @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void onStart(@NotNull LifecycleOwner owner){
      //開(kāi)啟定位
    }
  
  //宿主執(zhí)行了onstop時(shí) 會(huì)分發(fā)該事件
  @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
  void onStop(@NotNull LifecycleOwner owner){
     //停止定位
  }
 }

//2. 注冊(cè)觀察者,觀察宿主生命周期狀態(tài)變化
class MyFragment extends Fragment{
  public void onCreate(Bundle bundle){
    LocationObserver observer =new LocationObserver()
    getLifecycle().addObserver(observer);
  }
}

2. FullLifecyclerObserver 擁有宿主所有生命周期事件

//1.源碼俺榆,目前這個(gè)類權(quán)限不可見(jiàn),即便如此装哆,我們也要了解它
interface FullLifecycleObserver extends LifecycleObserver {
    void onCreate(LifecycleOwner owner);
    void onStart(LifecycleOwner owner);
    void onResume(LifecycleOwner owner);
    void onPause(LifecycleOwner owner);
    void onStop(LifecycleOwner owner);
    void onDestroy(LifecycleOwner owner);
}

//2.用法,需要監(jiān)聽(tīng)那個(gè)事件,復(fù)寫(xiě)那個(gè)方法即可
class LocationObserver extends FullLifecycleObserver{
    void onStart(LifecycleOwner owner){}
    void onStop(LifecycleOwner owner){}
}

3. LifecycleEventObserver宿主生命周期事件封裝成 Lifecycle.Event

//1.源碼
public interface LifecycleEventObserver extends LifecycleObserver {
    void onStateChanged(LifecycleOwner source, Lifecycle.Event event);
}

//2.用法 
class LocationObserver extends LifecycleEventObserver{
    @override
    void onStateChanged(LifecycleOwner source, Lifecycle.Event event){
      //需要自行判斷l(xiāng)ife-event是onstart, 還是onstop
    }
}

Fragment 是如何實(shí)現(xiàn) Lifecycle 的

在各個(gè)生命周期方法內(nèi)利用LifecycleRegistry分發(fā)相應(yīng)的事件給每個(gè)觀察者定嗓。

public class Fragment implements LifecycleOwner {

    LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
    
    @Override
    public Lifecycle getLifecycle() {  
      //復(fù)寫(xiě)自LifecycleOwner,所以必須new LifecycleRegistry對(duì)象返回
      return mLifecycleRegistry;
    }
    
    void performCreate(){
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
    }
  
  
     void performStart(){
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
    }
  .....
     void performResume(){
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
     }  
}

Activity 是如何實(shí)現(xiàn) Lifecycle 的

借助于 ReportFragment 往 Activity 上添加一個(gè) fragment 用以報(bào)告生命周期的變化蜕琴。目的是為了兼顧不是繼承自 AppCompactActivity 的場(chǎng)景, 同時(shí)也支持我們自定義 LifecycleOwner 的場(chǎng)景宵溅。

public class ComponentActivity extends Activity implements LifecycleOwner{

    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
  
   @NonNull
   @Override
   public Lifecycle getLifecycle() {
      return mLifecycleRegistry;
   }
  
    protected void onCreate(Bundle bundle){
      super.onCreate(savedInstanceState);
      //往Activity上添加一個(gè)fragment,用以報(bào)告生命周期的變化
      //目的是為了兼顧不是繼承自AppCompactActivity的場(chǎng)景.
      ReportFragment.injectIfNeededIn(this); 
    }
    
}
public class ReportFragment extends Fragment{

    public static void injectIfNeededIn(Activity activity) {
        android.app.FragmentManager manager =   activity.getFragmentManager();
        if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) ==   null) {
        manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
        manager.executePendingTransactions();
      }
    }
    
    @Override
    public void onStart() {
        super.onStart();
        dispatch(Lifecycle.Event.ON_START);
    }
    
    @Override
    public void onResume() {
        super.onResume();
        dispatch(Lifecycle.Event.ON_RESUME);
    }
    
    @Override
    public void onPause() {
        super.onPause();
        dispatch(Lifecycle.Event.ON_PAUSE);
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        dispatch(Lifecycle.Event.ON_DESTROY);
    }
    
    private void dispatch(Lifecycle.Event event) {
         Lifecycle lifecycle = activity.getLifecycle();
         if (lifecycle instanceof LifecycleRegistry) {
             ((LifecycleRegistry)   lifecycle).handleLifecycleEvent(event);
    }
}

宿主生命周期與宿主狀態(tài)模型圖

宿主生命周期與宿主狀態(tài)模型圖

Lifecycle添加observer的源碼分析

// LifecycleRegistry.class
public void addObserver(@NonNull LifecycleObserver observer) {
        enforceMainThreadIfNeeded("addObserver");
        
        // 添加新的Observer時(shí)凌简,會(huì)首先根據(jù)宿主的狀態(tài)計(jì)算出它的初始狀態(tài),只要不是在onDestroy中注冊(cè)的恃逻,它的初始狀態(tài)都是INITIALIZED
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        
        // 接著會(huì)把observer包裝成ObserverWithState雏搂,這個(gè)類主要是包含了觀察者及其狀態(tài)。每個(gè)事件都會(huì)經(jīng)由這個(gè)對(duì)象類轉(zhuǎn)發(fā)
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
        
        // 添加到集合寇损,如果之前已經(jīng)添加過(guò)了凸郑,則return
        ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
        if (previous != null) {
            return;
        }
        
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            // 頁(yè)面被回收時(shí)為null,return
            return;
        }

        boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
        
        // 計(jì)算目標(biāo)state矛市,之后會(huì)將當(dāng)前state和目標(biāo)state之間的所有event回調(diào)給observer
        State targetState = calculateTargetState(observer);
        mAddingObserverCounter++;
        
        // 拿觀察者的狀態(tài)和宿主當(dāng)前狀態(tài)做比較芙沥,如果小于0,說(shuō)明兩者狀態(tài)還沒(méi)有對(duì)齊
        while ((statefulObserver.mState.compareTo(targetState) < 0 && mObserverMap.contains(observer))) {
            pushParentState(statefulObserver.mState);
            
            // 獲取下一個(gè)生命周期事件對(duì)應(yīng)的event,例如當(dāng)前state是INITIALIZED而昨,則下一個(gè)生命周期事件對(duì)應(yīng)的event是ON_CREATE
            final Event event = Event.upFrom(statefulObserver.mState);
            
            // 如果當(dāng)前state沒(méi)有對(duì)應(yīng)的下一個(gè)event救氯,拋異常
            if (event == null) {
                throw new IllegalStateException("no event up from " + statefulObserver.mState);
            }
            
            //  分發(fā)event
            statefulObserver.dispatchEvent(lifecycleOwner, event);
            popParentState();
            // 頁(yè)面狀態(tài)可能發(fā)生變化,重新計(jì)算目標(biāo)state歌憨,繼續(xù)做循環(huán)和目標(biāo)state做比較着憨,直到兩者一樣
            targetState = calculateTargetState(observer);
        }

        if (!isReentrance) {
            // we do sync only on the top level.
            // 狀態(tài)同步過(guò)程中,宿主狀態(tài)可能有變動(dòng)务嫡,比如由RESUMED-> STARTED甲抖,調(diào)用sync()完成事件的分發(fā)和觀察者狀態(tài)的同步
            sync();
        }
        mAddingObserverCounter--;
}


// ObserverWithState.class,持有觀察者及其狀態(tài)的內(nèi)部類
static class ObserverWithState {
        // 持有Observer的狀態(tài)植袍,方便與宿主狀態(tài)做比對(duì)同步:
        State mState;
        LifecycleEventObserver mLifecycleObserver;

        ObserverWithState(LifecycleObserver observer, State initialState) {
            // 根據(jù)observer的類型(FullLifecycleObserver惧眠、LifecycleEventObserver)轉(zhuǎn)換成對(duì)應(yīng)的適配器類,適配器類會(huì)對(duì)onStateChanged方法進(jìn)行適配于个,并以相應(yīng)的方式(反射氛魁、中轉(zhuǎn))把事件轉(zhuǎn)發(fā)到我們的observer上;統(tǒng)一事件的分發(fā)形式厅篓。
            mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
            // observer初始狀態(tài):INITIALIZED秀存、DESTROYED
            mState = initialState;
        }

        // 分發(fā)event
        void dispatchEvent(LifecycleOwner owner, Event event) {
            // 根據(jù)event獲取對(duì)應(yīng)的state
            State newState = event.getTargetState();
            mState = min(mState, newState);
            // 回調(diào)通知observer生命周期事件
            mLifecycleObserver.onStateChanged(owner, event);
            mState = newState;
        }
}
sequenceDiagram
LifecycleRegistry->>LifecycleRegistry: addObserver( LifecycleObserver) 

LifecycleRegistry->>LifecycleRegistry: calculateTargetState(observer)

LifecycleRegistry->>ObserverWithState: dispatchEvent(owner, event)

宿主生命周期變化后相應(yīng)事件的分發(fā)

// LifecycleRegistry.class
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        enforceMainThreadIfNeeded("handleLifecycleEvent");
        // 獲取event對(duì)應(yīng)的state,同步observer的state
        moveToState(event.getTargetState());
}


private void moveToState(State next) {
        // 如果LifecycleRegistry的狀態(tài)沒(méi)有改變羽氮,不做處理
        if (mState == next) {
            return;
        } 
        
        // 保存宿主state
        mState = next;
        
        // 如果正在分發(fā)生命周期事件 或者 剛注冊(cè)了observer(也是正在分發(fā)生命周期事件)或链,則不做處理,因?yàn)楹竺娑紩?huì)調(diào)sync()同步所有observer的狀態(tài)
        if (mHandlingEvent || mAddingObserverCounter != 0) {
            mNewEventOccurred = true;
            // we will figure out what to do on upper level.
            return;
        }
        
        // 同步觀察者狀態(tài)
        mHandlingEvent = true;
        sync();
        mHandlingEvent = false;
}


// 同步LifecycleRegistry注冊(cè)了的所有observer的狀態(tài)
private void sync() {
        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.");
        }
        
        // 如果observer的狀態(tài)和LifecycleRegistry的狀態(tài)不同步档押,則同步它們的狀態(tài)
        while (!isSynced()) {
            mNewEventOccurred = false;
            
            // mObserverMap中的節(jié)點(diǎn)以鏈表的形式連接
            // 如果宿主state小于最先添加的observer(頭節(jié)點(diǎn))的state澳盐,則說(shuō)明宿主可能發(fā)生了狀態(tài)回退,比如當(dāng)前是RESUMED狀態(tài)令宿,執(zhí)行了onPause則回退到STARTED狀態(tài)叼耙,此時(shí)調(diào)用backwardPass把集合中的每個(gè)一觀察者分發(fā)一個(gè)on_pause事件,并同步它的狀態(tài)粒没,即將所有observer的state回退到和宿主state一致
            if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
                backwardPass(lifecycleOwner);
            }
            // 如果宿主state大于最后的observer(尾節(jié)點(diǎn))的state筛婉,則說(shuō)明宿主可能發(fā)生了狀態(tài)前進(jìn),比如當(dāng)前是STARTED狀態(tài)癞松,執(zhí)行了onResume則前進(jìn)到RESUMED狀態(tài)爽撒,此時(shí)調(diào)用forwardPass把集合中的每個(gè)一觀察者分發(fā)一個(gè)on_resume事件,并同步它的狀態(tài)响蓉。
            Map.Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
            if (!mNewEventOccurred && newest != null && mState.compareTo(newest.getValue().mState) > 0) {
                forwardPass(lifecycleOwner);
            }
        }
        mNewEventOccurred = false;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末硕勿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子厕妖,更是在濱河造成了極大的恐慌首尼,老刑警劉巖挑庶,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異软能,居然都是意外死亡迎捺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)查排,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)凳枝,“玉大人,你說(shuō)我怎么就攤上這事跋核♂澹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵砂代,是天一觀的道長(zhǎng)蹋订。 經(jīng)常有香客問(wèn)我,道長(zhǎng)刻伊,這世上最難降的妖魔是什么露戒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮捶箱,結(jié)果婚禮上智什,老公的妹妹穿的比我還像新娘。我一直安慰自己丁屎,他們只是感情好荠锭,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著晨川,像睡著了一般证九。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上共虑,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天甫贯,我揣著相機(jī)與錄音,去河邊找鬼看蚜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赔桌,可吹牛的內(nèi)容都是我干的供炎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼疾党,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼音诫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起雪位,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤竭钝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體香罐,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卧波,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庇茫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片港粱。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖旦签,靈堂內(nèi)的尸體忽然破棺而出查坪,到底是詐尸還是另有隱情,我是刑警寧澤宁炫,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布偿曙,位于F島的核電站,受9級(jí)特大地震影響羔巢,放射性物質(zhì)發(fā)生泄漏望忆。R本人自食惡果不足惜涵妥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一函筋、第九天 我趴在偏房一處隱蔽的房頂上張望鳞骤。 院中可真熱鬧似忧,春花似錦迟赃、人聲如沸混弥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)搅吁。三九已至威创,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谎懦,已是汗流浹背肚豺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留界拦,地道東北人吸申。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像享甸,于是被迫代替她去往敵國(guó)和親截碴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • Android Component Framwork為我們解決了一些繁瑣的問(wèn)題蛉威,并勾勒出Android App開(kāi)發(fā)...
    廖布斯M閱讀 756評(píng)論 1 0
  • Lifecycle是什么 Lifecycle是Google官方提供的方便管理生命周期事件的方式日丹,可以更方便的監(jiān)聽(tīng)生...
    奔跑吧李博閱讀 651評(píng)論 0 10
  • lifecycle是一個(gè)感知生命周期的組件,一般用作響應(yīng)Activity/Fragment生命周期的變化蚯嫌,并將此變...
    Zero_______閱讀 263評(píng)論 1 0
  • Google Jetpack 自從推出以后哲虾,極大地改變了 Android 開(kāi)發(fā)者們的開(kāi)發(fā)模式丙躏,并降低了開(kāi)發(fā)難度。這...
    業(yè)志陳閱讀 607評(píng)論 0 0
  • Lifecycle-Aware是Google官方的生命周期感知組件束凑。同時(shí)晒旅,在Google推出的Android Je...
    小小的coder閱讀 552評(píng)論 0 0