Activity
メソッドonSaveInstanceState()
とを使用しての状態を保存および復元しようとしていますonRestoreInstanceState()
。
問題は、onRestoreInstanceState()
メソッドに入らないことです。誰かが私にこれがなぜなのか説明できますか?
Activity
メソッドonSaveInstanceState()
とを使用しての状態を保存および復元しようとしていますonRestoreInstanceState()
。
問題は、onRestoreInstanceState()
メソッドに入らないことです。誰かが私にこれがなぜなのか説明できますか?
通常は で状態を復元します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");
}
}
onRestoreInstanceState()
OS によって強制終了された後にアクティビティを再作成する場合にのみ呼び出されます。このような状況は、次の場合に発生します。
対照的に、アクティビティ中Back
にデバイスのボタンを押すと、アクティビティは終了 (つまり、デスクトップ アプリケーションの終了と考えてください) され、次にアプリを起動すると、「新しく」起動されます。をヒットしたときに意図的に終了したため、状態を保存しましたBack
。
他の混乱の原因は、アプリが別のアプリにフォーカスを失っonSaveInstanceState()
たときに呼び出されますが、アプリに戻ったときにonRestoreInstanceState()
呼び出されない可能性があることです。これは、元の質問で説明されているケースです。つまり、他のアクティビティが前にある期間中にアクティビティが殺されなかった場合onRestoreInstanceState()
、アクティビティはほとんど「生きている」ため、呼び出されません。
のドキュメントに記載されているように、全体としてonRestoreInstanceState()
:
ほとんどの実装は単に onCreate(Bundle) を使用して状態を復元しますが、すべての初期化が完了した後にここで行うか、サブクラスがデフォルトの実装を使用するかどうかを決定できるようにすることが便利な場合があります。このメソッドのデフォルトの実装は、onSaveInstanceState(Bundle) によって以前に凍結されたビュー ステートの復元を実行します。
onRestoreInstanceState()
私が読んだように:あなたがサブクラス化していない限り、オーバーライドする理由はなくActivity
、誰かがあなたのサブクラスをサブクラス化することが期待されています。
保存した状態onSaveInstanceState()
は、後でonCreate()
メソッド呼び出しで利用できます。したがって、onCreate
(およびそのBundle
パラメーター)を使用して、アクティビティの状態を復元します。
主なことは、保存しonSaveInstanceState()
ないonRestoreInstanceState()
と呼び出されないということです。restoreInstanceState()
これがとの主な違いonCreate()
です。本当に何かを保管していることを確認してください。ほとんどの場合、これはあなたの問題です。
別のアクティビティがフォアグラウンドになると、常に onSaveInstanceState が呼び出されることがわかりました。onStop も同様です。
ただし、onRestoreInstanceState は、onCreate および onStart も呼び出されたときにのみ呼び出されました。また、onCreate と onStart は常に呼び出されるとは限りませんでした。
そのため、アクティビティがバックグラウンドに移動しても、Android は常に状態情報を削除するとは限らないようです。ただし、安全のためにライフサイクル メソッドを呼び出して状態を保存します。したがって、状態が削除されていない場合、Android はライフサイクル メソッドを呼び出して状態を復元する必要がないため、それらを呼び出しません。
図 2はこれを説明しています。
このスレッドはかなり古いものだったと思います。これも呼び出される別のケースonSaveInstanceState()
は、あなたが を呼び出すときですActivity.moveTaskToBack(boolean nonRootActivity)
。
onRestoreInstanceState が常に onSaveInstanceState の後に呼び出される必要はありません。
: onRestoreInstanceState は、アクティビティが回転するとき (向きが処理されないとき) に常に呼び出されるか、アクティビティを開いてから他のアプリを開いて、アクティビティ インスタンスが OS によってメモリからクリアされることに注意してください。
android:configChanges="orientation|screenSize"
とでアクティビティの向きの変更を処理している場合onConfigurationChanged(Configuration newConfig)
、onRestoreInstanceState()
は呼び出されません。
私はちょうどこれに遭遇し、ドキュメントに私の答えがあることに気づいていました:
「この関数が null 状態で呼び出されることはありません。」
私の場合、最初のインスタンス化で onRestoreInstanceState が呼び出されなかったのはなぜだろうと思っていました。これは、何も保存しないと、ビューを再構築するときに呼び出されないことも意味します。
私はそのようにすることができます(申し訳ありませんが、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
}