系统的 ComponentActivity 实现了 LifycycleOwner 接口,也就是说 Activity 将作为被观察者,它的状态变化将受到观察者监控。来看下具体的状态是怎么流转的。
Lifycycle 状态流转图
Lifecycle_状态流转.jpg总的事件状态流转大致是这样的(还有一个 on_Any 事件没有画出来),和 Activity 的生命周期有些类似,但这个不是 Activity 的生命周期状态。结合这个图,我们来分析下代码里的状态流转。
Activity 使用 Lifecycle 的流程
-
首先 Activity 在声明变量 mLifecycleRegistry 时就做了初始化,这个变量是一个 LifecycleRegistry 类型,是 Lifecycle 的实现类。很关键,它里面提供了 addObserver 方法。
-
Activity 启动后会在 onCreate() 方法里创建 ReportFragment 对象,注意所有的状态变更都会在这个 Fragment 对象里。
-
接着我们需要添加观察者,好在后面状态变更时能观察到。观察者创建并被添加后,所获知的一个状态就是 INITIALIZED。
-
在 ReportFragment 的 onActivityCreated 方法里会分发 on_Create 事件,通过 mLifecycleRegistry 的 handleLifecycleEvent 方法从而使得事件能通过 Lifecycle 对象转换成状态,此时新状态为 CREATED,相应的观察者状态也变为 CREATED。
-
同理,当执行 onStart, onResume 方法时会触发相应的事件进行状态切换,就如上图一样。
-
不过当执行 onPause, onStop 方法时状态并不会有新增,而是一个回退的过程,这和 Activity 的生命周期是不同的。
-
最后,当执行 onDestroy 方法时状态会相应的变更为 DESTROYED 意味着结束。
LiveData 中的有效状态
虽说可以观察到 Lifecycle 的生命周期状态变化,但要注意的是,LiveData 划分了一个活跃与非活跃的状态,只有在活跃状态下才需要观察 Lifecycle 的变更,这点也保证了做一些页面相关操作时,不会因为页面销毁或不可见而带来的一些异常情况。
网友评论