47

と に関していくつか質問がonRestoreInstanceStateありonSaveInstanceStateます。

1) これらのメソッドは、アクティビティのライフサイクルのどこに適合しますか? 私は多くのドキュメントを読みましたが、アクティビティの状態がいつ保存されるかという大まかな声明を除いて、明確な考えはありません

2)onCreateとはonRestoreInstanceState相互に排他的ですか?

3)onRestoreInstanceStateアクティビティが破棄されたときに呼び出されますか? これは何を意味するのでしょうか?別のアクティビティが現在の上に浮かんでいる場合を除いて、アクティビティは常に破棄されます。

4)onRestoreInstanceStateジェリービーンのインストルメンテーションからのみ呼び出されるようです。これはアクティビティのライフサイクルとは関係ありませんか?

4

3 に答える 3

68

これらのメソッドは、アクティビティのライフサイクルのどこに適合しますか?

OnSaveInstanceState は、アクティビティが強制終了または再起動される直前に呼び出されます (たとえば、メモリ不足または構成変更の b/c)。これは、アクティビティがフォーカスを失ったときに呼び出される onPause とは異なることに注意してください (たとえば、別のアクティビティに移行した場合)。

通常、onSaveInstanceState は onPause の後、onStop の前に呼び出されますが、常にではありません。たとえば、[戻る] を押すと、アクティビティが破棄され (finish() の呼び出しなど)、状態を保存する必要がないため、onSaveInstanceState は呼び出されません。では、onPause で状態を保存しないのはなぜでしょうか? アクティビティがフォーカスを失ったからといって、アクティビティが強制終了されたわけではありません。それは今でも記憶に残っています。基本的に、一時停止するたびに状態を保存するのではなく、一時停止して非表示になるとき (つまり、フォアグラウンドからバックグラウンドに移動するとき) に状態を保存します。

では、onPause で何をすべきでしょうか。理想的には、ネットワーク接続、地理情報や加速度計のオフ、ビデオの一時停止など、バッテリーを消耗するリソースを解放する必要があります (これらはすべてアプリによって異なります)。そして、ご想像のとおり、アクティビティがフォーカスを得たときに呼び出される onResume でこれらのリソースを復元します。

onCreate と onRestoreInstanceState は相互に排他的ですか?

onCreate で簡単に状態を復元できるため、onRestoreInstanceState は冗長です。

onRestoreInstanceState についての公式ドキュメントの説明は次のとおりです。

ほとんどの実装は単に onCreate(Bundle) を使用して状態を復元しますが、すべての初期化が完了した後にここで行うか、サブクラスがデフォルトの実装を使用するかどうかを決定できるようにすることが便利な場合があります。

そのため、ベスト プラクティスとして、onCreate でビュー階層をレイアウトし、onRestoreInstanceState で以前の状態を復元します。これを行うと、Activity をサブクラス化する人は誰でも onRestoreInstanceState をオーバーライドして、復元状態ロジックを拡張または置換できます。これは、onRestoreInstanceState がテンプレート メソッドとして機能するとは言い過ぎです。

アクティビティが破棄されたときに onRestoreInstanceState が呼び出されますか? これは何を意味するのでしょうか?

これは 1 で部分的に回答されました。はい、システムがアクティビティを破棄しようとしているときに onRestore が呼び出されます。システムは、メモリが不足している場合、またはユーザーがアプリケーションを明示的に閉じた場合 (ナビゲーション バーの最近のものからスワイプして削除するなど)、または構成が変更された場合 (ランドスペースからポートレートへなど) にアクティビティを破棄します。

Android がこのように設計されているのはなぜですか (デスクトップ アプリとは異なります)? モバイル システムでは、リソース管理がバッテリ寿命の深刻な問題であるためです。そのため、アプリのライフサイクルにフックを提供して、アプリがシャットダウンまたはフォーカスの喪失の間に状態をきれいに保存および復元できるようにすると同時に、ユーザーに対して完全に透過的にする必要があります。

onRestoreInstanceState は、Jelly Bean のインストルメンテーションからのみ呼び出されるようです。これはアクティビティのライフサイクルとは関係ありませんか?

この質問がわかりません。あなたはそれを言い換えることができますか?

于 2013-02-03T19:51:06.033 に答える
6

1)これらの方法はアクティビティのライフサイクルにどのように適合しますか?

開発者ドキュメントから。

onSaveInstanceState(バンドルoutState)

このメソッドは、アクティビティが強制終了される前に呼び出されるため、将来戻ってきたときに状態を復元できます。たとえば、アクティビティBがアクティビティAの前で起動され、ある時点でアクティビティAが強制終了されてリソースが再利用された場合、アクティビティAは、このメソッドを介してユーザーインターフェイスの現在の状態を保存できるため、ユーザーが戻ったときにアクティビティAに対して、ユーザーインターフェイスの状態はonCreate(Bundle)またはonRestoreInstanceState(Bundle)を介して復元できます。

onSaveInstanceState()のデフォルトの実装は、IDを持つすべてのビューに関連するデータの保存を処理します。

呼び出された場合、このメソッドはonStop()の前に発生します。onPause()の前または後に発生するかどうかについての保証はありません。

onRestoreInstanceState(バンドルsavedInstanceState)

このメソッドは、アクティビティが以前に保存された状態から再初期化されるときにonStart()の後に呼び出されます

3)アクティビティが破棄されたときにonRestoreInstanceStateが呼び出されますか?これは何を意味するのでしょうか?別のアクティビティが現在の上に浮かんでいるシナリオを除いて、アクティビティは常に破棄されます。

このメソッドは、アクティビティが以前に保存された状態から再初期化されるときにonStart()の後に呼び出されます。ここでは、 savedInstanceState (onSaveInstanceState(Bundle)に保存されたデータを含むバンドルオブジェクト)で指定されます。

ほとんどの実装は単にonCreate(Bundle)を使用して状態を復元しますが、すべての初期化が完了した後、またはサブクラスがデフォルトの実装を使用するかどうかを決定できるようにすると、ここで行うと便利な場合があります。このメソッドのデフォルトの実装は、onSaveInstanceState(Bundle)によって以前にフリーズされたビューステートの復元を実行します。

4)onRestoreInstanceStateは、ジェリービーンズのインストルメンテーションからのみ呼び出されるようです。これは、アクティビティのライフサイクルとは関係がなくなりましたか?

いいえ。onRestoreInstanceStateはAPIレベル1から存在しています。そして、それはまだ新しいJellyBeanAPIの一部です。

于 2012-10-02T04:20:57.243 に答える
3
  1. アクティビティが強制終了された場合 (たとえば、別のアクティビティを起動し、アクティビティを強制終了するために必要なシステムのリソースが不足している場合)、onSaveInstanceState を使用して状態を保存し、復元することができます。

  2. 必ずしも。onCreate は onStart の前に呼び出されますが、onRestoreInstanceState は後で呼び出されるため、何を達成しようとしているかによって異なります。

  3. あなたはonSaveInstanceStateを意味します。上記のポイント1のように、アクティビティが強制終了されたときに呼び出されます

  4. 申し訳ありません...わかりません。Jellybeanで試したことはありません

于 2012-10-02T02:49:15.807 に答える