【Android】Activityのライフサイクル
最初に
Andoridは画面遷移は遷移前の画面の上に載るように遷移後の画面が生成されます。
バックキーを押すと、今度は上の画面(遷移後の画面)が消え、下の画面が現れるます。
使用者の立場では
1.アプリをオンにする。
2. アクティビティが画面に表示される。
程度に思われるかもしれませんが、実際、アクティビティが生成から削除されるまでにはさまざまなステップがあります。
ライフサイクルとは
Andoridは画面遷移やバックグラウンドへの移動、アプリキルなどの様々な動作により、Activityの生成と消滅を繰り返しています。このようなActivityが生成されてから削除されるまでの工程がライフサイクルです。
ライフサイクルを理解し、適切な作業をすれば、安定したアプリを作ることがでます。
ライフサイクルを考慮しないAPPの例
- アプリを使用している途中、他のアプリに遷移際に強制終了する。
- アプリを使用していないのにリソースが無駄になる。
- アプリを使用している途中、他のアプリに遷移してからまた戻ったのに、ユーザーの進行状況が保存されていない。
- 画面の横/縦への遷移を行う場合、強制終了または進行状態が保存されていない場合
ライフサイクルを考慮せずにアプリを作れば、十分に発生する可能性がある状況だ。
ライフサイクルのコールバック
Activityのライフサイクルの各段階を移動するために、Activityクラスから提供されているコールバックが6つあります。
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onRestart()
- onDestroy()
各コールバックは呼ばれるタイミングが異なり、適切な処理も異なる。
適切な処理をすれば、次のような状況を回避することもできます。
onCreate()
アクティビティを新たに生成すると、クラス内にonCreateが自動的に生成されます。他のメソッドはないけどonCreateだけ!
つまり、必ず実装しなければならないメソッドという意味です。
onCreateはアクティビティが生成されると最初に実行されるメソッドです。
画面レイアウト定義、ビューを生成したりデータバインディングなどをここですればいいです。
そして、ライフサイクルの間にたった一度だけ実行されるメソッドです。
それで、アクティビティの最初の実行時にのみしなければならない作業をここですればいいです。
onStart()
アクティビティが画面に表示される直前に呼び出されます。
画面に進入する度に実行されなければならないコードをここに作成すればいいです。
onResume()
他のアクティビティがアクティビティを覆ってしまったり、アプリ使用中に電話がかかってきて、しばらくアプリを離れたり、LINEで写真を添付する際、「ギャラリー」ではなく「カメラ」をクリックしてカメラをオンにするなどの状況で、しばらくアクティビティが一時停止されてから戻ってくる場合、onResumeメソッドが呼び出さます。
もしアクティビティが再開されたときに実行すべきコードがあれば、ここに作成すればいいです。
onPause()
アプリがバックグラウンドに移動したことを示すために呼び出される。この段階ではアプリキル = Activityが消滅するとは限らないです。
ユーザーがアクティビティをしばらく離れるため、リソースを消耗し続けたりGPSが作動し続けたりする必要はないです。
フォーグラウンドにいない時に実行する必要のない機能をonPauseで一時停止すればいいです。
終了する前に呼び出されるメソッドがonStop、onDestroyの2つあってここで作業してもいいんじゃないかと思いますが、onStop、onDestroyはメモリが不足すると呼び出されない可能性がある問題があります。
onPauseはほんの少しの間実行されるメソッドなのでデータを保存したり、ネットワークを呼び出すなど重い作業をしてはならないです。
onStop()
アクティビティがユーザーに表示されなくなった場合、このメソッドが呼び出されます。
データを保存したり、ネットワークを呼び出すなど重い作業をここですればいいです。
Activityが再度表示される時にはonRestart->onStart->onResume()が呼び出され、Activityが
削除される時にはonDestroy()を呼び出す。
onRestart()
ホームに出てからまた戻ったり、他のアクティビティに行って、後ろに行くボタンを通じて戻ってくる場合、このメソッドが呼び出されます。
これが呼び出された後にはonStart()->onResume()と続いて呼び出されます。
onDestroy()
アプリを終了する場合に呼び出されます。onStopでまだ解除できていないリソース作業をすればいいですが、メモリが不足している場合、メソッド呼び出しが行われずに終了する可能性があるので注意する必要があります。
その他
それ以外にも、特異なケースが画面回転をした時があります。スマートフォンを縦から横方向に回転するとアクティビティがDestroyされた後、再びCreateされます。
Discussion