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 的上述文本?或者我可能解释错了?
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)
| 归档时间: |
|
| 查看次数: |
6015 次 |
| 最近记录: |