0

Android SDK的这个页面

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

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

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

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

4

4 回答 4

6

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

如果要手动保存 的实例,请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);
}
于 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 回答
0

使用 SharedPreferences 机制。查看文档: https ://developer.android.com/reference/android/content/SharedPreferences 实现示例: https ://www.tutorialspoint.com/android/android_shared_preferences.htm 您也可以使用 PreferenceFragment 来使这项任务变得容易。

于 2018-07-25T18:51:18.923 回答