Androidアプリ開発で大切なライフサイクルを分かりやすく解説

モバイルアプリを開発していると、ビューの初期化が上手くできなかったり更新処理が思った動作と違っていたりすることがあります。これは、アプリ開発で必ず必要となるライフサイクルについてしっかりと理解していないことが多いためです。ライフサイクルを理解することで、アプリの不具合を少なくしたりパフォーマンスを向上させることにつながります。
ライフサイクルとは?
Androidアプリは、ライフサイクルという仕組みでシステムがアクティビティを作成、停止、再開、破棄などの処理を行っています。このライフサイクルは、
Create
, Start
, Resume
, Pause
, Stop
, Destroy
の順で巡回します。そのためアプリは、ライフサイクルの適切な場所でコンポーネントやビューの初期化や更新などを行う必要があります。間違った処理をしてしまうと強制終了したり、適切に行えばパフォーマンスの向上などにもつながるので、アプリ開発ではライフサイクルの理解が大切になってきます。アクティビティについてよく分からない方は、以下の記事をご覧ください。
アプリのライフサイクルの流れ
アプリが起動するとライフサイクルは、
Create
, Start
, Resume
, Pause
, Stop
, Destroy
の順で実行されます。これらは、アクティビティの中でコールバックとして呼ばれるので、UIの更新や通信処理などを行うことになります。ライフサイクルの各処理について解説していきます。これらは、LifecycleObserver
を利用して受け取ることも可能です。
onCreate
システムがアクティビティを作成したときに最初に呼ばれるメソッドです。一度呼ばれるとアクティビティが作成済になるので、二度目に呼ばれることはありません。
Layout
ファイルでUIを作っている場合、このタイミングでsetContentView
を呼び出して反映できます。また、onSaveInstanceState
が呼ばれている場合、このメソッド内で以前の状態を復元できます。onStart
onCreate
の直後に、アクティビティが起動すると呼ばれるメソッドです。このタイミングでUIの初期化を行います。また、アクティビティが非表示状態から再表示される際にも呼ばれることがあります。onResume
onStart
の直後やアクティビティが再開するときに呼ばれるメソッドです。このメソッドが呼ばれるとユーザーがUIを操作できるようになります。カメラのプレビューなど特定のコンポーネントは、このタイミングで実行する必要があります。また、onPause
で解放したコンポーネントを再初期化する必要があります。onPause
ユーザーがアクティビティを離れるときに呼ばれるメソッドです。このときアクティビティが必ず破棄されるわけではありません。電話の着信などの割り込みが発生した場合によく呼ばれます。アクティビティが完全に停止する場合、
onStop
で状態保持の処理を行います。onStop
非表示になったアクティビティは停止状態になり、このメソッドが実行されます。アニメーションの停止などもこのタイミングで行います。アクティビティが再開する際は、
onRestart
が呼ばれ、その後にonStart
が実行されます。onDestroy
アクティビティが停止して破棄される場合に呼ばれます。ユーザーがアクティビティを閉じた場合や、
finish
が実行された場合に呼ばれます。また、デバイスの向き変更などで構成が変更される場合も含まれます。データをデバイスに保持する必要がある場合、このタイミングで保存する処理を行います。ライフサイクルを終了してもアクティビティの状態を維持する
アクティビティのライフサイクルの中で、アプリの状態や動作によってアクティビティが破棄されることがあります。例えば戻るボタンを押した場合や、
finish
を呼び出した場合です。破棄された後でもアクティビティの状態を維持したい場合、破棄されるタイミングでBundle
に記録することで、次回起動時に復元することが可能です。アクティビティの状態を戻すにはonSaveInstanceStateを利用
このメソッドは、アクティビティが破棄されるタイミングで状態を保持するために呼ばれます。
Bundle
オブジェクトにキーと値のペアを追加して状態を保存します。その後、再起動時にonCreate
でBundle
から値を読み込み状態を復元します。override fun onSaveInstanceState(outState: Bundle?) {
// アクティビティの状態をキーと値のペアで追加
outState?.run {
putString("name", "Taro Tanaka")
putInt("age", 22)
}
// 保存
super.onSaveInstanceState(outState)
}
Androidアプリ開発の参考書
もっとAndroidアプリ開発に必要な知識を学びたい方には、以下の記事で参考になる本を紹介しています。初級〜中上級まで網羅しているので、ぜひ参考にしてみてください。