JetPack初探之LifeCycle

lifecycle理解:

lifecycle是jetpack中一個持有組件生命週期狀態信息的類,它通過Event、State兩個主要的枚舉,語序其他對象觀察此狀態

 public enum Event {
        ON_CREATE,//用於 LifecycleOwner的onCreate事件的常量。
        ON_START,//用於 LifecycleOwner的onStart事件的常量。
        ON_RESUME,//用於 LifecycleOwner的onResume事件的常量。
        ON_PAUSE,//用於 LifecycleOwner的onPause事件的常量。
        ON_STOP,//用於 LifecycleOwner的onStop事件的常量。
        ON_DESTROY,//用於 LifecycleOwner的onDestroy事件的常量。
        ON_ANY//常量,可用於匹配所有事件
    }
public enum State {
        DESTROYED,
        INITIALIZED,
        CREATED,
        STARTED,
        RESUMED;
        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }

如何使用

  • Event枚舉是被提供出來的,當觀察者MyLifeCycleObserver——需要繼承LifeCycleObserver(),使用@OnLifecycleEvent(LifeCycle.Event.ON_XXXXX)註解,標註當獲取被觀察者的生命週期狀態時執行哪一個方法
    而在被觀察的類中通過使用getLifeCycle().addObserver(myLifecycleObserver),關聯觀察者與被觀察者,這樣就可以在觀察者中實時獲取到被觀察者的生命週期狀態

使用過程中的疑問

問題一:State,並沒有在被觀察者中使用,那它有什麼作用?
解答一:在被觀察類執行到對應的生命週期時會調用lifeCycleRegistry.makeState(LifeCycle.State.XXXX),然後觀察者會在對應的生命週期Event註解中接收到消息。

問題二: 爲什麼沒有看見State在代碼中使用?
解答二:這就需要追蹤源碼了,點擊AppCompatActivity()->FragmentActivity()->ComponentActivity(),在ComponentActivity()的onSaveInstanceState方法中看到有一個註冊了Create返回事件,它會返回onCreate方法的生命週期監聽

問題三:但這只是在onSaveInstanceState註冊的Create,它明明沒有在onCreate()、onStart()、onDestroy()等生命週期中註冊,那爲什它還能用?
解答三:這個時候,你再次往下追到Activity()並沒有找到與之相關聯的,這時,你注意看,在ComponentActivity()的onCreate()中有一段代碼:ReportFragment.injectIfNeededIn(this);進入ReportFragment,你看到有Event的屬性在這被使用了,但還是沒有State的使用位置。

  • 點進dispatchCreate()、dispatchStart()、dispatchResume(),通過其中的監聽往上追蹤源碼會看到一句代碼:mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_XXXX)。
  • 你在ReportFragment中dispatch()中也會看到一句((LifecycleRegistry) lifecycle).handleLifecycleEvent(event),點進去一看他們都是同一個方法,再看官方解釋:Sets the current state and notifies the observers(設置當前狀態並通知觀察者)。
    這個時候我們基本可以知道State的使用位置及方法了:他是通過傳遞過來的Event返回對應的State
  • 在handleLifecycleEvent()方法的getStateAfter(event);就可以看到Event與State的關係
   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);
    }

Event與State對應關係:
ON_CREATE/ON_STOP->CREATED
ON_START/ONPAUSE->STARTED
ON_RESUME->RESUMED
ON_DESTORY->DESTORYED
ON_ANY->constant that can be used to match all events

總結

好勒,這些就是我對於LifeCycle生命週期狀態獲取的一些理解,其中看了這位大佬的文章,並自己通過查看源碼結合起來的理解。當然,理解的很淺也沒有這位大佬那麼深入,如果有需要JetPack更加深入的知識可以去這位大佬那裏看一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章