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