🚀

Jetpack Composeでライフサイクルを管理する

2021/08/22に公開

はじめに

Jetpack Composeで書いているとライフサイクルを忘れがちですが、ランタイム権限の確認やAndroidViewシステムを使用するときなど必要になります。Compositionとライフサイクルイベントをどうやって紐づけるんだろう、と思って調べたものになります。

実装

  1. 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. 1で作成したLifecycleEventObserverをComposeのライフサイクルに紐づけます。現在のComposeのライフサイクルにaddObserverで登録し、removeObserverで解除といったイメージです。
    DisposableEffectとは?
    クリーンアップが必要な場合に使用します。今回の場合登録したオブザーバーはCompositionが退場したときに解除したいです。onDisposeのラムダは退場時やキー(第一引数)が変化したとき呼ばれ確実にクリーンアップを実行できます。(今回はキーをUnitで固定にしています。)
val lifecycle = LocalLifecycleOwner.current.lifecycle

DisposableEffect(Unit) {
    lifecycle.addObserver(observer)
    onDispose {
        lifecycle.removeObserver(observer)
    }
GitHubで編集を提案

Discussion