【问题标题】:Android SaveInstanceState - UnderstandingAndroid SaveInstanceState - 理解
【发布时间】:2012-05-08 04:38:53
【问题描述】:

来自Android SDK的这个页面

默认实现会为您处理大部分 UI 实例状态,方法是在层次结构中具有 id 的每个视图上调用 onSaveInstanceState(),并保存当前聚焦视图的 id(所有这些都是由 onRestoreInstanceState(Bundle)) 的默认实现恢复。

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

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

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

【问题讨论】:

标签: android android-activity savestate


【解决方案1】:

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

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

然后,当再次启动 Activity B 时,这样调用它:

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

最后,在 Activity B 的onCreate 方法中,恢复状态:

if (savedInstanceState == null) {
    Intent intent = getIntent();
    Bundle savedState = intent.getBundleExtra("saved_state");
    onRestoreInstanceState(savedState);
}

【讨论】:

    【解决方案2】:

    根据文档,当您重新开始时,它将使您的活动向前推进,如果它没有被杀死。但是要恢复所有其他视图状态,您需要将它们存储在 onSaveInstanceState() 中的捆绑包中,然后在 onRestoreInstanceState( ).默认实现仅适用于您的活动,不适用于您的活动中的子视图

    【讨论】:

      【解决方案3】:

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

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

      大多数实现将简单地使用 onCreate(Bundle) 来恢复它们的 状态,但有时在这里做这件事很方便,毕竟 初始化已经完成或允许子类决定是否 使用您的默认实现。这个的默认实现 方法执行之前已被恢复的任何视图状态 被 onSaveInstanceState(Bundle) 冻结。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-23
          • 1970-01-01
          相关资源
          最近更新 更多