Android记录--lifecycle学习

83 阅读2分钟

lifecycle与观察者模式

Android中的lifecycle机制,主要是使用观察者模式,来实现liveData能够感应指定页面生命周期的

也就是说,Activity作为被观察者,他管理了与他关联的观察者,在生命周期发生变化的时候,通知观察者们作出反应。也就是调用观察者的函数

观察者模式成员

先撇开Activity,了解一下相关成员

LifecycleOwner:是被观察者接口,要求持有Lifecycle类对象

Lifecycle:抽象类,内部管理观察者

LifecycleRegistry:Lifecycle的实现类,也就是被观察者的具体实现。他需要管理观察者,分发事件到观察者,或者说调用观察者的函数

LifecycleObserver:观察者的接口类

在Activity中的使用

在Activity中,通过追踪ComponentActivity源码发现,它实现了LifecycleOwner接口,持有了自己的LifecycleRegistry

那么它是如何让LifecycleRegistry与自己的生命周期关联起来的呢?

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    ReportFragment.injectIfNeededIn(this)
}

核心在ReportFragment.injectIfNeededIn(this)

ReportFragment 的主要作用是通过向 Activity 中注入一个无界面的 Fragment,实现对 Activity 生命周期的监听,并将事件传递到 Lifecycle 实例(如 LifecycleRegistry)进行处理

进入ReportFragment追踪代码,就看到它在自己的生命周期函数中,将事件分发给了activity.lifecycle来处理。其实就是交给LifecycleRegistry处理

FragmentActivity

在FragmentActivity中,就直接交给自己的LifecycleRegistry处理生命周期事件了

LifecycleRegistry处理生命周期,进行传递

他进行了生命周期的检查,以及是否需要更新等判断,最终,通过

observer.dispatchEvent(lifecycleOwner, event)
....
....
lifecycleObserver.onStateChanged(owner!!, event)

将生命周期Event事件传递到observer

与Livedata使用

在activity中使用livedata.observe(this){...}时

LiveData内部构建了观察者LifecycleBoundObserver类型实例,添加到了Activity的LifecycleRegistry。所以LifecycleRegistry传递生命周期Event会传递给它

LifecycleBoundObserver的onStateChanged函数中,就处理了不同生命周期的时候,自己如何处理自己的Observer

liveData的observer

在activity中使用livedata.observe(this){...}时

第二个参数就是liveData的observer,此时livedata是被观察者,观察者要观察livedata的数据变化

所以livedata也是一种观察者模式。它的setValue和postValue就是通知观察者要进行更新了

setValue是同步

postValue在异步时使用