📝

Android Basic with ComposeのUnit4で学んだことをまとめてみる - Lifecycle

2024/11/20に公開

はじめに

こんにちは、某SIerでSEをやっているnekorush14です。
この記事は絶賛再*n入門しているAndroid開発について、Google公式のLearning Courseを通して学んだことをアウトプットするシリーズです。

Jetpack Composeに関するCourseのUnit4で得た知見を話します。
https://developer.android.com/courses/android-basics-compose/unit-4?hl=en

前回の記事はこちら👇
https://zenn.dev/nekorush14/articles/c559577773a5ba

Unit 4: Navigation and app architecture

このユニットでは、Androidアプリ開発で重要となるActivity LifecycleとArchitectureを学びます。
また、アプリケーションをマルチページとする際に使用するNavigationやアプリケーションを複数のデバイスサイズに適応させるAdaptive Layoutについても学びます。

今回も内容が多いので、まずはActivity Lifecycleについてまとめてみます。

Activity Lifecycle

  • Androidの基本的な概念

    • AndroidではActivityの存在期間中に様々な状態遷移が行われる
    • ActivityのLifecycleはActivityの作成からActivityの破棄(リソースの開放)まて続く
    • ユーザーがActivityに出入りすると各ActivityがLifecycle内の様々な状態間を遷移する
    • Activityを正しく理解しないと以下のような問題が発生する
      • 奇妙なバグの発生
      • 意図しない挙動によりユーザーを混乱させる
      • Androidのシステムリソースを過剰使用する
    • AndroidのLifecycleを正しく理解し、状態変化に正しく対応することがAndroid開発において重要
  • AndroidにおけるLifecycleのエントリーポイントはonCreate()

    • ユーザーがアプリ間・Activity間を移動するとActivityの状態が変化する
    • ActivityのLifecycleは以下の通り
  • 多くの場合、ActivityのLifecycleが変化した際に何らかの動作変更やコードの実行が行われる

    • Activity ClassやComponentActivityなどのサブクラスは各Lifecycle向けにコールバックメソッドを持っている

    • このコールバックをOverrideして独自のコードを実装することでLifecycleが変化した際に動作変更やコードの実行が可能となる

    • onRestartはいつも呼ばれるわけではない

      • onStopが呼ばれたあとにActivityが再開する際にのみ呼び出される
  • onCreateはすべてのActivityが実装するメソッド

    • 1回限りの初期化が行われる
    • 例えば、UIレイアウトを指定するsetContent()を呼び出してUIを初期化する
    • 実行タイミングはActivityが初期化された直後
      • つまり、OSがメモリ内に新たなActivityオブジェクトを生成したタイミングで1回実行される
      • onCreateが実行されたあと、Activityは生成されたものとみなす
  • アプリを起動し、ユーザーが操作可能となるまでの間に3つのLifecycleコールバックが呼び出される

    • onCreate: Androidシステムがアプリを作成するとき
    • onStart: アプリが画面上に表示される、ただしユーザーは操作不可
    • onResume: アプリがフォアグラウンドになり、ユーザー操作が可能となる
      • onResumeは再開するものがなくても呼び出される

  • Activityが終了するときは以下のLifecycleコールバックが呼び出される

    • onPause
    • onStop
    • onDestroy
  • コード上でfinish()を呼び出す、ユーザーがアプリを強制終了する、AndroidがActivityを自動的にシャットダウンするなどにより、警告を出さずにActivityを破棄する事がある

  • onCreateonDestroyは単一Activityのインスタンスが存在している間1度だけ呼ばれる

  • Androidはアプリの切り替え、ホームへ戻る、新たなアプリを起動する、電話・通知などによるActivityの中断に対処する

    • この際、起動していたActivityは完全に閉じられるわけではない
      • バックグラウンドに置かれた状態となる
        • バックグラウンドにいる場合はリソースとバッテリー寿命を鑑み、アクティブな実行はしないこと
        • Activity Lifecycleとコールバックを使用し、バックグラウンドに入るタイミングを把握し、実行中の操作を一時停止できるようにしておく
          • フォアグラウンドに入ったら操作を再開する
    • onPauseのタイミングでフォーカスを失う
    • onStopの段階でアプリが画面に表示されなくなる
    • ShareSheetなどアプリが表示されているがフォーカスがない場合もonPauseが呼び出される
      • onStopは呼ばれない
      • アプリケーションにフォーカスが戻るタイミングでonResumeが呼び出される

Configuration Change

  • デバイスの状態が劇的に変化したことにより、一度Activityを完全シャットダウンしてActivityを再構築する必要がある際に発生する
    • ユーザーがデバイスの言語を変更した
    • デバイスをドックに接続した、物理キーボードを追加した
    • デバイスの向きを変えた
  • Configuration Changeが発生するとonDestroyが呼ばれ、その後onCreateから始まるアプリのActivity作成が始まる
  • 画面を回転するとonDestroyonCreateが呼ばれるため、Activityはデフォルト値で再開される

ComposableのLifecycle

  • Composableには独自のLifecycleが存在する

    • Compositionに入る -> 0回以上のReComposition -> Compositionから抜ける
  • 状態が変化したかをComposeが知るためにはStateMutableStateを使用する (Unit2参照)

  • StateMutableStateはReCompositionで状態を記憶しているが、Configuration Changeでは記憶しない

    • Configuration Changeでも状態を記憶しておくにはrememberSavableを使用する
  • rememberSavableを使用するとActivityが復元された際にその値を使用できるようになる

    • これにより、Configuration Changeが発生してonDestroy -> onCreateが呼ばれてもrememberSavableで保持している値を使用することができる

Log (おまけ)

  • Logcatはメッセージをログに記録するためのコンソール

  • android.util.Logクラスのメソッドを使用することでLogcatにログが記録される

  • Logcatには実行しているアプリのログのほか、Androidシステムからのログメッセージも記録される

  • Logの出力には3つの重要な観点存在

    1. 優先度: ログの重要度に応じたレベルを設定する
    • デバッグ: Log.d()
    • 情報: Log.i()
    • 警告: Log.w()
    • エラー: Log.e()
    • 詳細なログ: Log.v()
    1. タグ: ログメッセージを簡単に見つけるための文字列
    • 通常はクラス名を指定する
    1. メッセージ: ログメッセージ本体
  • LogcatはAndroid Studioの画面下部にある猫(Nyan Catっぽいアイコン)タブで確認できる

  • Logcatには多くのメッセージが出力されるため、目的のメッセージを探すためにフィルターする

    • フィルター方法はいくつか存在するが、検索が簡単
      • tag:<TAG_NAME>でタグ名でのフィルターができる

まとめ

今回はAndroidにおけるActivity Lifecycleについてまとめてみました。これまでふわっとこんな感じかな🤔といった理解でしたが、このPathwayを通してクリアになりました。
自分で作るアプリがバックグラウンドになった際、何等かの処理をするといったことは容易に考えられるため、onPauseなどonCreate以外のメソッドを使用する機会も出てきそうです。

次回はAndroidのArchitectureについてまとめてみます。

参考資料

Discussion