Lifecycle を Compose と統合する

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

  • 現在の Lifecycle.State 向けのフロー。
  • LifecycleEffects - この API を使用すると、特定の Lifecycle.Event に基づいてブロックを実行できます。

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

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

Lifecycle は、現在の Lifecycle.State を Kotlin の StateFlow として提供する currentStateFlow プロパティを公開しています。この FlowState として収集できます。これにより、アプリはコンポーズ中にライフサイクルの変更を読み取ることができます。

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

上記の例には lifecycle-common モジュールを使ってアクセスできます。lifecycle-runtime-compose モジュールには currentStateAsState() メソッドがありますが、このメソッドを使用すると、現在の Lifecycle の状態を 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 イベントが発生したときや、Effect がコンポーズを終了するときに、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
  }
}