Activityの4つの状態
初心者の人に教えるにあたって、Activityのライフサイクルをどう説明したらいいかで迷ってたのですが、ちょっといい説明があったのでメモってみました。
状態
- Active
- ActivityがActivity Stackの一番上にある。
- 最前面のvisibleでfocusedでユーザ入力を受けられる状態。
- Systemからkillされる優先度はPausedより低い。
- Paused
- ActivityがActivity Stackの一番上にある。
- visibleだけどfocusは当たってない状態。例えば透過Activityやフル画面でないActivityが対象のActivityより上に表示された場合など。
- unfocusedなのでユーザ入力は受け付けられない。
- この状態でシステムからkillされることは滅多にないがまれにある。
- Systemからkillされる優先度はStoppedより低い。
- Stopped
- unvisibleな状態だけどメモリ上には残っている。
- この状態でデータセーブしたり、UI状態を保存したりする。
- Systemからはまず最初にkillされる。
- Inactive
- Activityがkillされて再起動する前の状態。
- この状態になるとActivityStackからは削除される
各メソッドについて
- onCreate
- Activityの初期化を行う。UIをinflateしたり変数定義やサービス、スレッドの生成など。Activity生成時に1回だけ呼ばれる。
- onDestory
- onCreate()で生成した全てのリソースを解放する。主に外部との接続(ネットワークやデータベースリンク)を閉じる処理をココで実装。
- 必ずシステムから呼び出されるわけではないことに注意。
- onRestoreInstanceState
- UIの保存したい情報をBundleに入れて、onSaveInstanceStateメソッドをオーバライドしたメソッド内で保存する。この保存した前の画面の状態を読み出すメソッド。
- onStop
- Visible→Invisibleに遷移するとき呼ばれる。見えなくなるので、アニメーションとか、GPS、TimerやService、Broadcast ReceiverなどUIの更新に使われるようなプロセスを終了させる。必ずシステムに呼び出されるわけではないことに注意。
- onStrat/onRestart
- Invisible→Visible状態になったとき、onStartまたはonRestartでonStopで停止したUIを更新するようなプロセスを開始する。
- onRestartはonStartより前に呼び出される。Activityが一旦Invisibleになったあと、Visibleになったときのみ実行される。
- onPause
- アプリのレスポンスに影響するので、ココはなるべく軽く速くなるように実装する。
- onPauseの前に、onSaveInstanceState()が実行される。このメソッドはUI状態をBundleオブジェクトにつめてActivityのUI情報(例えば、入力途中の文字列とか、保存前のcheckboxの状態とか、フォーカス状態など)を保存する。なのでUI情報の保存はココで実装すべきじゃない。
- ここでスレッドやプロセス、Broadcast Receiverを一時停止する。
- 終了するときはシステムから必ず呼ばれる。
- onResume
- アプリのレスポンスに影響するので、ココはなるべく軽く速くなるように実装する。
- onPause()で一時停止したスレッドやプロセス、Broadcast Receiverを再開させるような処理を実装する。
- UI情報のリロードはココで実装すべきじゃない。