ComposeでLifecycleを監視するには DisposableEffect
を使う方法が一番使用されてるのかなと思います。公式ドキュメントにも記載されています。
Lifecycle 2.7.0-alpha01
からこれがちょっと簡単に記述できるようになります。
注意: まだalphaなので今後変更があるかもです。
FlowでLifecycleの状態を取得
currentStateAsState
というのが追加されてるので、単純に以下のように書くだけで現在のLifecycle
val lifecycleOwner = LocalLifecycleOwner.current
val lifecycleState by lifecycleOwner.lifecycle.currentStateAsState()
ON_START / ON_STOPを監視
ON_START
と ON_STOP
を監視するちょっと簡単な方法です。これまでは DisposableEffect
を使ってそこそこのコードを書かないといけなかったですが、新しいAPIの LifecycleStartEffect
を使うとコード量少なめで監視することができます。
LifecycleStartEffect {
// ON_STARTの処理
onStopOrDispose {
// ON_STOPの処理 or CompositionからLeaveするときの処理
}
}
これだけで ON_START
と ON_STOP
を監視することができます。
ただし、1点注意があって、 onStopOrDispose
ですが、名前の通りDisposeする処理でも呼ばれるます。なので、CompositionからLeaveするときも呼ばれるので、画面遷移などするときは2回呼ばれることになります。何度実行されても問題ないように実装しておいたほうが良いと思います。
他にも引数にKeyを使って再起動するようなこともできます。
LifecycleStartEffect(key) { // keyが変わると再起動
// ...
onStopOrDispose {
// ...
}
}
ON_RESUME / ON_PAUSEを監視
ON_RESUME
と ON_PAUSE
も同じように LifecycleResumeEffect
を使って簡単に監視することができます。
LifecycleResumeEffect {
// ON_RESUMEの処理
onPauseOrDispose {
// ON_PAUSEの処理 or CompositionからLeaveするときの処理
}
}
監視するライフサイクルが違うだけ、挙動としては、 LifecycleStartEffect
と同じになります。
特定のLifecycleの状態だけを監視する
例えば、 ON_START
のときだけで何かしたい場合などは、 LifecycleEventEffect を使うと簡単に監視できます。
LifecycleEventEffect(Lifecycle.Event.ON_START) {
// ...
}
1つだけ注意ですが、 ON_DESTROY
は監視できないので、引数に指定するとExceptionが投げられますので、指定しないようにしてください。
補足
上で紹介したAPIすべて DisposableEffect
が内部で使われてるだけなので、今まで書いてた処理を書き換える必要はないかなと思います。