branch10480’s blog

Topics that I've learned.

Activityのライフサイクルについて 〜 1 〜

Activityのライフサイクル

全体的な概要図はこちら。

ライフサイクル

6つのコアセット

ライフサイクルコールバックメソッド
onCreate()
onStart()
onResume()
onPause()
onStop()
onDestroy()

いくつか例外があるが、基本的にはバックグラウンドでの実行中ではアクティビティは開始されない。

onCreate()

実装必須!

アクティビティが作られるときにライフサイクル中1回だけ実行される。iOSの viewDidLoad() と同じ。

引数として savedInstanceState を受け取る。以前の状態が保存された Bundle オブジェクト。これまで生成されたことがない場合は null になる。

setContentView() でXMLレイアウトファイルを設定するなどを行う。

onStart()

アクティビティが開始状態になると呼び出される。こちらもライフサイクル上1回だけ実行される。

onResume()

onStart の直後、他のアプリから再び戻ってきた場合にコールされる。例としては以下が挙げられる。

  • 他アプリからの移動
  • 電話の着信
  • デバイスをオフにした場合の復帰

割り込みイベントが発生した場合はアクティビティが一時停止状態になり、 onPause() コールバックを呼び出す。

一時停止状態から再開状態に戻ると、再び onResume() メソッドをシステムが呼び出す。

リソースの開始と開放

初期化操作をした場合には、対になるライフサイクルコールバックにてリソース開放を行うようにする

例えば、 onStart() の場合は onStop() で、 onResume() の場合は onPause() で行う。

ただし!

この初期化処理や開放処理自体をライフサイクルコールバック内に記述するべきではない。独立した ライフサイクルコンポーネント を作成して実装するようにする。

詳しくは こちら

onPause()

アプリがアクティビティから離れる時に呼び出される。

  • 一部のイベントがアプリの実行に割り込んだとき(一番一般的)
  • Android 7.0(APIレベル 24)以降で複数のアプリがマルチウィンドウモードで実行されていて、他アプリにフォーカスがあたっているとき
  • 新しい半透明のアクティビティ(ダイアログなど)が開くとき
  • フォアグラウンドに存在しなくなったとき(バックグラウンドに移行したとき)
  • アクティビティが破棄されたとき

ここではリソースの開放を行う(カメラプレビュー停止など)。

注意点!

onPause() メソッドの実行時間は非常に短いので、信頼性に関わる重い処理はここに記述してはいけない!
高負荷の処理は onStop() メソッド内に記述する。

onStop()

ユーザーに表示されなくなったアクティビティは停止状態になり、システムが onStop() コールバックを呼び出す。 新たに生成されたアクティビティが全画面に表示された場合などに発生する。

アプリがユーザーに表示されていない間に不要なリソースをここで開放する。

e.g. - アニメーションの一時停止 - 高精度な位置情報の取得から低制度に変更する

このような開放処理を onPause() ではなく、 onStop() に記載することでマルチウィンドウモードでアクティビティを表示している場合もUI関連の処理が継続される。

また、onPause() でも説明したとおり、信頼性に関わるような重い処理についてはこの onStop() の中で実行する。

アクティビティが停止状態になると Activity オブジェクトがメモリ内に常駐する。すべての状態とメンバー情報が保持されるが、ウィンドウマネージャには接続されない。

アクティビティが再開するとこのメモリに常駐させた情報を読み込む。

停止状態のアクティビティの次の動きは2通りある。

次の状態 動作
再開 onRestart()を呼び出す
破棄 onDestroy()を呼び出す

onDestroy()

アクティビティが破棄される時にコールされる。また、 onStop() で開放されていないリソースはこの段階でリリースされる。

アクティビティが破棄されるケースは以下。

理由 詳細
アクティビティが終了する ユーザーがアクティビティを完全に閉じる、もしくはアクティビティに対して finish() を呼び出したとき
構成の変更 デバイスの向き、マルチウィンドウモードなどが変更されたとき

このどちらの理由に当たるかは isFinishing() メソッドを使うと判別できる。

アクティビティが終了する場合

onDestroy() が呼び出されてライフサイクルが終了する。

構成の変更だった場合

onDestroy() が呼び出されてから即座にシステムは新しいアクティビティインスタンスを生成し、そのインスタンスに対して onCreate() を呼び出す。

参考

アクティビティのライフサイクルについて
ライフサイクル対応コンポーネントによるライフサイクルの処理