我的应用程序正在运行Android Gingerbread 2.3.7的自定义版本的特殊设备上运行
有些情况下系统会终止我的应用。我假设设备制造商会考虑这些紧急情况,应立即关闭所有第三方应用程序,以便设备完成其主要任务。
我可以使用模拟器复制我在设备上看到的行为,并在DDMS中选择我的任务并单击“停止进程”按钮。这是我看到的行为。
我的应用程序通常会执行四个活动,活动A启动活动B,B启动活动C,C启动活动D.因此,当活动D在顶部运行时,我的堆栈是:
A - B - C - D
如果此时进程终止,则活动D不会收到onPause()或onStop()调用。它没有机会拯救其国家。
在该过程失效后,Android的ActivityManager为我的应用程序启动一项新任务并启动Activity C.我认为这是重新启动崩溃应用程序的标准Android行为。
我的问题是我可以控制此重启行为吗?如果Android要重新启动我的应用程序,我需要恢复活动堆栈,活动C没有意义独立运行(单击后退按钮将退出应用程序,这对此活动没有意义)。
我可以阻止重启吗? 我可以按顺序重新启动所有活动吗? 我可以重启刚启动活动A吗?
我确实找到了这个interesting discussion,我相信这解释了为什么重新启动活动C而不是活动D.
当活动重新启动时 - 如果进程正在运行 前景活动消失了,系统会扔掉它 活动,如果它没有有效的保存状态(通常 意思是暂停并给系统带来了结果 暂停前的onSaveInstanceState)。一旦决定了 无论是否抛弃该活动,它都会恢复 活动现在位于堆栈的顶部。如果这是你的一个 活动 - 或者因为你有另一个活动 坠毁,或坠毁的那个人不知何故是停顿了 状态 - 然后它将再次启动您的过程以显示顶部 活性。
还有一些类似的问题,例如Prevent Activity Stack from being Restored?和这个有趣的thread
答案 0 :(得分:3)
经过大量的实验,我选择了“Android Developers> Activity restart crash after OS kills it”中暗示的方法。那里有一个Q / A交换:
问题:
“已经完成了代码并看到了你在说什么 关于。它调用onSaveInstanceState并将数据保存在Bundle中。 活动重新启动时,此Bundle信息是否可用 操作系统杀死进程后?“
答案:
“它应该是。你将在onCreate()和in中获得Bundle onRestoreInstanceState()。 onCreate()可以为null传递null 捆绑,如果没有要恢复的Bundle。 onRestoreInstanceState()是 仅在有要恢复的Bundle时调用。“
我将应用程序被杀死后恢复所需的所有会话数据移动到可序列化的单例中。
在onSaveInstanceState()中,我将序列化的会话数据放入savedInstanceState包中
@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()中,我测试我的会话单例实例是否有效。如果它没有有效数据,我从savedInstanceState包中恢复会话变量,并将此恢复的对象作为我的会话变量singleton。
@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()从已保存的实例状态包中恢复所有必要的会话数据。
Back按钮在这一点上也可以正常工作,所以我错了Android不保留Activity堆栈。我认为它只是根据需要恢复后面的活动(当你向后导航时)。如果您不向后导航,则不会创建它们。至少这是它在HierarchyViewer中的样子。
当我的筹码是A-B-C-D且任务被杀死时,活动“C”将恢复,“D”将丢失。但是,现在“C”处于健康状态,用户可以轻松导航回“D”。现在,我也可以从“C”自动启动“D”活动,我还没有时间。