モバイルアプリを開発していると、ビューの初期化が上手くできなかったり更新処理が思った動作と違っていたりすることがあります。これは、アプリ開発で必ず必要となるライフサイクルについてしっかりと理解していないことが多いためです。ライフサイクルを理解することで、アプリの不具合を少なくしたりパフォーマンスを向上させることにつながります。
ライフサイクルとは?
Androidアプリは、ライフサイクルという仕組みでシステムがアクティビティを作成、停止、再開、破棄などの処理を行っています。このライフサイクルは Craete, Start, Resume, Pause, Stop, Destroy の順で巡回します。そのためアプリは、ライフサイクルの適切な場所でコンポーネントやビューの初期化や更新などを行う必要があります。間違った処理をしてしまうと強制終了したり、適切に行えばパフォーマンスの向上などにもつながるので、アプリ開発ではライフサイクルの理解が大切になってきます。
アクティビティについてよく分からないよという方は次の記事で解説しています。
アプリのライフサイクルの流れ
アプリが起動するとライフサイクルは、Craete, Start, Resume, Pause, Stop, Destroy の順で実行されます。これらは、アクティビティの中でコールバックとして呼ばれるのでUIの更新や通信処理などを行うことになります。ライフサイクルの各処理について解説していきます。これらは、LifecycleObserverを利用して受け取ることも可能になっています。
onCreate
システムがアクティビティを作成したときに最初に呼ばれるメソッドです。1度呼ばれるとアクティビティが作成済になるので、2度目に呼ばれることはありません。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アプリ開発の参考書
土日などに時間を確保してやりたいときにおすすめの本です。iPhoneアプリ開発の手順を一通り理解できるように設計されています。アプリ開発を「体験」することにこだわっていて、開発したことがない人にも楽しめる内容になっています。
たった2日でマスターするiPhoneアプリ開発集中講座 Xcode 11 Swift 5対応
また、もっとAndroidアプリ開発に必要な知識を学びたいという人向けに、次の記事で参考になる本を紹介しています。初級〜中上級まで紹介しているので、ぜひ参考にしてみてください。