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オブジェクトにキーと値のペアを追加して状態を保存します。その後、再起動時にonCreateBundleから値を読み込み状態を復元します。
override fun onSaveInstanceState(outState: Bundle?) {
    // アクティビティの状態をキーと値のペアで追加
    outState?.run {
        putString("name", "Taro Tanaka")
        putInt("age", 22)
    }

    // 保存
    super.onSaveInstanceState(outState)
}

Androidアプリ開発の参考書

もっとAndroidアプリ開発に必要な知識を学びたい方には、以下の記事で参考になる本を紹介しています。初級〜中上級まで網羅しているので、ぜひ参考にしてみてください。