2025年3月22日土曜日

Jetpack Composeのアニメーションとライフサイクル管理

Jetpack Composeでアニメーションを使用する場合、アプリがバックグラウンドの時でもアニメーションが動いたままでバッテリーを消費してしまうのではないかと心配してしまうかもしれません。
この記事ではアニメーションと画面のライフサイクルの関係について説明します。

アニメーションの動作

Jetpack ComposeのアニメーションはActivityのライフサイクルと連動して動作します。Activityがpause状態になるとその中に含まれるComposableのアニメーションも停止します。これは以下の流れで動作します。

  • Composableがアクティブな間はアニメーションが正常に動作します。この時Composeのアニメーションエンジンはフレームごとにアニメーション値を更新します。
  • Composableが一時停止状態(pause)に移行するとアニメーションも一時停止します。
  • Composableが再開(resume)するとアニメーションも再開します。

この仕組みによりJetpack Composeアプリケーションは効率的にリソースを管理しながらも滑らかなアニメーションを提供できます。

Composableのpause状態の検知方法

アニメーションの挙動をより細かく制御したい場合は、以下の方法でComposableのライフサイクル状態を検知できます。

1. DisposableEffectを使用する方法

DisposableEffectを使用するとComposableがコンポジションに入るときと離れるときのイベントを捕捉できます。

@Composable
fun MyComposable() {
    var isPaused by remember { mutableStateOf(false) }

    DisposableEffect(Unit) {
        // Composableがコンポジションに入った時の処理
        onActive = {
            isPaused = false
            // アニメーションの開始や再開などの処理をここに書く
        }
        // Composableがコンポジションから外れる時の処理
        onDispose = {
            isPaused = true
            // アニメーションの停止や後片付けなどの処理をここに書く
        }
    }

    // isPausedの値に応じてアニメーションの状態を制御する処理
}

2. LocalLifecycleOwnerを使用する方法

LocalLifecycleOwnerを使用すると、より詳細なActivityのライフサイクルイベントを監視できます。

@Composable
fun MyComposable() {
    val lifecycleOwner = LocalLifecycleOwner.current
    val lifecycle = lifecycleOwner.lifecycle

    LaunchedEffect(lifecycle) {
        // ライフサイクルオブザーバーの作成と登録
        val observer = object : LifecycleObserver {
            @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
            fun onPause() {
                // pause時の処理
                // 例:アニメーションの一時停止、リソースの解放など
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
            fun onResume() {
                // resume時の処理
                // 例:アニメーションの再開、リソースの再取得など
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
            fun onStop() {
                // stop時の処理
                // より完全なリソース解放が必要な場合の処理
            }
        }

        // オブザーバーを登録
        lifecycle.addObserver(observer)

        // コルーチンが終了したらオブザーバーを解除
        onDispose {
            lifecycle.removeObserver(observer)
        }
    }
}

これらの方法を使用することでComposableの状態を適切に監視し、アニメーションの制御を行うことができます。用途や要件に応じて適切な実装方法を選択することが重要です。

まとめ

Jetpack Composeのアニメーションは基本的にActivityのライフサイクルと連動しているため、バックグラウンド時には自動的に停止します。より細かい制御が必要な場合は、DisposableEffectやLocalLifecycleOwnerを使用して独自のライフサイクル管理を実装できます。