基本的なアクティビティのライフサイクル
ほとんどのAndroidアプリは、起動するとデフォルトアクティビティを実行し、doCreateメソッドが呼ばれる。
onCreateメソッドは、その名の通りアクティビティのインスタンスが生成された直後に呼ばれる。
このようにアクティビティの状態が変化するごとに呼ばれるメソッドが他に幾つかある。
onCreateメソッドは、その名の通りアクティビティのインスタンスが生成された直後に呼ばれる。
このようにアクティビティの状態が変化するごとに呼ばれるメソッドが他に幾つかある。
onCreate | アクティビティの生成直後、画面表示前。生成から破棄までの間に1度だけ |
onStart | アクティビティにレイアウトをセットし、画面に表示した直後 |
onResume | アクティビティを表示し、ユーザーの入力を受け付け開始した直後 |
onPause | アクティビティを一時停止した直後。表示したまま、もしくは一部を表示したままの状態 |
onStop | アクティビティを停止、画面は完全に非表示 |
onRestart | アクティビティを再開、Stopedから戻ったときなど |
onDestroy | アクティビティを破棄。生成から破棄までの間に1度だけ |
アクティビティの起動
アクティビティが起動すると、onCreate が実行され、onCreate内の処理が終わり画面に表示されるとonStartとonResumeが続けて実行される。
onStartとonResumeの違いは次の通り
onStartとonResumeの違いは次の通り
- Stopedからの復帰 onRestart > onStart > onResume の順に続けて実行
- Pausedからの復帰 onResumeが実行
onPauseとonResume、onStopとonStartがそれぞれ対応し、確保したリソースの解放など、対応する処理は対応するメソッドに記述するのが良い。
onRestartはアプリが再開されるときに特別な処理を行う場合に記述する。ほとんどの場合において、起動時(onStart)にリソースが確保され停止時(onStop)に解放される。そのためonStopで解放するリソースを確保するタイミングは、再開時のみに実行されるonRestartではなく、onStartにあるのが正しい。
onRestartはアプリが再開されるときに特別な処理を行う場合に記述する。ほとんどの場合において、起動時(onStart)にリソースが確保され停止時(onStop)に解放される。そのためonStopで解放するリソースを確保するタイミングは、再開時のみに実行されるonRestartではなく、onStartにあるのが正しい。
アクティビティの破棄
アクティビティが破棄されるとonDestroyが実行されるが、onDestroyに終了処理を記述すべきではない。ほとんどの場合はonPauseかonStopで記述するのが良い。アプリ起動中にホームに戻り他のアプリを起動させると、元のアプリではonDestroyは実行されず余計なリソースを確保したままになることが予想される。onDestroyでは、onCreateで開始されたバックグラウンド処理を停止させたりなど用途は限定される。
なお、onCreateメソッド内でfinish()を実行した場合を除き、onDestroyの前には、必ずonPauseとonStopが実行される。
なお、onCreateメソッド内でfinish()を実行した場合を除き、onDestroyの前には、必ずonPauseとonStopが実行される。
アクティビティの一時停止と停止
一時停止はTransparentなアクティビティを表示し元のアクティビティが一部見えている状態、停止は他のアクティビティを起動させ完全に見えなくなった状態を表す。
onPauseではCPUに負荷のかかる処理やデータの永続化などの処理は避け、比較的軽いシンプルな処理にするのが良い。たとえば動画の停止、カメラやGPSなどのデバイス解放などを行う。
onStopでは、CPUに負荷のかかりやすい終了処理や、データの永続化などを行う。
と言った内容がマニュアルにはあるが特に決まりは無い。要するに使い分け方はアプリの特性を踏まえた開発者の判断(あるいはセンス)に委ねられている。
onPauseではCPUに負荷のかかる処理やデータの永続化などの処理は避け、比較的軽いシンプルな処理にするのが良い。たとえば動画の停止、カメラやGPSなどのデバイス解放などを行う。
onStopでは、CPUに負荷のかかりやすい終了処理や、データの永続化などを行う。
と言った内容がマニュアルにはあるが特に決まりは無い。要するに使い分け方はアプリの特性を踏まえた開発者の判断(あるいはセンス)に委ねられている。
アクティビティの強制破棄と再開
アクティビティがシステムにより強制破棄され、その後復帰するケースでは保存されたアクティビティの状態へ復帰することができる。長い間使用されてないアプリや、実行中のアプリが多量のリソースを要求した場合、省電力モードなどに発生する。
その場合は、前述とは別のライフサイクルメソッドが実行され、必要な処理をその中に記述する。
その場合は、前述とは別のライフサイクルメソッドが実行され、必要な処理をその中に記述する。
- onSaveInstanceState 強制破棄前にアクティビティの状態を保存する
- onRestoreInstanceState 強制破棄からの復帰時にアクティビティの状態を復元する。
onCreate > onStart > onRestoreInstanceState > onResume の順に実行される
onPause > onSaveInstanceSate > onStop > onDestroy の順に実行される。onDestroyが実行されないまま再開される場合はアクティビティの状態は保持されたままなので onRestore~ は実行されない(Homeボタンを押し、すぐにアプリを再開した場合など)
onPause > onSaveInstanceSate > onStop > onDestroy の順に実行される。onDestroyが実行されないまま再開される場合はアクティビティの状態は保持されたままなので onRestore~ は実行されない(Homeボタンを押し、すぐにアプリを再開した場合など)
それぞれのメソッドには Bandleクラスのインスタンスが渡され、onSave~ で Bundle に値をセットし、onRestore~ でBundleクラスのインスタンスから値を取り出す。onCreate にも同様に、Bundleクラスのインスタンスが渡されるため、onRestore の代わりに値を取り出すことも可能。ただしインスタンスが null の場合があるのでチェックが必要。onRestore ではチェックは必要ないし、たとえ再開時でもBundleに何も保存しなかった場合は実行されない。