Lifecycle を Compose と統合する

Lifecycle ライブラリには、Jetpack Compose との統合を可能にする組み込み API が用意されています。主な API は次のとおりです。

  • 現在の Lifecycle.State のフロー。
  • LifecycleEffects: 特定の Lifecycle.Event に基づいてブロックを実行できます。

これらの統合は、Compose 階層内で Lifecycle を管理する便利なフックを提供します。このドキュメントでは、アプリでこれを使用する方法について説明します。

フローでライフサイクルの状態を収集する

Lifecycle は、現在の Lifecycle.State を Kotlin StateFlow として提供する currentStateFlow プロパティを公開します。この FlowState として収集できます。これにより、アプリは作成中に Lifecycle の変更を読み取ることができます。

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

上記の例には、lifecycle-common モジュールを使用してアクセスできます。currentStateAsState() メソッドは lifecycle-runtime-compose モジュールで利用できます。これにより、現在のライフサイクルの状態を 1 行で簡単に読み取ることができます。例は次のとおりです。

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

ライフサイクル イベントでコードを実行する

また、特定の Lifecycle.Event が発生したときにブロックを実行できるようにする LifecycleEffects もあります。

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

LifecycleResumeEffectLifecycleStartedEffect と同じように動作しますが、代わりに Lifecycle.Event.ON_RESUME イベントで実行されます。また、クリーンアップを行う onPauseOrDispose ブロックも用意されています。

LifecycleResumeEffect {
  // ON_RESUME code is executed here

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