アクティビティのライフサイクル

アクティビティは Android アプリケーションの基本的な構成要素であり、さまざまな状態に存在できます。 アクティビティのライフサイクルはインスタンス化から始まり、破棄で終わり、その間に多くの状態が含まれます。 アクティビティが状態を変更すると、適切なライフサイクル イベント メソッドが呼び出され、差し迫った状態の変更をアクティビティに通知し、その変更に適応するコードを実行できるようになります。 この記事では、アクティビティのライフサイクルを調べ、これらの各状態変更の間にアクティビティが適切に動作し、信頼性の高いアプリケーションの一部である責任について説明します。

アクティビティ ライフサイクルの概要

アクティビティは、Android に固有の通常とは異なるプログラミング概念です。 従来のアプリケーション開発では、通常、アプリケーションを起動するために実行される静的なメイン メソッドがあります。 ただし、Android では状況が異なります。Android アプリケーションは、アプリケーション内の登録されたアクティビティを介して起動できます。 実際には、ほとんどのアプリケーションには、アプリケーション エントリ ポイントとして指定された特定のアクティビティのみが含まれます。 ただし、アプリケーションがクラッシュした場合、または OS によって終了された場合、OS は最後に開いているアクティビティ、または前のアクティビティ スタック内の任意の場所でアプリケーションの再起動を試みることができます。 さらに、OS がアクティブでないときにアクティビティを一時停止し、メモリ不足の場合は再利用する場合があります。 特に、アクティビティが以前のアクティビティのデータに依存している場合は、アクティビティが再起動された場合にアプリケーションがその状態を正しく復元できるように注意深く検討する必要があります。

アクティビティライフサイクルは、OS がアクティビティのライフサイクル全体を通して呼び出すメソッドのコレクションとして実装されます。 これらのメソッドを使用すると、開発者はアプリケーションの状態とリソース管理の要件を満たすために必要な機能を実装できます。

アプリケーション開発者は、各アクティビティの要件を分析して、アクティビティ ライフサイクルによって公開されるメソッドを実装する必要があるかどうかを判断することが非常に重要です。 これを行わないと、アプリケーションが不安定になり、クラッシュし、リソースが肥大化し、基になる OS が不安定になる可能性があります。

この章では、以下を含むアクティビティのライフサイクルについて詳しく説明します。

  • アクティビティの状態
  • ライフサイクル メソッド
  • アプリケーションの状態の保持

このセクションには、アクティビティのライフサイクル中に状態を効率的に保存する方法の実用的な例を示す チュートリアル も含まれています。 この章の終わりまでに、アクティビティのライフサイクルと Android アプリケーションでサポートする方法について理解しておく必要があります。

アクティビティのライフサイクル

Android アクティビティライフサイクルは、開発者にリソース管理フレームワークを提供する Activity クラス内で公開されるメソッドのコレクションで構成されます。 このフレームワークを使用すると、開発者はアプリケーション内の各アクティビティの固有の状態管理要件を満たし、リソース管理を適切に処理できます。

アクティビティの状態

Android OS は、その状態に基づいてアクティビティを裁定します。 これは、Android が使用されなくなったアクティビティを識別するのに役立ちます。これにより、OS でメモリとリソースを再利用できます。 次の図は、アクティビティが有効期間中に通過できる状態を示しています。

アクティビティ状態図

これらの状態は、次のように 4 つのメイン グループに分割できます。

  1. アクティブまたは実行中 – アクティビティは、アクティビティ スタックの最上位とも呼ばれるフォアグラウンドにある場合、アクティブまたは実行中と見なされます。 これは Android で最も優先度の高いアクティビティと見なされるため、アクティビティがデバイスで使用可能なメモリよりも多くのメモリを使用しようとする場合など、極端な状況では OS によってのみ強制終了されます。これにより、UI が応答しなくなる可能性があります。

  2. 一時停止 – デバイスがスリープ状態になった場合、またはアクティビティが引き続き表示されているが、フル サイズではない、または透過的な新しいアクティビティによって部分的に非表示になっている場合、アクティビティは一時停止と見なされます。 一時停止されたアクティビティは引き続き有効です。つまり、すべての状態とメンバー情報が維持され、ウィンドウ マネージャーにアタッチされたままです。 これは Android で 2 番目に優先度の高いアクティビティと見なされ、そのため、このアクティビティを強制終了すると、アクティブ/実行中アクティビティの安定性と応答性を維持するために必要なリソース要件を満たす場合にのみ OS によって強制終了されます。

  3. Stopped/Backgrounded – 別のアクティビティによって完全に隠されているアクティビティは、停止またはバックグラウンドと見なされます。 停止したアクティビティは、状態とメンバー情報を可能な限り長く保持しようとしますが、停止されたアクティビティは 3 つの状態の中で最も優先度が低いと見なされます。そのため、OS は優先度の高いアクティビティのリソース要件を満たすために、最初にこの状態のアクティビティを強制終了します。

  4. 再起動 – ライフサイクル内で一時停止から停止までの任意の場所にあるアクティビティが、Android によってメモリから削除される可能性があります。 ユーザーがアクティビティに戻った場合は、再起動し、以前に保存した状態に復元してから、ユーザーに表示する必要があります。

構成の変更に対応するアクティビティ Re-Creation

さらに複雑にするために、Androidは構成変更と呼ばれるミックスにもう1つのレンチを投げます。 構成の変更は、アクティビティの構成が変更されたときに発生する迅速なアクティビティの破棄/再作成サイクルです。たとえば、デバイスが 回転したとき (アクティビティを横または縦モードで再ビルドする必要がある)、キーボードが表示されたとき (アクティビティにサイズを変更する機会が表示される)、またはデバイスがドックに配置されたときなどです。 他の人の間で。

構成の変更により、アクティビティの停止と再起動中に発生するのと同じアクティビティ状態の変更が引き続き発生します。 ただし、アプリケーションの応答性が高く、構成の変更中に適切に実行されるようにするには、可能な限り迅速に処理することが重要です。 このため、Android には、構成の変更中に状態を保持するために使用できる特定の API があります。 これについては、「 ライフサイクル全体の状態の管理 」セクションで後ほど説明します。

アクティビティ ライフサイクル メソッド

Android SDK と拡張として、Xamarin.Android フレームワークは、アプリケーション内のアクティビティの状態を管理するための強力なモデルを提供します。 アクティビティの状態が変化すると、アクティビティは OS によって通知され、そのアクティビティの特定のメソッドが呼び出されます。 次の図は、アクティビティ ライフサイクルに関連するこれらのメソッドを示しています。

アクティビティ ライフサイクル フローチャート

開発者は、アクティビティ内でこれらのメソッドをオーバーライドすることで、状態の変更を処理できます。 ただし、すべてのライフサイクル メソッドが UI スレッドで呼び出され、現在のアクティビティの非表示、新しいアクティビティの表示など、OS による次の UI 作業の実行がブロックされることに注意してください。そのため、アプリケーションのパフォーマンスを向上させるために、これらのメソッドのコードはできるだけ短くする必要があります。 実行時間の長いタスクは、バックグラウンド スレッドで実行する必要があります。

これらの各ライフサイクル メソッドとその使用方法を調べてみましょう。

OnCreate

OnCreate は、アクティビティの作成時に呼び出される最初のメソッドです。 OnCreate は常にオーバーライドされ、次のようなアクティビティで必要になる可能性があるスタートアップ初期化を実行します。

  • ビューの作成
  • 変数の初期化
  • リストへの静的データのバインド

OnCreateBundle パラメーターを受け取ります。これは、アクティビティ間で状態情報とオブジェクトを格納および渡すためのディクショナリです。バンドルが null でない場合は、アクティビティが再起動中であり、前のインスタンスから状態を復元する必要があることを示します。 次のコードは、バンドルから値を取得する方法を示しています。

protected override void OnCreate(Bundle bundle)
{
   base.OnCreate(bundle);

   string intentString;
   bool intentBool;

   if (bundle != null)
   {
      intentString = bundle.GetString("myString");
      intentBool = bundle.GetBoolean("myBool");
   }

   // Set our view from the "main" layout resource
   SetContentView(Resource.Layout.Main);
}

完了すると OnCreate 、Android は を呼び出します OnStart

OnStart

OnStart は、完了後にシステム OnCreate によって常に呼び出されます。 アクティビティ内のビューの現在の値の更新など、アクティビティが表示される直前に特定のタスクを実行する必要がある場合、アクティビティはこのメソッドをオーバーライドできます。 Android はこのメソッドの直後に を呼び出します OnResume

OnResume

システムは、アクティビティがユーザーとの対話を開始する準備ができたときに OnResume を呼び出します。 アクティビティは、次のようなタスクを実行するために、このメソッドをオーバーライドする必要があります。

  • フレーム レートの上昇 (ゲーム開発の一般的なタスク)
  • アニメーションの開始
  • GPS の更新をリッスンしています
  • 関連するアラートまたはダイアログを表示する
  • 外部イベント ハンドラーをワイヤアップする

例として、次のコード スニペットは、カメラを初期化する方法を示しています。

protected override void OnResume()
{
    base.OnResume(); // Always call the superclass first.

    if (_camera==null)
    {
        // Do camera initializations here
    }
}

OnResumeアクティビティを元の状態に戻した後OnPauseに実行することが保証される唯一のライフサイクル メソッドであるため、 でOnPauseOnResume行われる操作は で行われないため、重要です。

OnPause

OnPause は、システムがアクティビティをバックグラウンドに配置しようとしている場合、またはアクティビティが部分的に隠れた場合に呼び出されます。 アクティビティは、次の操作を行う必要がある場合に、このメソッドをオーバーライドする必要があります。

  • 保存されていない変更を永続データにコミットする

  • リソースを消費する他のオブジェクトを破棄またはクリーンする

  • フレーム レートを下げ、アニメーションを一時停止する

  • 外部イベント ハンドラーまたは通知ハンドラー (つまり、サービスに関連付けられているもの) の登録を解除します。 これは、アクティビティ メモリ リークを防ぐために行う必要があります。

  • 同様に、アクティビティにダイアログまたはアラートが表示されている場合は、 メソッドを使用して .Dismiss() クリーンアップする必要があります。

たとえば、次のコード スニペットは、一時停止中にアクティビティでカメラを使用できないため、カメラを解放します。

protected override void OnPause()
{
    base.OnPause(); // Always call the superclass first

    // Release the camera as other activities might need it
    if (_camera != null)
    {
        _camera.Release();
        _camera = null;
    }
}

の後 OnPauseに呼び出される可能性のあるライフサイクル メソッドは 2 つあります。

  1. OnResume アクティビティがフォアグラウンドに返される場合は が呼び出されます。
  2. OnStop アクティビティがバックグラウンドに配置されている場合は が呼び出されます。

OnStop

OnStop は、アクティビティがユーザーに表示されなくなったときに呼び出されます。 これは、次のいずれかが発生した場合に発生します。

  • 新しいアクティビティが開始され、このアクティビティがカバーされています。
  • 既存のアクティビティがフォアグラウンドに取り込まれます。
  • アクティビティが破棄されています。

OnStop Android がリソースに対して不足していて、アクティビティを適切にバックグラウンドで処理できない場合など、メモリ不足の状況では必ずしも呼び出されるとは限りません。 このため、破棄のためにアクティビティを準備するときに呼び出しに依存 OnStop しないようにすることをお勧めしています。 この後に呼び出される可能性のある次のライフサイクル メソッドは OnDestroy 、アクティビティが終了する場合、または OnRestart アクティビティがユーザーと対話するために戻ってくる場合です。

OnDestroy

OnDestroy は、アクティビティ インスタンスが破棄されてメモリから完全に削除される前に呼び出される最後のメソッドです。 極端な状況では、Android はアクティビティをホストしているアプリケーション プロセスを強制終了する可能性があり、その結果 OnDestroy 、呼び出されません。 ほとんどのアクティビティでは、 メソッドと OnStop メソッドでほとんどのクリーンとシャットダウンが行OnPauseわれているため、このメソッドは実装されません。 通常、 メソッドはOnDestroy、リソースがリークする可能性がある実行時間の長いタスクをクリーンするためにオーバーライドされます。 この例としては、 で OnCreate開始されたバックグラウンド スレッドが考えられます。

アクティビティが破棄された後に呼び出されるライフサイクル メソッドはありません。

OnRestart

OnRestart は、アクティビティが停止した後、アクティビティが再度開始される前に呼び出されます。 この良い例は、ユーザーがアプリケーションのアクティビティ中にホーム ボタンを押した場合です。 これが発生 OnPause し、メソッド OnStop が呼び出されると、アクティビティはバックグラウンドに移動されますが、破棄されません。 ユーザーがタスク マネージャーまたは同様のアプリケーションを使用してアプリケーションを復元した場合、Android はアクティビティの メソッドを OnRestart 呼び出します。

に実装 OnRestartする必要があるロジックの種類に関する一般的なガイドラインはありません。 これは、OnStartアクティビティが作成されているか再起動されているかに関係なく、常に が呼び出されるためです。そのため、アクティビティに必要なリソースは ではなくOnRestart、 でOnStart初期化する必要があります。

の後に OnRestart 呼び出される次のライフサイクル メソッドは になります OnStart

戻るとホーム

多くの Android デバイスには、"戻る" ボタンと "ホーム" ボタンという 2 つの異なるボタンがあります。 この例は、Android 4.0.3 の次のスクリーンショットで確認できます。

[戻る] ボタンと [ホーム] ボタン

2 つのボタンの間には、アプリケーションをバックグラウンドに配置する効果が同じであるように見えても、微妙な違いがあります。 ユーザーが [戻る] ボタンをクリックすると、アクティビティが完了したことを Android に伝えています。 Android はアクティビティを破棄します。 これに対し、ユーザーが [ホーム] ボタンをクリックすると、アクティビティは単にバックグラウンドに配置されます。Android はアクティビティを強制終了しません。

ライフサイクル全体の状態の管理

アクティビティが停止または破棄されると、システムは後でリハイドレートするためにアクティビティの状態を保存する機会を提供します。 この保存された状態は、インスタンス状態と呼ばれます。 Android には、アクティビティのライフサイクル中にインスタンスの状態を格納するための 3 つのオプションが用意されています。

  1. Android が状態の保存に Dictionary 使用する バンドル と呼ばれるにプリミティブ値を格納する。

  2. ビットマップなどの複雑な値を保持するカスタム クラスを作成する。 Android では、このカスタム クラスを使用して状態を保存します。

  3. 構成変更ライフサイクルを回避し、アクティビティの状態を維持するための完全な責任を想定します。

このガイドでは、最初の 2 つのオプションについて説明します。

バンドルの状態

インスタンスの状態を保存するための主なオプションは、Bundle と呼ばれるキー/値ディクショナリ オブジェクトを使用 することです。 メソッドがパラメーターとしてバンドルを渡す OnCreate アクティビティが作成されると、このバンドルを使用してインスタンスの状態を復元できることを思い出してください。 キーと値のペア (ビットマップなど) にすばやくまたは簡単にシリアル化できない、より複雑なデータにはバンドルを使用することはお勧めしません。むしろ、文字列などの単純な値に使用する必要があります。

Activity には、Bundle 内のインスタンス状態の保存と取得に役立つメソッドが用意されています。

  • OnSaveInstanceState – これは、アクティビティが破棄されるときに Android によって呼び出されます。 アクティビティは、キー/値の状態項目を保持する必要がある場合に、このメソッドを実装できます。

  • OnRestoreInstanceState – これはメソッドの完了後に OnCreate 呼び出され、初期化が完了した後にアクティビティが状態を復元する別の機会を提供します。

次の図は、これらのメソッドの使用方法を示しています。

バンドル状態フローチャート

OnSaveInstanceState

アクティビティが停止すると、OnSaveInstanceState が呼び出されます。 アクティビティが状態を格納できるバンドル パラメーターを受け取ります。 デバイスで構成の変更が発生した場合、Activity では、 をオーバーライドすることで、渡された オブジェクトを使用 Bundle してアクティビティの状態を OnSaveInstanceState保持できます。 次に例を示します。

int c;

protected override void OnCreate (Bundle bundle)
{
  base.OnCreate (bundle);

  this.SetContentView (Resource.Layout.SimpleStateView);

  var output = this.FindViewById<TextView> (Resource.Id.outputText);

  if (bundle != null) {
    c = bundle.GetInt ("counter", -1);
  } else {
    c = -1;
  }

  output.Text = c.ToString ();

  var incrementCounter = this.FindViewById<Button> (Resource.Id.incrementCounter);

  incrementCounter.Click += (s,e) => {
    output.Text = (++c).ToString();
  };
}

上のコードは、 という名前のボタンがクリックされたときに というcincrementCounter名前の整数をインクリメントし、その結果を TextView という名前outputの で表示します。 構成の変更が発生した場合 (たとえば、デバイスがローテーションされている場合) は、次の c 図に示すように、 が になるため bundle 、上記のコードの値は null失われます。

表示に前の値が表示されない

この例の の c 値を保持するために、Activity は をオーバーライド OnSaveInstanceStateして、次に示すようにバンドル内の値を保存できます。

protected override void OnSaveInstanceState (Bundle outState)
{
  outState.PutInt ("counter", c);
  base.OnSaveInstanceState (outState);
}

デバイスが新しい向きに回転すると、整数がバンドルに保存され、行と共に取得されます。

c = bundle.GetInt ("counter", -1);

Note

ビュー階層の状態も保存できるように、 の OnSaveInstanceState 基本実装を常に呼び出す必要があります。

ビューの状態

OnSaveInstanceStateオーバーライドは、上の例のカウンターなど、方向の変更を越えてアクティビティに一時的なデータを保存するための適切なメカニズムです。 ただし、 の既定の実装 OnSaveInstanceState では、各ビューに ID が割り当てられている限り、すべてのビューの UI に一時的なデータを保存する処理が行われます。 たとえば、アプリケーションに XML で次のように定義された EditText 要素があるとします。

<EditText android:id="@+id/myText"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"/>

コントロールには EditTextid が割り当てられているため、ユーザーが何らかのデータを入力してデバイスを回転させると、次に示すように、データは引き続き表示されます。

データは横モードで保持されます

OnRestoreInstanceState

OnRestoreInstanceState は の後に OnStart呼び出されます。 アクティビティには、前 OnSaveInstanceStateの の 中に以前にバンドルに保存されていた状態を復元する機会が用意されています。 ただし、これは に OnCreate提供されるバンドルと同じです。

次のコードは、 で OnRestoreInstanceState状態を復元する方法を示しています。

protected override void OnRestoreInstanceState(Bundle savedState)
{
    base.OnRestoreInstanceState(savedState);
    var myString = savedState.GetString("myString");
    var myBool = savedState.GetBoolean("myBool");
}

このメソッドは、状態を復元する必要がある場合の柔軟性を提供するために存在します。 インスタンスの状態を復元する前に、すべての初期化が行われるまで待つ方が適切な場合があります。 さらに、既存の Activity のサブクラスは、インスタンス状態から特定の値のみを復元する必要がある場合があります。 ほとんどのアクティビティでは に提供されたバンドルを使用して状態を復元できるため、多くの場合、 をオーバーライド OnRestoreInstanceStateする OnCreate必要はありません。

を使用して状態を Bundle保存する例については、「 チュートリアル - アクティビティの状態を保存する」を参照してください。

バンドルの制限事項

一時的なデータを簡単に保存できますが OnSaveInstanceState 、いくつかの制限があります。

  • これは、すべてのケースで呼び出されるわけではありません。 たとえば、 Home キーまたは Back キーを押してアクティビティを終了しても、 OnSaveInstanceState 呼び出されません。

  • OnSaveInstanceState 渡されるバンドルは、画像などの大きなオブジェクト用に設計されていません。 大きなオブジェクトの場合は、以下で説明するように 、OnRetainNonConfigurationInstance からオブジェクトを保存することをお勧めします。

  • バンドルを使用して保存されたデータはシリアル化されるため、遅延が発生する可能性があります。

バンドル状態は、メモリをあまり使用しない単純なデータに役立ちますが、 構成以外のインスタンス データ は、より複雑なデータや、Web サービス呼び出しや複雑なデータベース クエリなど、取得にコストがかかるデータに役立ちます。 構成以外のインスタンス データは、必要に応じて オブジェクトに保存されます。 次のセクションでは、 OnRetainNonConfigurationInstance 構成の変更を通じてより複雑なデータ型を保持する方法について説明します。

複雑なデータの永続化

Android では、バンドル内のデータの永続化に加えて、 OnRetainNonConfigurationInstance をオーバーライドし、永続化するデータを含む の Java.Lang.Object インスタンスを返すことで、データの保存もサポートされています。 を使用して OnRetainNonConfigurationInstance 状態を保存する主な利点は 2 つあります。

  • から OnRetainNonConfigurationInstance 返されるオブジェクトは、メモリがこのオブジェクトを保持するため、より大きく複雑なデータ型で適切に機能します。

  • メソッドは OnRetainNonConfigurationInstance オンデマンドで呼び出され、必要な場合にのみ呼び出されます。 これは、手動キャッシュを使用するよりも経済的です。

を使用 OnRetainNonConfigurationInstance すると、Web サービス呼び出しなど、データを複数回取得するコストがかかるシナリオに適しています。 たとえば、Twitter を検索する次のコードを考えてみましょう。

public class NonConfigInstanceActivity : ListActivity
{
  protected override void OnCreate (Bundle bundle)
  {
    base.OnCreate (bundle);
    SearchTwitter ("xamarin");
  }

  public void SearchTwitter (string text)
  {
    string searchUrl = String.Format("http://search.twitter.com/search.json?" + "q={0}&rpp=10&include_entities=false&" + "result_type=mixed", text);

    var httpReq = (HttpWebRequest)HttpWebRequest.Create (new Uri (searchUrl));
    httpReq.BeginGetResponse (new AsyncCallback (ResponseCallback), httpReq);
  }

  void ResponseCallback (IAsyncResult ar)
  {
    var httpReq = (HttpWebRequest)ar.AsyncState;

    using (var httpRes = (HttpWebResponse)httpReq.EndGetResponse (ar)) {
      ParseResults (httpRes);
    }
  }

  void ParseResults (HttpWebResponse httpRes)
  {
    var s = httpRes.GetResponseStream ();
    var j = (JsonObject)JsonObject.Load (s);

    var results = (from result in (JsonArray)j ["results"] let jResult = result as JsonObject select jResult ["text"].ToString ()).ToArray ();

    RunOnUiThread (() => {
      PopulateTweetList (results);
    });
  }

  void PopulateTweetList (string[] results)
  {
    ListAdapter = new ArrayAdapter<string> (this, Resource.Layout.ItemView, results);
  }
}

このコードは、JSON 形式の Web から結果を取得し、解析してから、次のスクリーンショットに示すように結果を一覧で表示します。

画面に表示される結果

構成の変更が発生した場合 (たとえば、デバイスが回転した場合)、コードはプロセスを繰り返します。 最初に取得した結果を再利用し、不要で冗長なネットワーク呼び出しを発生させないようにするには、次に示すように を使用 OnRetainNonconfigurationInstance して結果を保存できます。

public class NonConfigInstanceActivity : ListActivity
{
  TweetListWrapper _savedInstance;

  protected override void OnCreate (Bundle bundle)
  {
    base.OnCreate (bundle);

    var tweetsWrapper = LastNonConfigurationInstance as TweetListWrapper;

    if (tweetsWrapper != null) {
      PopulateTweetList (tweetsWrapper.Tweets);
    } else {
      SearchTwitter ("xamarin");
    }

    public override Java.Lang.Object OnRetainNonConfigurationInstance ()
    {
      base.OnRetainNonConfigurationInstance ();
      return _savedInstance;
    }

    ...

    void PopulateTweetList (string[] results)
    {
      ListAdapter = new ArrayAdapter<string> (this, Resource.Layout.ItemView, results);
      _savedInstance = new TweetListWrapper{Tweets=results};
    }
}

デバイスが回転されると、 プロパティから元の結果が LastNonConfiguartionInstance 取得されます。 この例では、結果は含まれているツイートで string[] 構成されています。 を返すJava.Lang.Object必要があるためOnRetainNonConfigurationInstancestring[] は、次に示すように、 をサブクラス化Java.Lang.Objectするクラスにラップされます。

class TweetListWrapper : Java.Lang.Object
{
  public string[] Tweets { get; set; }
}

たとえば、次のコードに示すように、 からOnRetainNonConfigurationInstance返されるオブジェクトとして をTextView使用しようとすると、Activity がリークします。

TextView _textView;

protected override void OnCreate (Bundle bundle)
{
  base.OnCreate (bundle);

  var tv = LastNonConfigurationInstance as TextViewWrapper;

  if(tv != null) {
    _textView = tv;
    var parent = _textView.Parent as FrameLayout;
    parent.RemoveView(_textView);
  } else {
    _textView = new TextView (this);
    _textView.Text = "This will leak.";
  }

  SetContentView (_textView);
}

public override Java.Lang.Object OnRetainNonConfigurationInstance ()
{
  base.OnRetainNonConfigurationInstance ();
  return _textView;
}

このセクションでは、 を使用して単純な状態データを保持し、 を使用 Bundleしてより複雑なデータ型を OnRetainNonConfigurationInstance保持する方法について説明しました。

まとめ

Android アクティビティ ライフサイクルは、アプリケーション内のアクティビティの状態管理のための強力なフレームワークを提供しますが、理解して実装するのは難しい場合があります。 この章では、アクティビティが有効期間中に通過する可能性があるさまざまな状態と、それらの状態に関連付けられているライフサイクル メソッドについて説明しました。 次に、これらの各メソッドで実行する必要があるロジックの種類に関するガイダンスを提供しました。