🚀
Jetpack Composeでライフサイクルを管理する
はじめに
Jetpack Composeで書いているとライフサイクルを忘れがちですが、ランタイム権限の確認やAndroidViewシステムを使用するときなど必要になります。Compositionとライフサイクルイベントをどうやって紐づけるんだろう、と思って調べたものになります。
実装
- Compose内でライフサイクルを監視するインスタンスを
LifecycleEventObserver
で作成します。再Compose後もインスタンスが復元されるようにremember
を使用しています。
val observer = remember {
LifecycleEventObserver {_, event ->
when(event) {
Lifecycle.Event.ON_CREATE -> {}
Lifecycle.Event.ON_START -> {}
Lifecycle.Event.ON_RESUME -> {}
Lifecycle.Event.ON_PAUSE -> {}
Lifecycle.Event.ON_STOP -> {}
Lifecycle.Event.ON_DESTROY -> {}
Lifecycle.Event.ON_ANY -> {}
}
}
}
- 1で作成した
LifecycleEventObserver
をComposeのライフサイクルに紐づけます。現在のComposeのライフサイクルにaddObserver
で登録し、removeObserver
で解除といったイメージです。
DisposableEffectとは?
クリーンアップが必要な場合に使用します。今回の場合登録したオブザーバーはCompositionが退場したときに解除したいです。onDispose
のラムダは退場時やキー(第一引数)が変化したとき呼ばれ確実にクリーンアップを実行できます。(今回はキーをUnitで固定にしています。)
val lifecycle = LocalLifecycleOwner.current.lifecycle
DisposableEffect(Unit) {
lifecycle.addObserver(observer)
onDispose {
lifecycle.removeObserver(observer)
}
Discussion