Skip to content

生命周期 (Lifecycle)

源:可组合项的生命周期

与 View 系统(onCreate, onStart...)不同,Composable 函数的生命周期更简单。它主要关注在组合 (Composition) 中的存在状态。

三个阶段

Composable 的生命周期由以下三个阶段定义:

  1. 进入组合 (Enter the Composition): Composable 首次被调用并添加到 UI 树中。
  2. 重组 (Recomposition): Composable 因为状态变化而重新执行,UI 树发生更新。
  3. 退出组合 (Leave the Composition): Composable 不再被调用,从 UI 树中移除。

Composable Lifecycle

智能重组

Compose 编译器非常智能,它会跟踪每个 Composable 的输入参数。

  • 跳过 (Skipping): 如果所有输入参数与上一次调用时相同(且参数类型是稳定的),Compose 会跳过该函数的执行。
  • 并行执行: 重组可能会并行运行。
  • 取消: 如果在重组进行时状态再次变化,之前的重组可能会被取消。

监听生命周期事件

虽然 Composable 本身没有 onResume 这种回调,但我们经常需要监听宿主(Activity/Fragment)的生命周期。

使用 LifecycleEventObserver

kotlin
@Composable
fun LifecycleListenerEffect() {
    val lifecycleOwner = LocalLifecycleOwner.current
    
    DisposableEffect(lifecycleOwner) {
        val observer = LifecycleEventObserver { source, event ->
            when (event) {
                Lifecycle.Event.ON_RESUME -> { /* ... */ }
                Lifecycle.Event.ON_PAUSE -> { /* ... */ }
                else -> {}
            }
        }

        lifecycleOwner.lifecycle.addObserver(observer)

        onDispose {
            lifecycleOwner.lifecycle.removeObserver(observer)
        }
    }
}

副作用与生命周期

在 Compose 中,你不应该在函数体中直接执行副作用(如写日志、网络请求),因为函数可能会被频繁重组。

应该使用 副作用 API (Side-effect APIs) 将操作绑定到生命周期的特定阶段:

  • LaunchedEffect: 当进入组合时启动协程,退出组合时取消。
  • DisposableEffect: 当进入组合时执行,退出组合时执行 onDispose 清理逻辑。

详细内容请参考 副作用 (Side Effects) 章节。