经过大量实验后,我选择了“Android 开发者>”中暗示的方法操作系统杀死活动后重新启动崩溃 https://groups.google.com/forum/#!topic/android-developers/YtQ_S76_hPc”。有一次问答交流是:
问题:
“已经浏览了代码并看到了你在说什么
关于。它调用onSaveInstanceState并将数据保存在Bundle中。
当活动重新启动时,此捆绑包信息是否可用
操作系统杀死进程后?”
Answer:
“应该是这样。您将在 onCreate() 和中获得该 Bundle
onRestoreInstanceState()。 onCreate() 可以传递 null
Bundle,如果没有要恢复的 Bundle。 onRestoreInstanceState() 是
仅当有捆绑包需要恢复时才调用。”
我将应用程序被终止后恢复所需的所有会话数据移至可序列化的单例中。
在 onSaveInstanceState() 中,我将序列化的会话数据放入 savingInstanceState 包中
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
// save and restore session data to instance state to recover from task termination
savedInstanceState.putSerializable(SessionVariables.class.getName(), mSessionVariables);
}
在 onCreate() 和 onRestoreInstanceState() 中,我测试我的会话单例实例是否有效。如果它没有有效数据,我会从 savingInstanceState 包中恢复会话变量,并将此恢复的对象作为我的会话变量单例。
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (mSessionVariables.propertyThatShouldbeGood == null || mSessionVariables.propertyThatShouldbeGood .length() == 0)
{
// save and restore session data to instance state to recover from task termination
Serializable serializedSessionVariables = savedInstanceState.getSerializable(SessionVariables.class.getName());
if (serializedSessionVariables != null) {
mSessionVariables = (SessionVariables) serializedSessionVariables;
SessionVariables.putInstance(mSessionVariables);
}
}
}
现在,当我的任务被终止时,Android 会从堆栈中恢复之前的活动。 onCreate() 从保存的实例状态包中恢复所有必要的会话数据。
此时“后退”按钮也可以正常工作,所以我错了,Android 没有保留 Activity 堆栈。我认为它只是根据需要恢复背部活动(当您向后导航时)。如果您不向后导航,则不会创建它们。至少在 HierarchyViewer 中是这样的。
当我的堆栈为 A-B-C-D 并且任务被终止时,活动“C”将恢复,而“D”将丢失。但是,现在“C”处于健康状态,用户可以轻松导航回“D”。现在,我也可以从“C”自动启动“D”活动,我只是还没有时间。