Android Basic with ComposeのUnit4で学んだことをまとめてみる - Lifecycle
はじめに
こんにちは、某SIerでSEをやっているnekorush14です。
この記事は絶賛再*n入門しているAndroid開発について、Google公式のLearning Courseを通して学んだことをアウトプットするシリーズです。
Jetpack Composeに関するCourseのUnit4で得た知見を話します。
前回の記事はこちら👇
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を破棄する事がある -
onCreate
とonDestroy
は単一Activityのインスタンスが存在している間1度だけ呼ばれる
-
Androidはアプリの切り替え、ホームへ戻る、新たなアプリを起動する、電話・通知などによるActivityの中断に対処する
- この際、起動していたActivityは完全に閉じられるわけではない
- バックグラウンドに置かれた状態となる
- バックグラウンドにいる場合はリソースとバッテリー寿命を鑑み、アクティブな実行はしないこと
- Activity Lifecycleとコールバックを使用し、バックグラウンドに入るタイミングを把握し、実行中の操作を一時停止できるようにしておく
- フォアグラウンドに入ったら操作を再開する
- バックグラウンドに置かれた状態となる
-
onPause
のタイミングでフォーカスを失う -
onStop
の段階でアプリが画面に表示されなくなる - ShareSheetなどアプリが表示されているがフォーカスがない場合も
onPause
が呼び出される-
onStop
は呼ばれない - アプリケーションにフォーカスが戻るタイミングで
onResume
が呼び出される
-
- この際、起動していたActivityは完全に閉じられるわけではない
Configuration Change
- デバイスの状態が劇的に変化したことにより、一度Activityを完全シャットダウンしてActivityを再構築する必要がある際に発生する
- ユーザーがデバイスの言語を変更した
- デバイスをドックに接続した、物理キーボードを追加した
- デバイスの向きを変えた
- Configuration Changeが発生すると
onDestroy
が呼ばれ、その後onCreate
から始まるアプリのActivity作成が始まる - 画面を回転すると
onDestroy
とonCreate
が呼ばれるため、Activityはデフォルト値で再開される
ComposableのLifecycle
-
Composableには独自のLifecycleが存在する
- Compositionに入る -> 0回以上のReComposition -> Compositionから抜ける
-
状態が変化したかをComposeが知るためには
State
やMutableState
を使用する (Unit2参照) -
State
やMutableState
はReCompositionで状態を記憶しているが、Configuration Changeでは記憶しない- Configuration Changeでも状態を記憶しておくには
rememberSavable
を使用する
- Configuration Changeでも状態を記憶しておくには
-
rememberSavable
を使用するとActivityが復元された際にその値を使用できるようになる- これにより、Configuration Changeが発生して
onDestroy
->onCreate
が呼ばれてもrememberSavable
で保持している値を使用することができる
- これにより、Configuration Changeが発生して
Log (おまけ)
-
Logcat
はメッセージをログに記録するためのコンソール -
android.util.Log
クラスのメソッドを使用することでLogcatにログが記録される -
Logcat
には実行しているアプリのログのほか、Androidシステムからのログメッセージも記録される -
Logの出力には3つの重要な観点存在
- 優先度: ログの重要度に応じたレベルを設定する
- デバッグ:
Log.d()
- 情報:
Log.i()
- 警告:
Log.w()
- エラー:
Log.e()
- 詳細なログ:
Log.v()
- タグ: ログメッセージを簡単に見つけるための文字列
- 通常はクラス名を指定する
- メッセージ: ログメッセージ本体
-
LogcatはAndroid Studioの画面下部にある猫(Nyan Catっぽいアイコン)タブで確認できる
-
Logcatには多くのメッセージが出力されるため、目的のメッセージを探すためにフィルターする
- フィルター方法はいくつか存在するが、検索が簡単
-
tag:<TAG_NAME>
でタグ名でのフィルターができる
-
- フィルター方法はいくつか存在するが、検索が簡単
まとめ
今回はAndroidにおけるActivity Lifecycleについてまとめてみました。これまでふわっとこんな感じかな🤔といった理解でしたが、このPathwayを通してクリアになりました。
自分で作るアプリがバックグラウンドになった際、何等かの処理をするといったことは容易に考えられるため、onPause
などonCreate
以外のメソッドを使用する機会も出てきそうです。
次回はAndroidのArchitectureについてまとめてみます。
Discussion