Android SaveInstanceState - 理解

Kev*_*ave 0 android savestate android-activity

来自Android SDK的这个页面

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

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

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

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

Jas*_*son 6

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

如果你想手动保存的实例Activity通过,调用活动B startActivityForResult()。然后,在 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();
}
Run Code Online (Sandbox Code Playgroud)

在活动 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

if (savedInstanceState == null) {
    Intent intent = getIntent();
    Bundle savedState = intent.getBundleExtra("saved_state");
    onRestoreInstanceState(savedState);
}
Run Code Online (Sandbox Code Playgroud)