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更加深入的知識可以去這位大佬那裏看一下