Android SaveInstanceState-理解
从本页,共页 默认实现通过对层次结构中具有id的每个视图调用onSaveInstanceState(),并通过保存当前关注的视图的id(所有视图都由onRestoreInstanceState(Bundle)的默认实现还原),为您处理大多数UI逐实例状态 那么,是否有一种机制可以自动保存活动状态,而不保存活动中每个元素的值?我对上述说法感到困惑 例如,活动A调用了活动B。在活动B中,我有复选框、单选按钮等。用户选择他们的选择并单击“上一步”按钮。此时我正在显示活动,我想保存用户选择。当用户再次从活动A返回到活动B时,通过单击按钮,我希望看到所有选择都保持不变。我能想到的一种方法是,设置意图标志,使活动脱颖而出。但我认为这不是推荐的方法Android SaveInstanceState-理解,android,android-activity,savestate,Android,Android Activity,Savestate,从本页,共页 默认实现通过对层次结构中具有id的每个视图调用onSaveInstanceState(),并通过保存当前关注的视图的id(所有视图都由onRestoreInstanceState(Bundle)的默认实现还原),为您处理大多数UI逐实例状态 那么,是否有一种机制可以自动保存活动状态,而不保存活动中每个元素的值?我对上述说法感到困惑 例如,活动A调用了活动B。在活动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简化此任务。参见此