うきっとラボ~中卒から始めるプログラミング~

中卒のポンコツ太郎が立派なプログラマになるまでの道のり

【Android Studio】アクティビティの”ライフサイクル”とは?

アクティビティのライフサイクルってなんじゃ?

アクティビティをより便利に使うためには、ライフサイクルの理解が必要です。

ライフサイクル
ライフサイクルとは、人が誕生してから死ぬまでの過程を円環を模した図で表現したもの。また、転じて、ビジネスの分野で、製品やサービスなどが生まれてから消えるまでの過程のこと。
- IT用語辞典 e-Words 引用

これは、アクティビティにも当てはめて説明することができます。
ユーザーがアプリ内やアプリ外に移動したり、再びアプリに戻ったりすると
それぞれのアクティビティは、呼び出されて最前面に表示されたり、裏に潜んでいる状態になったりと、その状態を変えながら存在します。もちろん完全に終了すると存在自体がなくなります
このようなアクティビティの状態の変化を「アクティビティのライフサイクル」といいます。


アクティビティの「4つの状態」

アクティビティには主に4つの状態*1が存在します。
これらを切り替えることによって、画面遷移などを実行しています。

実行状態

画面の最前面に表示されており、操作を受け付けている状態。

一時停止状態

他のアクティビティが最前面に表示されているが、このアクティビティも表示されている状態。
つまり、このアクティビティの上に他のアクティビティが表示されていて、他方のアクティビティは一部が透明になっているか、画面全体を覆ってはいない、みたいな状態です。
まだアクティビティは生きている(情報を保持している)状態ですが、メモリが極端に不足した場合、システムに強制終了される場合もありますΣ(゚Д゚)

スタンバイ状態*2

アクティビティが他のアクティビティによって完全に見えなくなり、バックグラウンドに隠れてしまった状態。
まだアクティビティは生きている状態ですが、メモリの不足によりシステムに強制終了される場合もありますΣ(゚Д゚)

完全停止状態

アクティビティが破棄され、存在しなくなった状態。
アクティビティ、お前はもう死んでいる( 一一)。。。

コールバックメソッド

システム側は、先ほど説明したアクティビティの各状態を7つの「コールバックメソッド」を呼ぶことでコントロールしています。
コールバックメソッドはそれぞれの状況によって決まった流れで呼ばれます。

onCreate()

このメソッドは必ず実装する必要があります。
アクティビティが生成されるときに呼ばれます。onDestroy()が呼ばれるまで、1度しか呼ばれません。
そのため、アクティビティの存続期間のうち、1度だけ実行する必要がある基本的なアプリケーション起動ロジックを記述します。
たとえば、最初の初期化処理(ビューの取得、リスナーの設定etc...)や、画面インターフェースの作成などです。
※このメソッドの処理が終了すると続けてonStart()が呼ばれます

onStart()

アクティビティが表示される前に呼ばれます。
これ以降は複数回呼ばれることがあります。
※このメソッドの処理が終了すると続けてonResume()が呼ばれます。

onResume()

アクティビティが前面にきて、ユーザーとのやりとりを始められるようになる直前に呼び出されます。
データベースと連携する場合はここでデータベースに接続します。
また、保存データの復元処理などもここで行うようにします。
※他のアクティビティや状態に移動する状況が発生するまで、アプリはこの状態にとどまります。

onPause()

一時停止状態に移行する際、ユーザーがアクティビティを離れることを最初に示すときに呼び出されます。(一部のイベントがアプリの実行に割り込んだ場合など)
ただし、アクティビティが破棄されることを意味するわけではありません。
この状態でonStop()が呼ばれる前にOSにKillされる可能性があるため、各データの保存処理はここで行うようにします。

onStop()

スタンバイ状態に移行する際に呼び出されます。
例えば、新たに開始されたアクティビティが画面全体を占有する場合などです。
ここでは、アプリが表示されていない間、不要なリソースを解放または調整するときなどに使います。

onRestart()

スタンバイ状態のアクティビティが再開する際に呼ばれます。
※この後続けてonStart()が呼ばれます

onDestroy()

アクティビティが破棄される(完全停止状態になる)前に呼び出されます。
たとえば、ユーザーがアクティビティを完全に閉じた、またはアクティビティに対して finish() が呼び出された場合、画面の向きを変えた場合です。


3つの”期間(ライフタイム)”

以上の7つのメソッドを適切に実装することで、アクティビティを有効に扱うことができます。
また、ライフタイムと呼ばれるライフサイクル中のループ期間について知ることで、ライフサイクルについてより深く理解することができそうです(/・ω・)/

アクティビティが存在している期間(エントリーライフタイム:entire lifetime)

《 onCreate() の呼び出し後 ~ onDestroy() の呼び出し前》
この期間が、1つのアクティビティの一生ということになります。
アクティビティは、onCreate() で「グローバル」状態のセットアップ(レイアウトの定義など)を実行し、onDestroy() で残っている全てのリソースを解放する必要があります。

ユーザが認識できる期間(ビジブルライフタイム: visible lifetime)

《onStart() の呼び出し後 ~ onStop() の呼び出し前》
この間、アクティビティは画面上に表示されている状態です。
これらの 2 つのメソッド間で、アクティビティをユーザーに表示するのに必要なリソースは保持できます。
アクティビティがユーザーに表示されたり、非表示になったりとアクティビティの状態が変化する場合、visible lifetime は複数回行われることになります。

ユーザが操作できる期間(フォアグラウンドライフタイム:foreground lifetime)

《 onResume() の呼び出し後 ~ onPause() の呼び出し前》
この間、アクティビティは画面上の最前面にあり、ユーザーの入力フォーカスがある状態です。
foreground lifetimeはアプリ実行中、頻繁にループする(複数回行われる)可能性があるため、 2 つのメソッドのコードはユーザーを待たせてしまうような遅い遷移にならないよう、適正な軽い処理にしておく必要があります。


まとめ

ということで、
今回は「アクティビティのライフサイクル」について学んでみました(/・ω・)/

ライフサイクルをフルに活用して実装するのは、やっぱり慣れが必要だと思います。。。が!!
これを理解するかしないかで、アプリの完成度は大きく変わっていきそうですね(*'ω'*)

これらの知識は、一般的には”知ってて当たり前”とも言われています。。。(;'∀')グヘェ
でも最初はみんな知らないところからスタートしていますので、少しづつ理解していきましょう(^_^)v

まずはAndroidDeveloperのライフサイクルについて書いてある場所を、呼んでみることをお勧めします!
developer.android.com
developer.android.com


また、まとめている過程でちらっと知りましたが、
他にも「フラグメント」と呼ばれるアクティビティの子供みたいなもの(?)や、おなじみの「ビュー」にもライフサイクルがあるようですΣ(゚Д゚)
これらも必要な時に学んでいこうかなと思います!

さて次回は、
実際にアプリを動かしながら、どのタイミングでどのメソッドが呼ばれるのかをいろいろと検証していこうと思います!

追記・訂正

●2019/11/15
「onCreate()」に関する記述にて、「システムが初めてアクティビティを作成するときに呼ばれる」とありましたが、正しくは「アクティビティが生成されるとき」です。
訂正しました。ご指摘ありがとうございます。

*1:Android Developerでは"3つ"となっていますが、イメージをわかりやすくするため4つとして説明しています

*2:Android Developerでは”停止状態”とされています