Android 学習ノート 2.2 アクティビティのライフサイクル


1. 学習目標

  1. アクティビティのライフサイクル図を理解する
  2. マスターライフサイクルコールバックメソッド
  3. 情報を出力するにはログクラス Log を使用します

2. 新しいコースの学習

(1) アクティビティのライフサイクル

1. アクティビティのライフサイクルを理解する

  • ユーザーがアプリを閲覧、終了し、戻ってくると、アプリ内のアクティビティ インスタンスはライフ サイクル内のさまざまな状態の間で遷移します。Activity クラスは、特定の状態が変化したこと (システムがアクティビティを作成、停止、再開していること、またはアクティビティが存在するプロセスが破棄されていること) をアクティビティに知らせる多くのコールバックを提供します。
  • ライフサイクル コールバック メソッドでは、ユーザーがアクティビティから離れて再びアクティビティに戻ったときにアクティビティがどのように動作するかを宣言できます。たとえば、ストリーミング ビデオ プレーヤーを構築している場合、ユーザーが別のアプリに切り替えたときにビデオを一時停止したり、ネットワーク接続を終了したりすることができます。ユーザーが戻ってきたら、ネットワークに再接続して、ユーザーが同じ場所からビデオの再生を続けることができるようにします。つまり、各コールバックにより、特定の状態変化に適した特定のジョブを実行できるようになります。適切なタイミングで適切なジョブを実行し、遷移を適切に処理すると、アプリケーションの堅牢性とパフォーマンスが向上します。たとえば、ライフサイクル コールバックを適切に実装すると、アプリの次のような問題を防ぐことができます。
    – ユーザーがアプリの使用中に通話に応答したとき、または別のアプリに切り替えたときにクラッシュする。
    – ユーザーがアクティブに使用していないときに、貴重なシステム リソースを消費します。
    – ユーザーがアプリを離れて後で戻ると、ユーザーの進行状況は失われます。
    – 画面を横向きと縦向きの間で回転させるとクラッシュするか、ユーザーの進行状況が失われます。

2. アクティビティのライフサイクルの簡略図

  • Activity ライフ サイクルのさまざまなステージ間を移動するために、Activity クラスには 6 つのコア コールバック メソッド、 、 、 、 および が提供さonCreate()ますonStart()これらの各コールバック メソッドは、アクティビティが新しい状態に入ると呼び出されます。onResume()onPause()onStop()onDestroy()
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
(1)アクティビティの有無
  • アクティビティのライフサイクル全体はonCreate()メソッドで始まり、onDestroy()最後のメソッド呼び出しで終わります。アクティビティのグローバル リソースはonCreate()メソッド内で設定され、onDestroy()リソースは最終的にメソッド内でリサイクルされます。
(2)アクティビティが表示されるかどうか

アクティビティはonStart()メソッドのトリガー後に表示されますが、ユーザーと対話できない場合があります。このメソッドは、アクティビティが完全に非表示になったときにトリガーされますonStop()再び表示されるようになると、onRestart()最初にメソッドがトリガーされ、次にonStart()メソッドがトリガーされます。onStart()メソッドとonStop()メソッドは複数回呼び出すことができます。

(3) アクティビティと対話できるかどうか

アクティビティは onResume() メソッドと onPause() メソッドの間でアクティブになり、この時点でユーザーと対話できます。

3.Androidプロセスの優先順位

  • アプリケーションのライフサイクルとは、Android システムの起動から終了までのすべての段階、つまり Android の起動から停止までのプロセス全体を指します。Android アプリケーションのライフサイクルの終了は、アプリケーション プロセス自体によって実行されるのではなく、Android システムに依存します。では、システムは Android アプリケーションを終了するためにどのような重要性の基準を使用するのでしょうか? Android では、次の図に示すように、アプリケーションのコンポーネントとコンポーネントの現在の実行ステータスに応じて、すべてのプロセスを高位から低位の 5 つのカテゴリに分類します。
    ここに画像の説明を挿入します

(2) アクティビティライフサイクルコールバックメソッド

1. onCreate() コールバック メソッド

  • このコールバックは、システムによって最初にアクティビティが作成されたときにトリガーされるので、実装する必要があります。アクティビティが作成されると、「作成済み」状態になります。onCreate() メソッドでは、基本的なアプリケーション起動ロジックを実行します。これは、アクティビティのライフサイクル全体で 1 回だけ発生します。たとえば、onCreate() の実装では、データをリストにバインドし、アクティビティを ViewModel に関連付け、いくつかのクラス スコープ変数をインスタンス化できます。このメソッドは、以前に保存されたアクティビティの状態を含む Bundle オブジェクトである、savedInstanceState パラメータを受け取ります。Activity が以前に存在しなかった場合、Bundle オブジェクトの値は null になります。
  • アクティビティのライフサイクルに関連付けられたライフサイクル対応コンポーネントがある場合、そのコンポーネントは ON_CREATE イベントを受け取ります。@OnLifecycleEvent アノテーションが付けられたメソッドが呼び出され、ライフサイクル対応コンポーネントが作成された状態に必要なセットアップ コードを実行できるようになります。

2. onStart() コールバック メソッド

-onCreate() 終了後、アクティビティは「開始」状態になり、ユーザーに表示されます。このコールバックには、アクティビティがフォアグラウンドになってユーザーと対話する前の最終準備が含まれています。

3. onResume() コールバック メソッド

  • アクティビティがユーザーとの対話を開始する前に、システムはこのコールバックを呼び出します。この時点で、アクティビティはアクティビティ スタックの最上位にあり、すべてのユーザー入力をキャプチャします。アプリケーションのコア機能のほとんどは、onResume() メソッドに実装されています。
  • onResume() コールバックの後には、常に onPause() コールバックが続きます。

4. onPause() コールバック メソッド

  • アクティビティがフォーカスを失い、「一時停止」状態になると、システムは onPause() を呼び出します。たとえば、この状態は、ユーザーが [戻る] ボタンまたは [最近使用したアプリ] ボタンをタップしたときに発生します。システムがアクティビティに対して onPause() を呼び出すと、技術的にはアクティビティがまだ部分的に表示されていることを意味しますが、ほとんどの場合、ユーザーがアクティビティから離れ、アクティビティが間もなく「停止」または「復元」になることを示しています。 " 状態。
  • ユーザーがインターフェースの更新を継続したい場合は、「一時停止」状態のアクティビティでもインターフェースの更新を継続できます。たとえば、ナビゲーション マップ画面を表示したり、メディア プレーヤーを再生したりするアクティビティがそのようなアクティビティになります。そのようなアクティビティがフォーカスを失ったとしても、ユーザーは依然としてそのインターフェースが更新され続けることを期待します。
  • アプリケーションやユーザー データの保存、ネットワーク呼び出し、データベース トランザクションの実行には onPause() を使用しないでください。データの保存については、「アクティビティ状態の保存と復元」を参照してください。
  • onPause() の実行が完了すると、アクティビティが「一時停止」状態に入った後の動作に応じて、次のコールバックは onStop() または onResume() になります。

5. onStop() コールバック メソッド

  • アクティビティがユーザーに表示されなくなると、システムは onStop() を呼び出します。これは、アクティビティが破棄されたか、新しいアクティビティが開始されたか、既存のアクティビティが「再開」状態になって停止したアクティビティを上書きしたために発生する可能性があります。これらすべての場合において、停止したアクティビティはまったく表示されなくなります。
  • 次のシステム コールバックは、onRestart() (アクティビティがユーザーと再対話する場合) または onDestroy() (アクティビティが完全に終了する場合) になります。

6. onRestart() コールバック メソッド

  • このコールバックは、停止状態のアクティビティが再開されようとしているときに呼び出されます。onRestart() は、アクティビティを停止時の状態から再開します。
  • このコールバックの後には常に onStart() が続きます。

7. onDestroy() コールバック メソッド

  • システムは、アクティビティを破棄する前にこのコールバックを呼び出します。
  • このコールバックは、アクティビティによって受信された最後のコールバックです。通常、onDestroy() は、アクティビティまたはアクティビティを含むプロセスが破棄されたときに、アクティビティのすべてのリソースが解放されるように実装されます。

(3) Logクラスを利用して情報を出力する

  • コードをデバッグするときに、デバッグ情報を表示する必要がある場合は、Android の android.util.Log クラスを使用する必要があります。このクラスには 5 つの一般的なメソッドがあります。注: さまざまな印刷方法を使用する場合、それらはすべて (文字列タグ、文字列メッセージ) パラメーターを持ちます。タグは印刷される情報のラベルを表し、メッセージは印刷する必要がある情報を表します。

1. Log.v() メソッド

  • v: 冗長; 出力色は黒で、あらゆるメッセージが出力されます。ここでの v は冗長を表します。通常の使用法は Log.v("",""); です。

2. Log.d() メソッド

  • d: debug; 出力色は青色 デバッグ情報のみを出力しますが、上位層の情報も出力します フィルタリングはDDMSのLogcatタグで選択可能です

3. Log.i() メソッド

  • i:情報、出力色は緑色で一般的な情報が出力されます。Log.v、Log.dの情報は出力されませんが、i、w、eの情報は表示されます。

4. Log.w() メソッド

  • w: warning; 出力色はオレンジ色で警告情報が出力されます。通常、Android コードの最適化に注意する必要があります。選択すると、同時に Log.e 情報も出力されます。

5. Log.e() メソッド

  • e: エラー; 出力色は赤色で、赤色のエラー メッセージのみが表示されます。エラーの原因を特定するには慎重に分析する必要があります。

(4) コールバックメソッドの事例デモ

1. Androidアプリを作成する

  • 空のアクティビティテンプレートに基づく
    ここに画像の説明を挿入します

  • プロジェクト情報の設定
    ここに画像の説明を挿入します

  • [完了]ボタンをクリックしてプロジェクトの初期化を完了します
    ここに画像の説明を挿入します

2. 文字列リソースファイル

  • ファイル内の変数値strings.xmlを変更し、新しい変数を追加しますapp_nametest_life_cycle
    ここに画像の説明を挿入します

3. メインレイアウトリソースファイル

  • 制約レイアウトを線形レイアウトに変更し、ラベル コントロールの関連プロパティを設定します。
    ここに画像の説明を挿入します

4. メインインターフェースクラス実装関数

  • MainActivityタグ定数を定義しますTAG
    ここに画像の説明を挿入します

  • onCreate および onDestroy コールバック メソッドでデバッグ メッセージを出力します。
    ここに画像の説明を挿入します

  • onStart および onStop コールバック メソッドでデバッグ メッセージを出力します。
    ここに画像の説明を挿入します

  • onResume および onPause コールバック メソッドでデバッグ メッセージを出力します。
    ここに画像の説明を挿入します

  • onRestart コールバック メソッドでデバッグ メッセージを出力します (完全に非表示⟹ \Longrightarrow⟹ 完全に表示される過程)

  • MainActivity のソース コードを表示する

package net.xqf.lifecycle;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    
    

    private final static String TAG="life_cycle";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG,"onCreate invoked");

    }

    @Override
    protected void onStart() {
    
    
        super.onStart();
        Log.d(TAG,"onStart invoked");
    }

    @Override
    protected void onResume() {
    
    
        super.onResume();
        Log.d(TAG,"onResume invoked");
    }

    @Override
    protected void onPause() {
    
    
        super.onPause();
        Log.d(TAG,"onPause invoked");
    }



    @Override
    protected void onStop() {
    
    
        super.onStop();
        Log.d(TAG, "ononStop invoked");
    }

    @Override
    protected void onRestart() {
    
    
        super.onRestart();
        Log.d(TAG,"onRestart invoked");
    }

    @Override
    protected void onDestroy() {
    
    
        super.onDestroy();
        Log.d(TAG, "onDestroy invoked");
    }
}

5. メッセージフィルターを追加する

  • このアプリケーションのデバッグ情報をよりよく表示するには、メッセージ フィルターを追加する必要があります。メッセージ フィルター life_cycle_filter を作成し、ラベルを life_cycle として記録します。
    ここに画像の説明を挿入します

6. アプリケーションを起動し、ログを表示します。

  • アプリケーションを起動し、LogCat でメッセージを表示します (その後、アプリケーションの状態を切り替えます: foreground⟹ \Longrightarrow⟹background⟹ \Longrightarrow⟹ foreground⟹ \Longrightarrow⟹ Closed)
    ここに画像の説明を挿入します

  • [ホーム]ボタンをクリックしてモバイルアプリケーションのデスクトップに戻ります。
    ここに画像の説明を挿入します

  • このとき、アプリケーション ウィンドウはデスクトップで覆われています。ログ メッセージを確認してください。
    ここに画像の説明を挿入します

  • [概要]ボタンをクリックすると、最近使用したアプリケーションのリストが表示されます。
    ここに画像の説明を挿入します

  • 最近開いたアプリケーションは「ライフサイクル」です
    ここに画像の説明を挿入します

  • バックグラウンドで動作している「ライフサイクル」アプリケーションをクリックすると、そのウィンドウが最前面に戻り、ログ情報が表示されます。
    ここに画像の説明を挿入します

  • [戻る]ボタンを押しても実際には[ライフサイクル]アプリケーションを閉じることはできません
    ここに画像の説明を挿入します

  • [概要]キーを押し、[ライフサイクル]アプリを選択し、上にスライドしてアプリを閉じます。
    ここに画像の説明を挿入します

  • ログ情報から、3 層アーキテクチャがわかります。

  1. 最外層 (onCreate - onDestory) - (存在する - 存在しない)
  2. 中間層 (onStart - onStop) - (可視 - 不可視)
  3. 最内層 (onResume - onPause) - (インタラクティブ - 非インタラクティブ)
  • 操作画面の録画を見る
    ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/qq_41301333/article/details/127806427