将 Lifecycle 与 Compose 集成

Lifecycle 库提供内置 API,支持与 Jetpack Compose 集成。主要 API 包括:

  • 适用于当前 Lifecycle.State 的数据流。
  • LifecycleEffects,可让您根据特定的 Lifecycle.Event 运行块。

这些集成提供了方便的钩子来管理 Compose 层次结构中的生命周期。本文档简要介绍了您可以如何在应用中使用它们。

使用数据流收集生命周期状态

Lifecycle 公开了一个 currentStateFlow 属性,该属性以 Kotlin StateFlow 的形式提供当前 Lifecycle.State。您可以将此 Flow 收集为 State。这样,您的应用就可以在组合期间读取生命周期中的更改。

val lifecycleOwner = LocalLifecycleOwner.current
val stateFlow = lifecycleOwner.lifecycle.currentStateFlow
…
val currentLifecycleState by stateFlow.collectAsState()

您可以使用 lifecycle-common 模块访问上述示例。lifecycle-runtime-compose 模块中提供了 currentStateAsState() 方法,方便您通过一行代码轻松读取当前生命周期状态。以下示例对此进行了演示:

val lifecycleOwner = LocalLifecycleOwner.current
val currentLifecycleState = lifecycleOwner.lifecycle.currentStateAsState()

对生命周期事件运行代码

此外,还有 LifecycleEffects 可让您在发生特定 Lifecycle.Event 时运行块。

LifecycleEventEffect(Lifecycle.Event.ON_START) {
  // do something here
}

除了 LifecycleEventEffect 之外,您还可以使用 LifecycleStartEffectLifecycleResumeEffect。这些 API 与特定事件相关联。他们还在其主代码块中提供了一个额外的代码块,用于清理事件可能已启动的所有代码。

LifecycleStartEffect

LifecycleStartEffectLifecycleEffect 类似,但它仅在发生 Lifecycle.Event.ON_START 事件时运行。它还接受功能与其他 Compose 键相同的键。当该键发生变化时,它会触发代码块再次运行。

当发生 Lifecycle.Event.ON_STOP 事件或效应退出组合时,它会执行 onStopOrDispose 代码块。这样,您就可以清理属于起始代码块的任何工作。

LifecycleStartEffect {
  // ON_START code is executed here

  onStopOrDispose {
    // do any needed clean up here
  }
}

LifecycleResumeEffect

LifecycleResumeEffect 的运作方式与 LifecycleStartedEffect 相同,但它改为针对 Lifecycle.Event.ON_RESUME 事件执行。此外,它还会提供执行清理的 onPauseOrDispose 块。

LifecycleResumeEffect {
  // ON_RESUME code is executed here

  onPauseOrDispose {
    // do any needed clean up here
  }
}