Jetpack 几小只

146 阅读1分钟

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 中

其原理也很简单:

  1. 自己内部定义一个 LifecycleRegistry
  2. 同时注册 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)
    }
  }
})