Lifecycle
Lifecycle是一个抽象类,用于存储有关组件(如 activity 或 fragment)的生命周期状态的信息,并允许其他对象观测此状态。
Lifecycle 使用两种主要枚举跟踪其关联组件的生命周期状态:
事件:从框架和 Lifecycle 类分派的生命周期事件。这些事件映射到 activity 和 fragment 中的回调事件。
状态:Lifecycle 对象所跟踪的组件的当前状态。
LifecycleRegistry 是 Lifecycle 的实现类
关于生命周期的通知,Lifecycle 并没有采用直接通知的方式,而是采用了 Event(事件) + State(状态) 的设计方式
对于外部生命周期订阅者而言,只需要关注事件 Event 的调用;
而对于Lifecycle而言,其内部只关注 State ,并将生命周期划分为了多个阶段,每个状态又代表了一个事件集,从而对于外部调用者而言,无需拘泥于当前具体的状态是什么。
LifecycleOwner
LifecycleOwner 是只包含一个方法的接口,指明类具有 Lifecycle。它包含一个方法(即 getLifecycle()),该方法必须由类实现。如果您要尝试管理整个应用进程的生命周期,请参阅 ProcessLifecycleOwner。
此接口从各个类(如 Fragment 和 AppCompatActivity)抽象化 Lifecycle 的所有权,并允许编写与这些类搭配使用的组件。任何自定义应用类均可实现 LifecycleOwner 接口。
实现 DefaultLifecycleObserver 的组件可与实现 LifecycleOwner 的组件完美配合,因为所有者可以提供生命周期,而观测者可以注册以观测生命周期。
FragmentViewLifecycleOwner 继承自 LifecycleOwner
LifecycleOwner 源码,里面唯一的方法是获取 Lifecycle 对象
/**
* A class that has an Android lifecycle. These events can be used by custom components to
* handle lifecycle changes without implementing any code inside the Activity or the Fragment.
*
* @see Lifecycle
* @see ViewTreeLifecycleOwner
*/
@SuppressWarnings({"WeakerAccess", "unused"})
public interface LifecycleOwner {
/**
* Returns the Lifecycle of the provider.
*
* @return The lifecycle of the provider.
*/
@NonNull
Lifecycle getLifecycle();
}
为什么Fragment中要使用viewLifecycleOwner代替this
因为在Fragment中,this绑定到Fragment总体生命周期上,也就是它本身的onCreate和onDestroy这些方法,而viewLifecycleOwner绑定到UI相关的生命周期上,也就是onCreateView和onDestroyView上。
如果使用this,而非viewLifecycleOwner的话,视图销毁了但Fragment本身还没有销毁时,LiveData会继续向观察者发送改变事件,这可能会引起程序崩溃。
Google也推荐我们使用viewLifecycleOwner。
自定义 LifecycleOwner
LifecycleOwner 常用于 viewmodel.livedata.observe(lifecycleOwner) {},如果 lifecycleOwner 持有的 Lifecycle 的生命周期在活跃状态时,数据发生了变化,则会走到后面的回调中。
例如:
自定义 LifecycleOwner,可以自己维护一个生命周期。
class MyCustomLifecycleOwner : LifecycleOwner {
private val lifecycleRegistry = LifecycleRegistry(this)
init {
// 这里可以设置你想要的初始状态
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
}
fun onDestroy() {
// 在Activity的onDestroy中调用此方法以销毁Lifecycle
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
}
override fun getLifecycle(): Lifecycle {
return lifecycleRegistry
}
}
Activity 中代码
class MainActivity : AppCompatActivity() {
private val viewModel: MainActivityViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
viewModel.observe(MyCustomLifecycleOwner()) {}
}
override fun onDestroy() {
super.onDestroy()
customLifecycleOwner?.onDestroy()
}
}
LifecycleObserver
监听观察组件的生命周期,接口实现:DefaultLifecycleObserver、FullLifecycleObserver
自定义 LifecycleObserver
class MyObserver : DefaultLifecycleObserver {
override fun onResume(owner: LifecycleOwner) {
connect()
}
override fun onPause(owner: LifecycleOwner) {
disconnect()
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
MyLifecycleOwner.getLifecycle().addObserver(MyObserver())
}
}