例えば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になったときに動画を止めるなどの動画再生状態の管理やログ送信なども行っていけるのではと思いました。