この記事はAteam Finergy Inc. × Ateam Wellness Inc. Advent Calendar 2023の18日目の記事です。
はじめに
Androidアプリの開発で切り離せないライフサイクル。
onCreate
やonCreateView
など似たような名前も多くそれっぽい所に書いて終わりになりがちです。
今回改めてライフサイクルのコールバックについて種別、実行タイミング、主な用途を整理してそれっぽくを脱しようと思います。
ライフサイクル
以下、ActivityとFragmentでそれぞれ記載します。
記載の順序は基本実行される順番となります。
Activity
公式のドキュメントは下記となります。
https://developer.android.com/guide/components/activities/activity-lifecycle
onCreate
- タイミング
- Activityが生成された時に1回
- 用途
- Activityのライフサイクルの全期間で1回のみ実行する必要があるものを行う
- XMLレイアウトファイルの取得など
- Activityのライフサイクルの全期間で1回のみ実行する必要があるものを行う
onStart
- タイミング
- Activityが開始状態になった時
- Activityがユーザーに見えるようになる直前
- 用途
- UIの初期化
onResume
- タイミング
- Activityが再開状態になった時
- Activityがフォアグラウンドになる時
- 用途
- DBの接続
- データの取得
onPause
- タイミング
- Activityがフォアグラウンドでなくなる時
- 用途
- 続行しない処理の停止
- バックグラウンドで続行する処理の準備、移行
- 補足
- 表示されていない時、ではない
- マルチウィンドウモードではフォーカスされていない時に表示されつつ
onPause
になる
- マルチウィンドウモードではフォーカスされていない時に表示されつつ
-
onPause
の実行時間は短いため以下のような処理は行ってはいけない- DBへの保存
- 高負荷のシャットダウン
- 表示されていない時、ではない
onStop
- タイミング
- Activityが完全にバックグラウンドに移動し停止した時
- 用途
- DBへのデータの保存
- 高負荷のシャットダウン
onRestart
- タイミング
-
onStop
→onStart
の間
-
- 用途
- 停止した処理を再開させる
onDestroy
- タイミング
- Activityが破棄される直前
- Activityが終了する時
- デバイスの向き変更等で一時的にActivityが破棄される時
- Activityが破棄される直前
- 用途
- 未開放のリソースが開放される
Fragment
公式のドキュメントは下記となります。
https://developer.android.com/guide/components/fragments
onAttach
- タイミング
- FragmentがActivityに関連付けられた時
- 用途
- FragmentがActivityに管理されるようになった時に行う処理の定義
- ActivityのListenerを取得など
- FragmentがActivityに管理されるようになった時に行う処理の定義
onCreate
- タイミング
- Fragmentが生成される時
- 用途
- Fragmentを破棄するまで保持し続ける必須コンポーネントの初期化
- 補足
- Fragmentが関連付けられたActivityの生成途中で呼び出される
- ActivityのViewに干渉することはできない
- Fragmentが関連付けられたActivityの生成途中で呼び出される
onCreateView
- タイミング
- FragmentのUIを描画する時
- 用途
- 描画するViewのセットアップ
onViewCreated
- タイミング
-
onCreateView
とonActivityCreated
の間
-
- 用途
- FragmentのViewに関する初期化
onActivityCreated(deprecated)
- タイミング
- 以下の2点が満たされた時
- Activityの
onCreate
が完了 - Fragmentの
onCreateView
が完了
- Activityの
- 以下の2点が満たされた時
- 用途
- 最終的な初期化
- UIの修正など
- Activityが絡むViewの変更など
- 最終的な初期化
- 補足
- このメソッドはdeprecatedです
- 推奨されている対処は以下となります
- FragmentのViewに対する処理は
onViewCreated
- その他の初期化はFragmentの
onCreate
- Activityの
onCreate
が完了した時に処理を行いたい場合は下記の手順で行う- Fragmentの
onAttach
でLifecycleObserverを登録 -
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
のAnnotationを実行したい関数に付ける
- Fragmentの
- FragmentのViewに対する処理は
- 推奨されている対処は以下となります
- このメソッドはdeprecatedです
onStart
- タイミング
- Fragmentが開始状態になった時
- Fragmentがユーザーに見えるようになる直前
- 用途
- Fragmentがユーザーに表示される前の準備
onResume
- タイミング
- Fragmentが再開状態になった時
- Fragmentがフォアグラウンドになる時
- 用途
- DBの接続
- データの取得
onPause
- タイミング
- Fragmentがフォアグラウンドでなくなる時
- 用途
- 続行しない処理の停止
- バックグラウンドで続行する処理の準備、移行
onStop
- タイミング
- Fragmentが完全にバックグラウンドに移動し停止した時
- 用途
- DBへのデータの保存
- 高負荷のシャットダウン
onDestroyView
- タイミング
- Fragmentに関連付けられたViewが破棄される時
- 用途
- Viewが破棄される時の後始末
onDestroy
- タイミング
- Fragmentが破棄される時
- 用途
- リソースの開放
onDetach
- タイミング
- FragmentとActivityの関連付けが解除される時
- 用途
- Activityとの関連付けを解除する時の後始末
まとめ
概ね認識通りでしたが、FragmentのonCreateView
やonViewCreated
、onActivityCreated
辺りは書いていて混乱することがあったのでそこの整理がつきました。
また、昔は恐らく記述されていなかったLifecycleObserverの活用事例を知ることができました。
既に知っていることに関しても定期的に公式ドキュメントは見直すのが良さそうです。