14
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Compose Navigationで使えるNavBackStackEntryのlifecycleとは?

Last updated at Posted at 2021-07-07

例えばComposeで動画再生したいけどonStopで止めたいときとかありますよね?
先日、ComposeのNavigationで画面単位で取得できるNavBackStackEntryにlifecycleがあることを知りました。これはAndroid JetpackのいわゆるArchitecture ComponentのLifecycleです。
https://github.com/DroidKaigi/conference-app-2021/blob/4868675fd7d8dee8711ee5a4d1c564c1b86eab97/uicomponent-compose/main/src/main/java/io/github/droidkaigi/feeder/AppContent.kt#L94

このlifecycleはどのようになっているのでしょうか?
以下のようにNavBackStackEntryで保持されていて、

private var lifecycle = LifecycleRegistry(this)
public override fun getLifecycle(): Lifecycle {
        return lifecycle
    }

以下のメソッドでそのlifecycleの状態が変更されます。

    public fun updateState() {
        if (hostLifecycleState.ordinal < maxLifecycle.ordinal) {
            lifecycle.currentState = hostLifecycleState
        } else {
            lifecycle.currentState = maxLifecycle
        }
    }

ordinalはDESTROYEDが最小値でRESUMEDが最大になるようで、最小になる方が使われています。

    public enum State {
        DESTROYED,
        INITIALIZED,
        CREATED,
        STARTED,
        RESUMED;

hostLifecycleStateは外側のActivityやFragmentのライフサイクルの状態で、
maxLifecycleはnavigation側で管理するdestinationごと(ページごと)のライフサイクルの状態のようです。
つまり両方の値のminを取るような実装になっているようです。

これはつまり外側のActivityやFragmentなどのライフサイクルの状態を見て、外側のActivityやFragmentがonStop状態になっていればこのNavBackStackEntryのlifecycleはCREATED状態になってくれていそうにみえます。

これによって、ちゃんとComposeのページごとのライフサイクルだけでなく、外側のライフサイクルも見ることができるため、ComposeでonStopになったときに動画を止めるなどの動画再生状態の管理やログ送信なども行っていけるのではと思いました。

14
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?