Android SavedInstanceState - 了解

时间:2012-05-08 04:38:53

标签: android android-activity savestate

来自Android SDK

的此页面
  

默认实现通过在具有id的层次结构中的每个视图上调用onSaveInstanceState()并保存当前焦点视图的id(所有这些都是由onRestoreInstanceState(Bundle)的默认实现恢复。

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

例如,活动A调用活动B.在活动B中,我有checbox,Radio Buttons等。用户选择他们的选择并单击Back按钮。我正在显示活动此时,我想保存用户选择。当用户再次从活动A返回到B时,通过单击按钮,我希望看到所有选择都保持不变。我能想到的一种方法是,设置Intent Flag以将Activity带到前面。但我认为不是推荐的方法。

根据SDK的上述文本,是否存在保存状态的默认实现?或者我可能是在解释它错了?

4 个答案:

答案 0 :(得分:3)

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

如果您想手动保存Activity的实例,请通过startActivityForResult()调用活动B.然后,在活动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);
}

答案 1 :(得分:2)

根据文档,当你重新开始时它将使你的活动前进,如果它没有被杀死。但是为了让所有其他视图状态回来你需要将它们存储在onSaveInstanceState()中的bundle中并在onRestoreInstanceState中再次设置它( )。默认实现仅适用于您的活动,而不适用于活动中的子视图

答案 2 :(得分:1)

当一个应用程序失去焦点到另一个app onSaveInstanceState()被调用但是当你导航回你的app时,onRestoreInstanceState()可能不会被调用。即如果你的活动没有被杀死,那么其他活动就在前面的onRestoreInstanceState()将不会被调用,因为你的活动几乎“活着”。

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

  

大多数实现只会使用onCreate(Bundle)来恢复它们   状态,但有时候在这里做完之后很方便   初始化已完成或允许子类决定是否   使用您的默认实现。这个的默认实现   方法执行以前任何视图状态的恢复   由onSaveInstanceState(Bundle)冻结。

例如:从B开始,您可以调用startActivity(A)。然后从A调用finish()返回B.在这种情况下,您的第一个活动B将不会被销毁,并且onCreate()和onRestoreInstanceState()都不会被调用。这些方法仅在需要时调用,即当一个活动被销毁并需要由系统重新创建时。

答案 3 :(得分:0)

使用SharedPreferences机制。查看文档: https://developer.android.com/reference/android/content/SharedPreferences 实现示例: https://www.tutorialspoint.com/android/android_shared_preferences.htm 另外,您可以使用PreferenceFragment简化此任务。