2

Android のアクティビティ ライフサイクルについて質問があります。メソッド onRestoreInstanceState() がどのような状況で呼び出されるのか知りたいですか?

ドキュメントによると

「復元する保存済みの状態がある場合にのみ、システムは onRestoreInstanceState() を呼び出します」

しかし、この状況がいつ発生するかを知りたいです。前景アクティビティが破棄されて再作成されたときに、画面が回転した場合にのみ適用されますか?

4

1 に答える 1

5

ここのリンクから:

onRestoreInstanceState()OS によって強制終了された後にアクティビティを再作成する場合にのみ呼び出されます。このような状況は、次の場合に発生します。

  • デバイスの向きが変わります (アクティビティが破棄され、再作成されます)
  • あなたの前に別のアクティビティがあり、ある時点で OS がメモリを解放するためにあなたのアクティビティを強制終了します (たとえば)。次にアクティビティを開始するonRestoreInstanceState()と、 が呼び出されます。

対照的に、アクティビティ中Backにデバイスのボタンを押すと、アクティビティは終了 (つまり、デスクトップ アプリケーションの終了と考えてください) され、次にアプリを起動すると、「新しく」起動されます。をヒットしたときに意図的に終了したため、状態を保存しましたBack

他の混乱の原因は、アプリが別のアプリにフォーカスを失っonSaveInstanceState()たときに呼び出されますが、アプリに戻ったときにonRestoreInstanceState()呼び出されない可能性があることです。これは、元の質問で説明されているケースです。つまり、他のアクティビティが前にある期間中にアクティビティが殺されなかった場合onRestoreInstanceState()、アクティビティはほとんど「生きている」ため、呼び出されません。

のドキュメントに記載されているように、全体としてonRestoreInstanceState()

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

onRestoreInstanceState()私が読んだように:あなたがサブクラス化していない限り、オーバーライドする理由はなくActivity、誰かがあなたのサブクラスをサブクラス化することが期待されています。

それだけでなく、次のこともできます。

通常は で状態を復元しますonCreate()。復元することも可能ですonRestoreInstanceState()が、あまり一般的ではありません。(onRestoreInstanceState()は afteronStart()で呼び出されますが、onCreate()は before で呼び出されonStart()ます。

put メソッドを使用して値を に保存しますonSaveInstanceState()

protected void onSaveInstanceState(Bundle icicle) {
  super.onSaveInstanceState(icicle);
  icicle.putLong("param", value);
}

の値を復元しますonCreate()

public void onCreate(Bundle icicle) {
  if (icicle != null){
    value = icicle.getLong("param");
  }
}

ビューステートは自動的に保存されるため、保存する必要はありません。

于 2013-07-09T07:46:27.300 に答える