ComposeでLifecycleを監視する(2023年9月バージョン)

Kenji Abe
Sep 10, 2023

Photo by Alphacolor on Unsplash

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_STARTON_STOP を監視するちょっと簡単な方法です。これまでは DisposableEffect を使ってそこそこのコードを書かないといけなかったですが、新しいAPIの LifecycleStartEffect を使うとコード量少なめで監視することができます。

LifecycleStartEffect {
// ON_STARTの処理

onStopOrDispose {
// ON_STOPの処理 or CompositionからLeaveするときの処理
}
}

これだけで ON_STARTON_STOP を監視することができます。

ただし、1点注意があって、 onStopOrDispose ですが、名前の通りDisposeする処理でも呼ばれるます。なので、CompositionからLeaveするときも呼ばれるので、画面遷移などするときは2回呼ばれることになります。何度実行されても問題ないように実装しておいたほうが良いと思います。

他にも引数にKeyを使って再起動するようなこともできます。

LifecycleStartEffect(key) { // keyが変わると再起動
// ...

onStopOrDispose {
// ...
}
}

ON_RESUME / ON_PAUSEを監視

ON_RESUMEON_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 が内部で使われてるだけなので、今まで書いてた処理を書き換える必要はないかなと思います。

参考

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Kenji Abe
Kenji Abe

Written by Kenji Abe

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO

No responses yet

Write a response