アクティビティの状態の変化

Activity は、さまざまなイベント(ユーザー トリガー イベントとシステム トリガー イベント)によって、ある状態から別の状態に遷移する可能性があります。このドキュメントでは、このような移行が起こる一般的なケースと、その移行の処理方法について説明します。

アクティビティの状態の詳細については、アクティビティのライフサイクルをご覧ください。ViewModel クラスを使用してアクティビティのライフサイクルを管理する方法については、ViewModel の概要をご覧ください。

設定変更の発生

設定変更をトリガーする可能性があるイベントは多数あります。おそらく最も顕著な例は、縦向きと横向きの向きの変化です。構成変更を引き起こす可能性があるその他の例としては、言語設定や入力デバイスに対する変更が挙げられます。

構成の変更が発生すると、アクティビティは破棄されて再作成されます。これにより、元のアクティビティ インスタンスで次のコールバックがトリガーされます。

  1. onPause()
  2. onStop()
  3. onDestroy()

アクティビティの新しいインスタンスが作成され、次のコールバックがトリガーされます。

  1. onCreate()
  2. onStart()
  3. onResume()

ViewModel インスタンス、onSaveInstanceState() メソッド、永続ローカル ストレージを組み合わせて使用し、構成が変更されてもアクティビティの UI の状態を保持します。これらのオプションをどのように組み合わせるかは、UI データの複雑さ、アプリのユースケース、取得速度とメモリ使用量の考慮によって決まります。アクティビティの UI 状態を保存する方法について詳しくは、UI の状態を保存するをご覧ください。

マルチウィンドウのケースに対応する

アプリが Android 7.0(API レベル 24)以降で利用可能なマルチウィンドウ モードになると、システムは実行中のアクティビティに構成の変更を通知するため、前述のライフサイクル移行が行われます。

この動作は、すでにマルチウィンドウ モードになっているアプリがサイズ変更された場合にも発生します。アクティビティは、自身で構成の変更を処理できます。または、システムがアクティビティを破棄してから新しいディメンションで再作成することもできます。

マルチウィンドウのライフサイクルの詳細については、マルチウィンドウのサポート ページのマルチウィンドウのライフサイクルの説明をご覧ください。

マルチウィンドウ モードでは、ユーザーには 2 つのアプリが表示されますが、フォアグラウンドでフォーカスされているのは、ユーザーが操作しているアプリのみです。そのアクティビティは再開状態で、もう一方のウィンドウのアプリは一時停止状態になります。

ユーザーがアプリ 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() を呼び出すことを強くおすすめします。そうしないと、システムの「戻る」動作がユーザーに不快感を与える可能性があります。

システムによるアプリプロセスの終了

アプリがバックグラウンドにあり、フォアグラウンド アプリ用のメモリを解放する必要がある場合、システムはバックグラウンド アプリを強制終了できます。システムがアプリを強制終了した場合、アプリ内で onDestroy() が呼び出される保証はありません。

破棄するプロセスをシステムが決定する仕組みについて詳しくは、アクティビティの状態とメモリからの排除プロセスとアプリのライフサイクルをご覧ください。

システムがアプリプロセスを強制終了したときにアクティビティの UI の状態を保存する方法については、一時的な UI の状態の保存と復元をご覧ください。