[Kotlin]Activityのライフサイクルとは

アイキャッチ画像 kotlin

Activityのライフサイクルとは

Activityには6種類のライフサイクルがあります。Activityは開始から終了まで、この6種類のライフサイクルを遷移します。アプリを実際に使用するユーザーの操作やシステムの状態の変化に応じて、適切なライフサイクルに処理を実装することにより、アプリの安定性やパフォーマンスを高められます。

  • アプリが始まったらこの処理を実行したい
  • バックグラウンドから戻ってきたら、画面の状態を最新にしたい
  • アプリ終了時には特定のデータを消したい

上記のように、アプリを開発していると特定のタイミングで特定の処理を実行させなければいけないことがあります。これを実現できるのが各ライフサイクルのステージです。

ライフサイクルには6種類のステージがある

ライフサイクルはActivityの状態に応じて、6種類のステージが用意されています。
AndroidDevelopersのサイトに分かりやすい画像が掲載されているので、見てみましょう。

ライフサイクル
アクティビティのライフサイクル  |  Android Developers

こちらの画像ではActivityの開始と終了までActivityがどのような状態を遷移していくのか、まとめてあります。
それでは各項目について、解説します。

onCreate()

onCreate()はActivityが生成されるときに一度だけ呼ばれるメソッドです。画面のレイアウトの設定やデータの初期化など、一番初めに行いたい処理を実装するのに向いています。

onStart()

onStart()はアクティビティが生成されて、実際にユーザーに見える直前に呼び出されます。onCreate()の終了後やonStop()に入った後、再度アクティビティが動き出す時が起動するポイントです。アプリがバックグラウンドから呼び出される時も、onStart()から始まります。

onResume()

onResume()はonStart()の次に呼び出されるメソッドで、このタイミングでアクティビティがユーザーに見える状態になります。

では、onStart()とonResume()の違いは何?と思う方がいらっしゃるかと思います。
ユーザーに見えているかどうかが違いです。
UIの初期化のような、事前に済ませておきたい処理はonStart()に、ユーザーの最新の情報を反映させたい時はonResume()のように使い分けるといいでしょう。

onPause()

onPause()は、現在実行されているアクティビティとは別のアクティビティが始まり、アクティビティが一時的に隠れているときに実行されます。例えばユーザーが入力していた文字を一時保存するような処理を行います。

onStop()

onStop()はアクティビティが完全にユーザーから見えなくなったときに、実行されます。つまりアプリがバックグラウンドに移動した時などに呼び出されます。不必要なリソースの解放などを行います。

onDestroy()

onDestroy()はアクティビティのライフサイクルの最後の地点となります。ユーザーがアプリを終了するときに主に呼び出されます。アクティビティが再構成される際にも呼び出されます。最後に不必要な部分を削除したり、データを変更することによって次回のアクティビティの開始時の安定性が高まります。

onPause()~onDestroy()で実装すべき内容はどれも似ているというのが個人的な見解です。
アプリの要件に則って適切な場所で処理すればいいと思います。

実際にソースコードを用いて使ってみる

各ライフサイクルの実装方法はとても簡単です。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)
}

override fun onStart() {
    super.onStart()
}

override fun onResume() {
    super.onResume()
}

override fun onPause() {
    super.onPause()
}

override fun onStop() {
    super.onStop()
}

override fun onDestroy() {
    super.onDestroy()
}

上記の様に各メソッドをアクティビティ内にコピペするだけで使えちゃいます。

一言

ライフサイクルの全てのメソッドに処理を実装させる必要は必ずしもないです。
紹介した使用方法以外にも、アプリの要件によって様々な用途があります。
「処理して欲しいタイミングで処理してくれない…」と思ったときに適切なライフサイクルで処理を実行できているか確認して、試してみるのが良いと思います。