142

ActivityメソッドonSaveInstanceState()とを使用しての状態を保存および復元しようとしていますonRestoreInstanceState()

問題は、onRestoreInstanceState()メソッドに入らないことです。誰かが私にこれがなぜなのか説明できますか?

4

13 に答える 13

194

通常は で状態を復元します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");
  }
}
于 2010-11-04T21:18:33.390 に答える
153

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

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

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

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

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

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

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

于 2011-07-17T09:05:50.610 に答える
8

保存した状態onSaveInstanceState()は、後でonCreate()メソッド呼び出しで利用できます。したがって、onCreate(およびそのBundleパラメーター)を使用して、アクティビティの状態を復元します。

于 2010-11-04T11:41:04.560 に答える
3

主なことは、保存しonSaveInstanceState()ないonRestoreInstanceState()と呼び出されないということです。restoreInstanceState()これがとの主な違いonCreate()です。本当に何かを保管していることを確認してください。ほとんどの場合、これはあなたの問題です。

于 2012-10-24T13:03:32.607 に答える
3

別のアクティビティがフォアグラウンドになると、常に onSaveInstanceState が呼び出されることがわかりました。onStop も同様です。

ただし、onRestoreInstanceState は、onCreate および onStart も呼び出されたときにのみ呼び出されました。また、onCreate と onStart は常に呼び出されるとは限りませんでした。

そのため、アクティビティがバックグラウンドに移動しても、Android は常に状態情報を削除するとは限らないようです。ただし、安全のためにライフサイクル メソッドを呼び出して状態を保存します。したがって、状態が削除されていない場合、Android はライフサイクル メソッドを呼び出して状態を復元する必要がないため、それらを呼び出しません。

図 2はこれを説明しています。

于 2014-05-14T18:18:35.003 に答える
2

このスレッドはかなり古いものだったと思います。これも呼び出される別のケースonSaveInstanceState()は、あなたが を呼び出すときですActivity.moveTaskToBack(boolean nonRootActivity)

于 2012-06-27T16:32:04.803 に答える
1

onRestoreInstanceState が常に onSaveInstanceState の後に呼び出される必要はありません。

: onRestoreInstanceState は、アクティビティが回転するとき (向きが処理されないとき) に常に呼び出されるか、アクティビティを開いてから他のアプリを開いて、アクティビティ インスタンスが OS によってメモリからクリアされることに注意してください。

于 2016-12-07T12:57:04.720 に答える
1

android:configChanges="orientation|screenSize"とでアクティビティの向きの変更を処理している場合onConfigurationChanged(Configuration newConfig)onRestoreInstanceState()は呼び出されません。

于 2015-04-13T10:50:45.720 に答える
0

私はちょうどこれに遭遇し、ドキュメントに私の答えがあることに気づいていました:

「この関数が null 状態で呼び出されることはありません。」

https://developer.android.com/reference/android/view/View.html#onRestoreInstanceState(android.os.Parcelable)

私の場合、最初のインスタンス化で onRestoreInstanceState が呼び出されなかったのはなぜだろうと思っていました。これは、何も保存しないと、ビューを再構築するときに呼び出されないことも意味します。

于 2016-05-18T01:36:26.297 に答える
0

私はそのようにすることができます(申し訳ありませんが、JavaではなくC#ですが、問題ではありません...):

private int iValue = 1234567890;

function void MyTest()
{
    Intent oIntent = new Intent (this, typeof(Camera2Activity));
    Bundle oBundle = new Bundle();
    oBundle.PutInt("MYVALUE", iValue); //=> 1234567890
    oIntent.PutExtras (oBundle);
    iRequestCode = 1111;
    StartActivityForResult (oIntent, 1111);
}

そして、結果のためのあなたの活動において

private int iValue = 0;

protected override void OnCreate(Bundle bundle)
{
    Bundle oBundle =  Intent.Extras;
    if (oBundle != null)
    {
        iValue = oBundle.GetInt("MYVALUE", 0);
        //=>1234567890
    }
}

private void FinishActivity(bool bResult)
{
    Intent oIntent = new Intent();
    Bundle oBundle = new Bundle();
    oBundle.PutInt("MYVALUE", iValue);//=>1234567890
    oIntent.PutExtras(oBundle);
    if (bResult)
        {
            SetResult (Result.Ok, oIntent);
        }
    else
        SetResult(Result.Canceled, oIntent);
    GC.Collect();
    Finish();
}

最後に

protected override void OnActivityResult(int iRequestCode, Android.App.Result oResultCode, Intent oIntent)
{
    base.OnActivityResult (iRequestCode, oResultCode, oIntent);
    iValue = oIntent.Extras.GetInt("MYVALUE", -1); //=> 1234567890
}
于 2016-06-29T14:38:54.333 に答える