0

Android SDKのこちらのページから

デフォルトの実装では、ID を持つ階層内の各ビューで onSaveInstanceState() を呼び出し、現在フォーカスされているビューの ID を保存することで、インスタンスごとの UI 状態の大部分を処理します (これらはすべて、 onRestoreInstanceState(Bundle) のデフォルト実装)。

アクティビティの各要素の値を保存せずに、アクティビティの状態を自動的に保存するメカニズムはありますか? 私は上記の発言について混乱しています。

たとえば、アクティビティ A がアクティビティ B を呼び出しました。アクティビティ B には、チェックボックス、ラジオ ボタンなどがあります。ユーザーは選択肢を選択し、[戻る] ボタンをクリックします。アクティビティを表示しています この時点で、ユーザーの選択を保存します。ユーザーが再びアクティビティ A から B に戻ったときに、ボタンをクリックして、すべての選択が保持されるようにしたいと考えています。私が考えることができる 1 つの方法は、Intent フラグを設定してアクティビティを前面に出すことです。しかし、推奨される方法ではないと思います。

SDKの上記のテキストに従って、状態を保存するためのデフォルトの実装はありますか? それとも私の解釈が間違っているのでしょうか?

4

4 に答える 4

6

onSaveInstanceState()また、Androidは、再作成が必要な場合、通常は構成の変更(向きの変更など)後にonRestoreInstanceState()のみ明示的に呼び出されます。Activityこれは、の新しいインスタンスを呼び出した場合には適用されませんActivity。戻るボタンを押すと、アクティビティBが破棄され、次にそれを開始したときに、アクティビティBの新しいインスタンスが作成されますActivity

のインスタンスを手動で保存する場合は、Activityを介してアクティビティBを呼び出しますstartActivityForResult()。次に、アクティビティBでonDestroy()メソッドをオーバーライドし、次のコード行を呼び出します。

@Override
protected void onDestroy() {

    Bundle savedState = new Bundle();
    onSaveInstanceState(savedState);
    Intent data = new Intent();
    data.putExtra("savedState", savedState);
    setResult(RESULT_OK, data);

    super.onDestroy();
}

アクティビティAでonActivityResult、データを上書きして保存します。

Bundle activityBData;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_OK) {
        activityBData = data.getBundleExtra("saved_state");
    }
}

次に、アクティビティBを再開するときは、次のように呼び出します。

Intent intent = new Intent(this, ActivityB.class);
if (activityBData != null) {
    intent.putExtra("saved_state", activityBData);
}
startActivityForResult(intent, 0);

最後に、アクティビティBのonCreateメソッドで、状態を復元します。

if (savedInstanceState == null) {
    Intent intent = getIntent();
    Bundle savedState = intent.getBundleExtra("saved_state");
    onRestoreInstanceState(savedState);
}
于 2012-05-08T05:19:31.207 に答える
2

ドキュメントによると、アクティビティが強制終了されていない場合は、もう一度開始するとアクティビティが前に進みます。ただし、他のすべてのビューの状態を元に戻すには、それらを onSaveInstanceState() のバンドルに保存し、onRestoreInstanceState() で再度設定する必要があります。デフォルトの実装は、アクティビティのサブビューではなく、アクティビティに対してのみ機能します

于 2012-05-08T05:08:17.550 に答える
1

アプリが別のアプリにフォーカスを失ったとき onSaveInstanceState() が呼び出されますが、アプリに戻ったときに onRestoreInstanceState() が呼び出されない場合があります。つまり、他のアクティビティが前にあったときにアクティビティが強制終了されなかった場合、アクティビティはほとんど「生きている」ため、 onRestoreInstanceState() は呼び出されません。

全体として、onRestoreInstanceState() のドキュメントに記載されているとおりです。

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

例: B から startActivity(A) を呼び出します。次に、A から finish() を呼び出して B に戻ります。この場合、最初のアクティビティである B は破棄されず、onCreate() も onRestoreInstanceState() も呼び出されません。これらのメソッドは、必要な場合、つまり、アクティビティが破棄され、システムによって再作成する必要がある場合にのみ呼び出されます。

于 2012-05-08T04:50:48.683 に答える