Android SaveInstanceState-理解

Android SaveInstanceState-理解,android,android-activity,savestate,Android,Android Activity,Savestate,从本页,共页 默认实现通过对层次结构中具有id的每个视图调用onSaveInstanceState(),并通过保存当前关注的视图的id(所有视图都由onRestoreInstanceState(Bundle)的默认实现还原),为您处理大多数UI逐实例状态 那么,是否有一种机制可以自动保存活动状态,而不保存活动中每个元素的值?我对上述说法感到困惑 例如,活动A调用了活动B。在活动B中,我有复选框、单选按钮等。用户选择他们的选择并单击“上一步”按钮。此时我正在显示活动,我想保存用户选择。当用户再次从

从本页,共页

默认实现通过对层次结构中具有id的每个视图调用onSaveInstanceState(),并通过保存当前关注的视图的id(所有视图都由onRestoreInstanceState(Bundle)的默认实现还原),为您处理大多数UI逐实例状态

那么,是否有一种机制可以自动保存活动状态,而不保存活动中每个元素的值?我对上述说法感到困惑

例如,活动A调用了活动B。在活动B中,我有复选框、单选按钮等。用户选择他们的选择并单击“上一步”按钮。此时我正在显示活动,我想保存用户选择。当用户再次从活动A返回到活动B时,通过单击按钮,我希望看到所有选择都保持不变。我能想到的一种方法是,设置意图标志,使活动脱颖而出。但我认为这不是推荐的方法


那么,根据SDK中的上述文本,是否有保存状态的默认实现?或者我解释错了吗?

当一个应用程序在SaveInstanceState()上对另一个应用程序失去焦点时,调用该应用程序,但当您导航回应用程序时,可能不会调用onRestoreInstanceState()。i、 e.如果您的活动在其他活动位于前面的时间段内未被终止,则不会调用onRestoreInstanceState(),因为您的活动几乎处于“活动”状态

总之,正如onRestoreInstanceState()文档中所述:

大多数实现将只使用onCreate(Bundle)来恢复其功能 国家,但有时在这里这样做很方便毕竟 初始化已经完成,或者允许子类决定 使用默认实现。此函数的默认实现 方法执行以前被删除的任何视图状态的恢复 onSaveInstanceState冻结(捆绑)


例如:从B你称之为startActivity(A)。然后从A调用finish()返回B。在这种情况下,您的第一个活动B将不会被销毁,也不会调用onCreate()或onRestoreInstanceState()。这些方法仅在需要时调用,即当活动已销毁且需要由系统重新创建时调用。

根据文档,如果活动未被终止,则在重新启动时,它将使您的活动前进。但要恢复所有其他视图状态,您需要将它们存储在onSaveInstanceState()中的bundle中然后在onRestoreInstanceState()中再次设置。默认实现仅适用于您的活动,而不适用于活动中的子视图

onSaveInstanceState()
onRestoreInstanceState()
仅在需要重新创建
活动时由Android显式调用,通常在配置更改后(例如更改方向)。这不包括调用
活动的新实例时的情况。当您按下后退按钮时,活动B将被销毁,并且您将在下次启动该
活动时创建该活动的新实例

如果要手动保存
活动的实例
,请通过
startActivityForResult()
调用活动B。然后,在活动B中,重写
ondestory()
方法,并调用以下代码行:

@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);
}

使用SharedReferences机制。查看文档: 实施的一个例子: 您还可以使用PreferenceFragment简化此任务。

参见此