Android Kotlin基礎講座 04.1: ライフサイクルとログ情報について

Android Kotlin基礎講座

タスク:フラグメントのライフサイクル

Androidフラグメントのライフサイクルはアクティビティのライフサイクルに似ています。加えてフラグメント特有のメソッドがあります。

このタスクでは、以前の記事で作成したAndroidTriviaアプリを使って、フラグメントのライフサイクルを調べるためにいくつかログを追加します。AndroidTriviaアプリはAndroid開発に関する問題を出し、全て正しく回答するとクリアとなるゲームアプリです。

AndroidTriviaアプリのそれぞれの画面はフラグメントです。

よりシンプルにするために、このタスクではTimberライブラリではなく、Android logging APIを使います。

  1. 以前の記事で作成したAndroidTriviaアプリを開いてください。または完成済みプロジェクトをAndroidTriviaからダウンロードしてください。
  2. TitleFragment.ktを開いてください。アプリをリビルドするまで、Android Studioがbindingエラーやunresolved-referenceエラーを表示する場合があります。
  3. onCreateView()メソッドまでスクロールしてください。ここではフラグメントのレイアウトがインフレートされデータバインディングが成されています。
  4. ログ文をonCreateView()メソッドに追加してください。setHasOptionMenu()と最後のreturn文の間に追加してください。
setHasOptionsMenu(true)

Log.i("TitleFragment", "onCreateView called")

return binding.root
  1. onCreateView()メソッドのすぐ下に、残りのフラグメントライフサイクルメソッドごとのログ文を追加してください。コードは以下のようになります。
override fun onAttach(context: Context?) {
   super.onAttach(context)
   Log.i("TitleFragment", "onAttach called")
}
override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   Log.i("TitleFragment", "onCreate called")
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
   super.onActivityCreated(savedInstanceState)
   Log.i("TitleFragment", "onActivityCreated called")
}
override fun onStart() {
   super.onStart()
   Log.i("TitleFragment", "onStart called")
}
override fun onResume() {
   super.onResume()
   Log.i("TitleFragment", "onResume called")
}
override fun onPause() {
   super.onPause()
   Log.i("TitleFragment", "onPause called")
}
override fun onStop() {
   super.onStop()
   Log.i("TitleFragment", "onStop called")
}
override fun onDestroyView() {
   super.onDestroyView()
   Log.i("TitleFragment", "onDestroyView called")
}
override fun onDetach() {
   super.onDetach()
   Log.i("TitleFragment", "onDetach called")
}
  1. コンパイルしてアプリを起動してください。Logcatを開いてください。
  2. I/TitleFragmentとLogcatの検索フィールドに入力してフィルタリングしてください。アプリが起動したらLogcatは以下のように見えます。
21933-21933/com.example.android.navigation I/TitleFragment: onAttach called
21933-21933/com.example.android.navigation I/TitleFragment: onCreate called
21933-21933/com.example.android.navigation I/TitleFragment: onCreateView called
21933-21933/com.example.android.navigation I/TitleFragment: onViewCreated called
21933-21933/com.example.android.navigation I/TitleFragment: onStart called
21933-21933/com.example.android.navigation I/TitleFragment: onResume called

ここでフラグメントの全体のスタートアップライフサイクルを確認しましょう。コールバックも含んでいます。

  • onAttach(): フラグメントがそのオーナーアクティビティを紐づけられたときに呼び出されます。
  • onCreate(): アクティビティのonCreate()と似ていますが、フラグメントのonCreate()は最初のフラグメントを作成するために呼び出されます。(レイアウトではない)
  • onCreateView(): フラグメントのレイアウトをインフレートするために呼び出されます。
  • onActivityCreated(): オーナーアクティビティのonCreate()が完了したときに呼び出されます。フラグメントはこのメソッドが呼び出されるまでアクティビティにアクセスできません。
  • onStart(): フラグメントが可視化されたときに呼び出されます。アクティビティのonStart()に似ています。
  • onResume(): フラグメントがユーザーフォーカスを得た時に呼び出されます。アクティビティのonResume()に似ています。
  1. Playボタンを押してゲームを進めてください。Logcatを確認してください。
21933-21933/com.example.android.navigation I/TitleFragment: onAttach called
21933-21933/com.example.android.navigation I/TitleFragment: onCreate called
21933-21933/com.example.android.navigation I/TitleFragment: onCreateView called
21933-21933/com.example.android.navigation I/TitleFragment: onViewCreated called
21933-21933/com.example.android.navigation I/TitleFragment: onStart called
21933-21933/com.example.android.navigation I/TitleFragment: onResume called
21933-21933/com.example.android.navigation I/TitleFragment: onPause called
21933-21933/com.example.android.navigation I/TitleFragment: onStop called
21933-21933/com.example.android.navigation I/TitleFragment: onDestroyView called

次のフラグメントを開くとタイトルフラグメントが閉じ、以下のライフサイクルメソッドが呼び出されます。

  • onPause(): フラグメントがユーザーフォーカスを失う際に呼び出されます。アクティビティのonPause()に似ています。
  • onStop(): フラグメントが画面上で見えなくなる時に呼び出されます。アクティビティのonStop()に似ています。
  • onDestroyView(): フラグメントのビューが必要なくなったときに呼び出されます。そのビューに関連するリソースをクリーンアップします。
  1. アプリ内のアップボタン(左上の矢印ボタン)を押してタイトル画面に戻ってください。
21933-21933/com.example.android.navigation I/TitleFragment: onPause called
21933-21933/com.example.android.navigation I/TitleFragment: onStop called
21933-21933/com.example.android.navigation I/TitleFragment: onDestroyView called
21933-21933/com.example.android.navigation I/TitleFragment: onCreateView called
21933-21933/com.example.android.navigation I/TitleFragment: onViewCreated called
21933-21933/com.example.android.navigation I/TitleFragment: onStart called
21933-21933/com.example.android.navigation I/TitleFragment: onResume called

この時、onAttach()とonCreate()はフラグメントの起動に呼び出されていません。フラグメントオブジェクトはまだ存在していてオーナーアクティビティに紐づいているため、ライフサイクルはonCreateView()からスタートします。

  1. 端末のホームボタンを押してください。LogcatにはonPause()とonStop()のみが表示されることを確認してください。これはアクティビティの場合と同じ挙動です。ホーム画面に戻るとアクティビティとフラグメントはバックグラウンドに置かれます。
  2. 最近開いた画面からアプリに戻ってください。アクティビティの場合と同じく、onStart()とonResume()メソッドが呼び出され、フラグメントがフォアグラウンドに戻ります。

完成済みプロジェクト

完成済みプロジェクトは以下からダウンロードできます。

DessertClickerLogs

コメント

プロフィール

プロフィール
コードラボJP

大学卒業後SEに就職、現在は退職しフリーランスとして活動中。
『初心者でも挫折せずに一人でプログラミングを学べる』をモットーに、コードラボJPを開設
お問い合わせ等はcodelabsjp@gmail.comまで

コードラボJPをフォローする
タイトルとURLをコピーしました