Startup
定义 contentProvider,在 cp 执行时读取清单文件中配置的 meta-data,通过反射创建 Initializer 对象并调用其 create 方法。清单配置示例如下:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge" >
<meta-data
<!-- 将 name 替换成自己的类,value 不变 -->
android:name="androidx.lifecycle.ProcessLifecycleInitializer"
android:value="androidx.startup" />
</provider>
Lifecycle
借助 Startup 实现初始化,Startup 中的示例就是 lifecycle 的配置。它的 create 就两行关键代码
// 调用 Application#registerActivityLifecycleCallbacks
// 当 activity#create 时,会向 activity 注册一个 ReportFrg。由 ReportFrg 监听 actvity 生命周期
// 这就 lifeCycle 的原理
LifecycleDispatcher.init(context);
ProcessLifecycleOwner.init(context);
LifecycleRegistry
被观察者,lifecycle 的核心类
无论是通过 Frg 还是别的形式,在收到生命周期变化时,都会通知到 LifecycleRegistry 中,由它再分发给不同的观察者
ProcessLifecycleOwner
主要用于在应用中随处可监听生命周期,而不用仅局限在 activity 中
其原理也很简单:
- 自己内部定义一个 LifecycleRegistry
- 同时注册 registerActivityLifecycleCallbacks(),当收到生命周期变化时,手动同步到 LifecycleRegistry,这样各处注册的观察者就可以收到回调
// 下面是 Koom 中的代码
// lifecycle 返回的就是内部定义的 LifecycleRegistry
ProcessLifecycleOwner.get().lifecycle.addObserver(object : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_START -> _isForeground = true
Lifecycle.Event.ON_STOP -> _isForeground = false
else -> Unit
}
for (lifecycleEventObserver in _lifecycleEventObservers) {
lifecycleEventObserver.onStateChanged(source, event)
}
}
})