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