前回のつづきです。

今回も主に書籍( 本格アプリを作ろう! Androidプログラミングレシピ)を参考にして進めます。

アクティビティについて

アクティビティは、android.appp.Activityクラスのサブクラスによって記述される。 Activityのサブクラスでは、アクティビティが存続する間Androidが呼び出す、ライフサイクルコールバックメソッドをオーバーライドします。

7つのライフサイクルコールバックメソッド

  • onCreate(Bundle)

最初にアクティビティが作成されたときに呼び出されるメソッド。このメソッドは、アクティビティのユーザインタフェースを作り、その他のグローバルな初期化(バックグラウンドスレッドの作成など)を必要に応じて実行する。onCreate(Bundle)が呼び出された後に、onStart()が呼び出される。このアクティビティの前の状態が保存されていたら、onCreate()android.os.Bundleが渡される。(無ければnull参照が渡される)

  • onStart()

アクティビティをユーザに見せる直前に呼び出される。onStart()を呼び出した後、アクティビティがフォアグラウンドに出たときにonResume()を呼び出し、アクティビティが隠されるときにonStop()を呼び出す。

  • onRestart()

停止されていたアクティビティが再スタートされる直前に呼び出される。名前の通り。onRestart()の後にonStart()が呼び出される。

  • onResume()

アクティビティがユーザと対話処理を始める直前に呼び出される。このアクティビティがフォーカスを得て、ユーザの入力を受けつける。onResume()の呼び出し後に、そのアクティビティを中断する必要がある場合のみonPause()を呼び出す。

  • onPause()

別のアクティビティを再開しようとするときに呼び出される。このメソッドがリターンするまで次のアクティビティが再開されないことに注意。onPause()を呼び出した後、ユーザがそのアクティビティとの対話処理を再開したらonResume()を呼び出し、アクティビティがユーザから見えなくなったらonStop()を呼び出す。

  • onStop()

アクティビティがユーザから見えなくなったときに呼び出される。アクティビティが破棄されたか、他のアクティビティが再開されて隠されたかのどちらかの理由で発生する。onStop()を呼び出した後、再びユーザとの対話処理に戻る場合はonRestart()を呼び出し、破棄される場合はonDestroy()が呼び出される。

  • onDestroy()

アクティビティが破棄される前に呼び出される。ただし、メモリ不足により強制終了される場合は例外で、onDestroy()は呼び出されない。

これらの7つのメソッドによって、アクティビティのライフサイクル全体が定義され、3つのネストしたループが記述される。

3つのネストしたループ

  • ライフタイム全体

最初にメソッドonCreate(Bundle)が呼び出されたときから、onDestroy()が呼び出されるまでの全ての期間。

  • 可視ライフタイム

メソッドonStart()の呼び出しから、それに対応するonStop()の呼び出しまでの期間。この間、ユーザはアクティビティを画面で見られるが、アクティビティがフォアグラウンドで対話処理をしているとは限らない。

  • フォアグラウンドタイム

メソッドonResume()の呼び出しから、それに対応するonPause()の呼び出しまでの期間。この間、他の全てのアクティビティより手前にあり、ユーザとの対話処理を行っている。

上記のライフサイクルを図にしたものがこれ

アクティビティのライフサイクル

これを見てわかるように、onDestroy()は呼び出されない場合があるので、データ保存の処理を書いてもあてにはならない。onPause()の中でコミットするのが一般的。onDestroy()の実装では、アクティビティに割り当てられていたリソースの解放をするのが一般的。

タスク、アクティビティスタック

  • タスク

相関するアクティビティのシーケンスのこと。アクティビティスタックを提供する。

  • アクティビティスタック

相関するアクティビティのシーケンスを記録する。「ヒストリースタック」「バックスタック」とも呼ばれる。

このスタックに最初にプッシュされるアクティビティは、タスクを開始したアクティビティであり、ルートアクティビティと呼ぶ。実行中のアクティビティは、スタックの一番上に位置する。

実行中のアクティビティが別のアクティビティを起動すると、新しいアクティビティがスタックにプッシュされてフォーカスを得る。前のアクティビティがスタックに残り、停止状態になる。 ユーザが端末のバックボタンを押すと、現在のアクティビティがポップされて、その前のアクティビティが実行中になる。ポップされたアクティビティは破棄される。このときアクティビティが停止したときのユーザインターフェースの状態がレストアされる。

スタック内のアクティビティの順序は変わることがなく、プッシュもしくはポップされるだけ。アクティビティがスタックにプッシュされるのは、現在のアクティビティによって起動された場合のみ。スタックからポップされるのはバックボタンが押され、アクティビティの使用が終わったとき。