ライフサイクルとは
Activityのライフサイクル
初めに:Activityとは?
この記事では、Activityという言葉がよく登場します。
ここでは、Activity=アプリの画面という意味で使います。
初めは、違和感があるかもしれませんが”ふーん”って感じで
頭の片隅に入れてあげてください。
—
Activityのライフサイクルには大きく分けて7つのメソッドに分かれています。
本記事では一つずつ紹介します。
全体の流れとしては以下のようになっています。
(https://developer.android.com/guide/components/images/activity_lifecycle.png?hl=ja)
onCreate()
onStrart()
onResume()
onPose()
onStop()
onDestroy
onCreate()
—
onCreate()が呼ばれるのは、Activityが初めて生成される時です。
Activityのライフサイクルの中でも一度しか行われません。
そのためこのメソッドでは一度のみ処理すれば良いものを実行するのが適切です。
例:
①Viewの取得
setContentView()メソッドを呼び出し、最初のViewを指定します。
また、Viewは、LayoutView(xmlファイル)が指定されています。
②savedInstanceの受け取り
savedInstanceは、onCreate()内でActivityオブジェクトの状態を復元する時に使われます。
ただし、初回の時はnullであるためnullableなクラスです。
tips:savedInstanceの中に値が入るとき
savedInstanceの中に値が入るときは、大きく分けて2パターンあります。
構成の変更時とフォントが変わった時です。
①構成の変更時
構成の変更というと難しく感じるかもしれませんが
スマホの言語が変わったとき、フォントが変わったとき、画面が回転したときです。
そして構成が変更されると、Activityは一度破壊されます。
https://developer.android.com/guide/topics/manifest/activity-element.html?hl=ja#config
②アプリのメモリが無くなったとき
バックグラウンドにアプリが溜まりすぎて、フォアグラウンドのアプリのメモリが不足することがあります。その時は、AndroidにはLow Memory Killerという仕組みによりアプリ(プロセス)を削除します。もしバックグラウンドにアプリがあり、キルの対象になるとActivityも破棄されます。
上記のように一度Android OSによって破棄され、再生成となる時は破棄される前の状態を保持します。
onCreate()が呼ばれるとすぐにonStrart()が呼ばれます。
onStrart()
—
onStartが呼ばれるのは、Activityが開始された時です。
具体的に言うと、アプリがActivityをフォアグラウンド(ユーザーが見てる画面)に移動して操作可能な状態の準備を行うと、このコールバックが呼び出されます。
このメソッドでは、主にViewへのイベント登録や初期化などが行われます。
イベント登録、初期化の例としては、クリックされた時のリスナーを登録する
setOnClickListener()などが挙げられます。
(リスナー登録一覧)
https://developer.android.com/reference/android/view/View#setOnClickListener(android.view.View.OnClickListener)
Tips:onCreate()とonStrart()の違いってある?
あれ、Viewへのイベント登録や初期化は、onCreateでもできるじゃないか?と思われた方もいるのではないでしょうか?
良い着眼です!
実は、簡略化のためにonCreateでViewの初期化などを行っている場合もあります。
しかし、例えばonCreateで初期化を行うと、別のActivityから戻ってきた時に初期化されず想定した挙動と違うことが起きる可能性があります。
そのため、onCreate()ではViewの取得、onStart()ではViewへの初期化と分けて行うのが望ましいと言われます。
(プロジェクトなどによって変わるので絶対!というわけではありませんが。。)
onStart()が呼ばれるとすぐにonResume()が呼ばれます。
onResume()
—
onResume()が呼ばれるのは、ユーザーに画面が表示されてから操作を行えるようになる直前です。
Activityは再開(Resume)状態になると、フォアグラウンドに移動し、onResume()がコールバックされます。
このメソッドでは、主にActivityを再開するための準備が行われます。
~再開するための準備~
①UIの更新
テキストや画像の変更、リストの更新などが行われます。
②外部サービスとの接続を再開
データベースやサーバーなどの接続を再開します。
onResume()が呼び出されると、ユーザーはアプリケーションを操作できるようになります。
onPause()
onPause()が呼び出されるのは、アプリ内の他のActivityに遷移する時です。
ただし、Activityに遷移すると行っても元のActivityが完全に非表示になっていない時です。onPause() メソッドが完了すると、一時停止状態になり、遷移する前のActivityが再開されるか、完全に非表示になるまではこの状態が維持されます。
onPause()が呼ばれるのは以下の時です、
①Activityに別のActivityが覆うとき
例えば、MainActvtyの上に、ダイアログやポップアップが表示される時です。
覆われた画面が若干暗くなることがありますよね。
②アプリケーションがバックグラウンドに移動する時
例えば、ホームボタンを2回押して、現在の起動しているアプリ一覧を表示することが出来ます。(マルチタスク画面)
Activityが再開されるとonResume()
Activityが完全に非表示になるとonStop()が呼ばれます。
onStop()
—
onStop()が呼び出されるのは、Activityが完全に非表示になる時です。
onPause()とは異なり、新たに開始されたActivityが画面全体を占有する場合などに発生します。
onStop()が呼び出されると、Activityは停止状態になり、表示されていない間に実行する必要のない機能を停止できます。
Activityが再度表示されると、onRestart()が呼ばれます。
onDestroy()
—-
onDestroy() が呼び出されるのは、Activityが破棄される直前に呼び出されます。
呼び出されるのは以下の時です。
①Activityを明示的に終了した場合
. アクティビティが明示的に終了された場合: ユーザーがアプリから明示的に戻るボタンを押してアクティビティを終了する場合、onDestroy()メソッドが呼び出されます。
2. バックスタックからの削除: アクティビティがバックスタックから削除されると、onDestroy()メソッドが呼び出されます。これは、他のアクティビティに移動する際などに発生します。
②構成の変更
デバイスの向きが変わったり、マルチウィンドウ モードにするなど画面の構成が変わると、Activityが一時的に破棄されます。
onRestart()
onRestart()は、HOMEキーなどでアプリがバックグラウンドタスクになり、再びフォアグラウンドタスクになった際に呼び出されるライフサイクルイベントです。アプリがバックグラウンドから復帰した際に行いたい処理はここで実行します。
アプリを開く=アクティブが開始される
onCreate()→onStrart()→onResume()
分かれている理由:状態が細かく分かれており、状態に応じて処理が行えるようにするため
アプリが開かれた状態
Android | アクティビティのライフサイクル (javadrive.jp)
onCreate と onStart と onResume の違い - Qiita
ActivityのonCreate() | mokelab tech sheets
【Android】savedInstanceStateの意味と開発者オプション【初心者向け】 - Qiita
https://atmarkit.itmedia.co.jp/ait/articles/1604/04/news011_2.html
https://qiita.com/akitaika_/items/150857170903f38d3d1c
—
①アプリ立ち上げ時
onCreate()
↓
onStrart()
↓
onResume()
②アプリ終了時
onPose()
↓
onStop()
↓
onDestroy
③中断→再開時
アプリ中断
↓
onPose()
↓
onStop()
↓
onRestart()
④中断→再開時
アプリ中断
↓
onPose()
↓
onStop()
↓
onRestart()
フラグメントのライフサイクル
フラグメントのライフサイクル
本記事では、フラグメントのライフサイクルを紹介します。
まず、フラグメントとActivityの違いは?
フラグメントとActivityのライフサイクルの違いは大きく分けて2つあります。
表現の範囲
Activity:画面全体を表現する
フラグメント:画面内の部分的な部品を表現する
Activityは画面の基本単位なのに対して、フラグメントは部分的なUIコンポーネントです。
再利用性
Activity:異なるActivity(ホーム画面、設定画面)の切り替えに使われるため再利用性は高くない
フラグメント:異なるActivity内でUIコンポーネントとして使用出来るため再利用性は高い
フラグメントは、Activity内で様々な部品を組み合わせることが出来るため、Activityと異なり複雑なUIを効率的に実現しやすいという特徴を持っています。
フラグメントのライフサイクルは、Activity以上のコールバックメソッドを持っています。
画像
今回はその中でも、Activityに無い以下の6つのメソッドを紹介します。
onAtached()
onCreateView()
onActivityCreated()
onViewCreated()
onDestroy()
onDetach()
onAtached()
呼ばれるタイミング:フラグメントがActivityにアタッチする直前
役割:Activityとの参照の確立、フラグメントの初期化
アタッチとは?フラグメントが特定のActivity内で使用されることを意味しています。
onAtached()は、Activityとフラグメントの間の重要なコミュニケーションの開始のポイントとして機能します。
フラグメントの初期設定がこの中で行われることがあり、リソースの取得、初期化、Activityとの参照の確立など該当します。
onCreateView()
呼ばれるタイミング:Viewを表示する直前
役割:フラグメントのUIを作成
onCreateView()ではインフレートを行い、UIの作成や初期化を行うのが主な役割です。
onActivityCreated()
呼ばれるタイミング:ActivityのonCreatが完了した直後
役割:Activityに関連する設定、他のフラグメントとの連携
onActivityCreated()は、関連するActivityが完全に作成され、初期化された後に呼ばれます。
そのため、このメソッド内では、Activityに関連する設定(フラグメント間へのデータの共有など)などが行うことができます。
onViewCreated()
呼ばれるタイミング:フラグメントのViewが初めて表示された時
役割:Viewの初期化
onViewCreated()は、UIが利用可能になった直後に呼ばれViewに関連する初期化はこのメソッドで行われます。
よく使われるリスナーの設定やリストビュー内のアイテムの設定などは、この中で行われます。
onDestroyView()
呼ばれるタイミング:フラグメントのViewが破棄される時
役割:Viewの解放
onDestroyView()は、フラグメントそのものではなくフラグメント内でインフレーとしたViewが破棄される時に呼ばれます。例えば、新しいトランザクションによって別のフラグメントが表示されるときに発生します。
主にViewの解放をすることが目的で、不要になったUI要素などを解放しメモリリークを防ぎます。onDestroyView()が呼ばれても、フラグメント自体は残っているため完全に削除する際は、onDestroy()メソッドが呼ばれます。
onDetach()
呼ばれるタイミング:フラグメントがActivityから切り離される時
役割:リソースの解放
onDetach()は、フラグメントとActivity間の参照を終了し、フラグメントがActivityの管理外になることを意味します。
参照を終了することで、フラグメント内で使用されていたリソースの解放や後片付けを実行するために使われたりします。特にフラグメントのリソースの管理や再利用する場合に必要になってきます。
最後に
簡単ですが、フラグメントのライフサイクル紹介でした。どのライフサイクルで何を行うかというのを意識してコーディングが重要です。