対象者
Android超初心者
この記事はなに?
Android学習時にわかりにくいな、と思ったActivityLifecycle中心の情報まとめ。
本題
そもそも守る必要なんてあるの??
簡単に言ってしまうと、ActivityLifecycleを守らないと、よく落ちるアプリが出来上がります。画面の初期化のタイミングが想定と違ったり、破棄のタイミングがやたら早くて存在しない参照にアクセスしてしまったり・・・そういうことが無いように、この図に沿ってコーディングしましょうね!という取り決めがActivity Lifecycleの主題です。
Activity Lifecycle
『Activityが生まれてから死ぬまでの処理の順序』のこと。
ちょっとググると死ぬほど出てきますが、それだけ重要だという証。
へ~。この順序でイベントが呼ばれるんだ~。
詳細を覚える必要はありません。だって初心者だもん。
大まかな役割をペアで覚えましょう。
ペア | タイミング | 役割 |
---|---|---|
onCreate, onDestroy | 画面の生成、破棄 | 画面の処理に必要なインスタンスの生成、取得、破棄 |
onStart, onStop | 画面の準備開始、停止 | 画面の表示に必要なインスタンスの初期化 |
onResume, onPause | 画面の表示、背面へ | 画面の表示に必要な処理の開始、停止 |
onRestart | 画面の再表示 | 画面の再表示に必要な処理の開始 |
onCreateでViewを取得したり、何かのクラスをnewしたりする。
onDestroyでインスタンスの参照を破棄する。
onStartで取得したViewにイベント登録したり変数を初期化したりする。
onStopでイベントや変数の参照をリセットする。
onResumeで画面表示時に実行したい処理を動かす。
onPauseで画面表示時に実行したい処理を止める。
よく例文で全てをonCreateで書いていることがありますが、あれはあくまで簡略化のためにそう書いているだけ。例えば図を見れば分かる通り、onCreateは本当に最初の一回しか呼ばれないため(onRestartを通る)、画面表示に必要な初期化をその中でしてしまうと、別画面から戻ってきた時などに初期化が行われず、痛い目を見ることになります。
Activity Stack
黄色の半透明エリア「Foreground activity」がユーザに見えている画面。
Activity1からActivity2をStartすると、Activity1は背面に周りActivity2が上にStackされて見えるようになります。
一番上のActivityをfinish()すると、その下に置かれたActivityが表示されます。
アプリはいつ死んでもおかしくない
『防ぐことの出来ない突然死が普通に起こりうる』
**別アプリ等でメモリが足りなくなった場合、予告なくアプリのプロセスはkillされます。再度ユーザが立ち上げ直す必要があります。**と、ライフサイクルに記載されています。なんて恐ろしい・・・((((;゚Д゚))))
図の通りonDestroyなぞ通らないので、onDestroyに終了処理書いちゃえ!なーんてことをしてしまうと、OSからkillされた時大変なことになってしまうので気をつけましょう。
startActivityForResult
『戻り値付きのActivity開始』
使い方はググれば出てくるかと思いますが、startActivityForResultで呼び出したActivityをfinishすると、元画面のonActivityResultが呼ばれるというものです。
大事なのは元画面に戻る際の順番。
画面 | イベント |
---|---|
次画面 | finish() |
次画面 | onPause |
次画面 | onStop |
元画面 | onActivityResult |
元画面 | onRestart |
元画面 | onStart |
元画面 | onResume |
onActivityResultは元の画面に返ってきた時、Start系のイベント処理よりも前に呼ばれます。
onPause辺りで適当にインスタンスを破棄していたりすると・・・?
まとめ
ActivityLifecycleはActivityを起動した際に呼ばれるイベントの順番で、しっかりと状態に対応した記述をしないと、ふとした瞬間に落ちるアプリが出来上がるのでしっかり覚える必要があります。