ユーザーやシステムがトリガーしたイベントなど、さまざまなイベントによって、Activity がある状態から別の状態へ遷移する可能性があります。このドキュメントでは、そのような遷移が発生する一般的なケースと、遷移の処理方法について説明します。
アクティビティの状態について詳しくは、アクティビティのライフサイクルをご覧ください。ViewModel クラスによるアクティビティのライフサイクルの管理については、ViewModel の概要をご覧ください。
ほとんどのアクティビティの変更では、アクティビティのライフサイクルのコールバックに直接応答する必要はありません。Compose は状態から UI を再構築するため、状態が rememberSaveable や ViewModel などの適切な場所に保存されていることを確認することで、自動再コンポーズを活用できます。
設定変更の発生
設定変更をトリガーする可能性があるイベントは多数あります。おそらく、最もよくある例は、縦向きと横向きの切り替えです。言語設定や入力デバイスの変更などでも設定変更が発生する可能性があります。
構成の変更が発生すると、アクティビティは破棄され、再作成されます。これにより、元のアクティビティ インスタンスで次のコールバックがトリガーされます。
アクティビティの新しいインスタンスが作成され、次のコールバックがトリガーされます。
Compose では、これらのコールバックを直接操作することは一般的ではありません。代わりに、Lifecycle API を使用して状態の変化を監視します。Compose では、LocalLifecycleOwner.current を使用して現在のライフサイクルを取得し、オブザーバーを追加して、イベントに応答できます。
ViewModel インスタンス、rememberSaveable、永続ローカル ストレージを組み合わせて使用し、構成変更の前後でアクティビティの UI の状態を保持します。これらのオプションをどのように組み合わせるかは、UI データの複雑さ、アプリのユースケースによって決まります。また、取得速度とメモリ使用量を考慮する必要もあります。ほとんどのユースケースでは、状態を ViewModel にホイストし、rememberSaveable を使用して、構成の変更とシステムによって開始されたプロセスの終了の両方で状態が保持されるようにする必要があります。アクティビティの UI の状態の保存について詳しくは、UI の状態を保存するをご覧ください。
構成の変更によりアクティビティが再作成されると、初期コンポジションは破棄されます。ViewModel または rememberSaveable を使用すると、新しいコンポジションで UI の状態が復元されます。
詳しくは、Jetpack Compose のライフサイクルと 状態と Jetpack Compose をご覧ください。
マルチウィンドウの場合の処理
アプリが Android 7.0(API レベル 24)以降でマルチウィンドウ モードになると、システムが実行中のアクティビティに設定変更を通知し、上記のライフサイクル遷移が発生します。
この挙動は、すでにマルチウィンドウ モードになっているアプリがサイズ変更された場合にも発生します。アクティビティでは、設定変更自体に対応することも、システムにアクティビティの破棄と新しいディメンションでの再作成を許可することもできます。
マルチウィンドウのライフサイクルの詳細については、マルチウィンドウ モードをサポートするのマルチウィンドウのライフサイクルの説明をご覧ください。
マルチウィンドウ モードでは、ユーザーに表示されるアプリが 2 つある場合でも、ユーザーが操作するのはフォアグラウンドでフォーカスのあるアプリ 1 つだけです。ユーザーが操作しているアクティビティは再開状態で、他のウィンドウのアプリは一時停止状態です。
ユーザーがアプリ A からアプリ B に切り替えると、アプリ A で onPause が呼び出され、アプリ B で onResume が呼び出されます。ユーザーがアプリを切り替えるたびに、この 2 つのメソッドが入れ替わります。
マルチウィンドウ モードの詳細については、マルチウィンドウ モードをサポートするをご覧ください。
フォアグラウンドに表示されるアクティビティまたはダイアログ
新しいアクティビティまたはダイアログがフォアグラウンドに表示され、フォーカスを得て、処理中のアクティビティを部分的に覆い隠すと、覆い隠されたアクティビティはフォーカスを失い、一時停止状態になります。すると、そのアクティビティの onPause が呼び出されます。
覆い隠されたアクティビティがフォアグラウンドに戻ってフォーカスを取り戻すと、システムは onResume を呼び出します。
新しいアクティビティあるいはダイアログがフォアグラウンドに表示され、フォーカスを得て、処理中のアクティビティを完全に覆い隠すと、覆い隠されたアクティビティはフォーカスを失い、停止状態になります。すると、onPause と onStop が続けて呼び出されます。
覆い隠されたアクティビティの元のインスタンスがフォアグラウンドに戻ると、そのアクティビティの onRestart、onStart、onResume が呼び出されます。覆い隠されたアクティビティのバックグラウンドになっていた新しいインスタンスが戻る場合は、onRestart は呼び出されず、onStart と onResume だけが呼び出されます。
再コンポーズは、フォアグラウンドに表示されるダイアログの影響を受けません。ただし、フローやアニメーションなど、ライフサイクルに関連する副作用は、ライフサイクル対応 API(collectAsStateWithLifecycle など)を使用して、必要に応じて自動的に作業を一時停止および再開する必要があります。詳しくは、状態と Jetpack Compose をご覧ください。
ユーザーが [戻る] をタップまたはジェスチャーする
アクティビティがフォアグラウンドにある場合、ユーザーが [戻る] をタップまたはジェスチャーすると、アクティビティが onPause コールバック、onStop コールバック、onDestroy コールバックに遷移します。アクティビティは破棄され、バックスタックから削除されます。
ほとんどの Compose アプリのような単一アクティビティ アプリでは、コンポーザブルがナビゲーション バックスタックから削除されると、rememberSaveable は状態を維持しません。これは、ユーザーが [戻る] をタップしたときに、同じインスタンスに戻ることを想定していないため、すべての状態がクリアされるためです。
アプリを終了するかどうかを確認するダイアログを表示するなど、カスタムの戻る動作を実装するには、NavigationEventHandler API を使用します。
システムによるアプリプロセスの終了
アプリがバックグラウンドにあり、フォアグラウンド アプリのためにメモリを解放する必要がある場合、システムがバックグラウンド アプリを終了させる可能性があります。システムがアプリを終了させるとき、アプリで onDestroy が呼び出される保証はありません。
システムが破棄するプロセスを決定する方法について詳しくは、アクティビティの状態とメモリからの退避とプロセスとアプリのライフサイクルをご覧ください。
システムがアプリプロセスを終了させるときに、アクティビティの UI の状態を保存する方法については、一時的な UI の状態の保存と復元をご覧ください。