ActivityとFragmentのライフサイクル簡易まとめ

この記事は[Ateam Finergy Inc. × Ateam Wellness Inc. Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ateam-finergy-wellness)の18日目の記事です。

# はじめに
Androidアプリの開発で切り離せないライフサイクル。
`onCreate`や`onCreateView`など似たような名前も多くそれっぽい所に書いて終わりになりがちです。
今回改めてライフサイクルのコールバックについて種別、実行タイミング、主な用途を整理してそれっぽくを脱しようと思います。

# ライフサイクル
以下、ActivityとFragmentでそれぞれ記載します。
記載の順序は基本実行される順番となります。

## Activity
公式のドキュメントは下記となります。
https://developer.android.com/guide/components/activities/activity-lifecycle

![activity_lifecycle.png](https://developer.android.com/guide/components/images/activity_lifecycle.png)

### onCreate
* タイミング
    * Activityが生成された時に1回
* 用途
    * Activityのライフサイクルの全期間で1回のみ実行する必要があるものを行う
        * XMLレイアウトファイルの取得など

### onStart
* タイミング
    * Activityが開始状態になった時
    * Activityがユーザーに見えるようになる直前
* 用途
    * UIの初期化

### onResume
* タイミング
    * Activityが再開状態になった時
    * Activityがフォアグラウンドになる時
* 用途
    * DBの接続
    * データの取得

### onPause
* タイミング
    * Activityがフォアグラウンドでなくなる時
* 用途
    * 続行しない処理の停止
    * バックグラウンドで続行する処理の準備、移行
* 補足
    * 表示されていない時、ではない
        * マルチウィンドウモードではフォーカスされていない時に表示されつつ`onPause`になる
    * `onPause`の実行時間は短いため以下のような処理は行ってはいけない
        * DBへの保存
        * 高負荷のシャットダウン

### onStop
* タイミング
    * Activityが完全にバックグラウンドに移動し停止した時
* 用途
    * DBへのデータの保存
    * 高負荷のシャットダウン

### onRestart
* タイミング
    * `onStop` → `onStart`の間
* 用途
    * 停止した処理を再開させる

### onDestroy
* タイミング
    * Activityが破棄される直前
        * Activityが終了する時
        * デバイスの向き変更等で一時的にActivityが破棄される時
* 用途
    * 未開放のリソースが開放される

## Fragment
公式のドキュメントは下記となります。
https://developer.android.com/guide/components/fragments

![fragment_lifecycle.png](https://developer.android.com/static/images/fragment_lifecycle.png)

### onAttach
* タイミング
    * FragmentがActivityに関連付けられた時
* 用途
    * FragmentがActivityに管理されるようになった時に行う処理の定義
        * ActivityのListenerを取得など

### onCreate
* タイミング
    * Fragmentが生成される時
* 用途
    * Fragmentを破棄するまで保持し続ける必須コンポーネントの初期化
* 補足
    * Fragmentが関連付けられたActivityの生成途中で呼び出される
        * ActivityのViewに干渉することはできない

### onCreateView
* タイミング
    * FragmentのUIを描画する時
* 用途
    * 描画するViewのセットアップ

### onViewCreated
* タイミング
    * `onCreateView`と`onActivityCreated`の間
* 用途
    * FragmentのViewに関する初期化

### onActivityCreated(deprecated)
* タイミング
    * 以下の2点が満たされた時
        * Activityの`onCreate`が完了
        * Fragmentの`onCreateView`が完了
* 用途
    * 最終的な初期化
        * UIの修正など
    * Activityが絡むViewの変更など
* 補足
    * このメソッドは**deprecated**です
        * 推奨されている対処は以下となります
            * FragmentのViewに対する処理は`onViewCreated`
            * その他の初期化はFragmentの`onCreate`
            * Activityの`onCreate`が完了した時に処理を行いたい場合は下記の手順で行う
                1. Fragmentの`onAttach`でLifecycleObserverを登録
                1. `@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)`のAnnotationを実行したい関数に付ける

### 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の活用事例を知ることができました。
既に知っていることに関しても定期的に公式ドキュメントは見直すのが良さそうです。