从Android应用程序被杀死中恢复

3

发生了什么:

  1. 我打开我的应用程序,然后按下主页按钮离开一会儿。
  2. 我进入 设置 > 应用程序 > 管理应用程序 > 运行中,在缓存的后台应用程序列表中找到我的应用程序,并停止它。
  3. 然后我按住主页按钮,在最近使用应用程序列表中选择我的应用程序,重新运行它。

[注意:这些步骤只是我强制出现测试人员看到的相同症状的方法--他们只是正常地进出应用程序,而不是强制关闭它。]

它打开了我离开时的活动,但状态不好。第一个问题是保存用户信息的内存已经丢失(如果应用程序被杀死,这是有道理的)。我通过使User类可序列化并将当前用户对象存储在onSaveInstanceState中来解决了这个问题,然后在onCreate中加载它。同样,我不得不重新创建我的ClientConnectionManager才能让网络工作。

'重新加载'的活动运行良好,我可以浏览和使用新创建的活动,但如果我按下返回按钮回到在我强制停止应用程序之前创建的活动,我会收到一个异常,说User类不存在(ClassNotFoundException,显然在取消包裹时发生了)。

为什么会发生这种情况?当应用程序被杀死但仍然知道重新打开时要返回哪个活动时,正确的处理方式是什么?这种状态叫什么?

3个回答

4
  1. 您可以指定哪些活动将显示在“最近使用的应用程序”上,并确保只包括主要的Activity或任何其他“安全”的Activityandroid:excludeFromRecents)。
  2. 您可以通过查找启动Intent中的FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY来识别“从历史记录启动”的情况。

我可以尝试使用这些进行操作,但对我来说重要的是我的活动可以返回。我的活动现在重新启动得很好,只是后台堆栈中的活动在启动时崩溃了。 - Mike A.
你能描述一下你的Activity和前一个Activity之间的关系吗?你是传递一个值还是结果? - avimak
这是因为我在保存状态时总是将一个可序列化的(而不是可包裹的)用户对象放入bundle中,所以这发生在我的任何活动中。我已经添加了一个解决方案来讨论这个问题。感谢您的帮助。 - Mike A.

4
当应用程序被终止时(无论是由操作系统还是用户强制终止),整个活动堆栈都会被清除。因此,后退堆栈中没有任何活动,当您重新启动它时,前台的活动是后退堆栈中唯一的活动。因此,您无法从堆栈顶部返回。也可能发生后退堆栈被清除,只剩下根活动的情况,如在任务和后退堆栈中所述。
如果用户长时间离开任务,则系统会清除所有活动,仅保留根活动。当用户再次返回任务时,只有根活动被恢复。系统行为是这样的,因为经过一段时间后,用户很可能已经放弃了之前正在做的事情,并且正在返回任务以开始新的工作。

这似乎不是我的情况。堆栈仍然存在 - 当我点击“返回”时,堆栈中的上一个活动会启动(并像描述的那样崩溃)。我认为文档中的这句话适用于我的情况:“当系统停止您的某个活动(<cut>)时,如果需要恢复系统内存,系统可能会完全销毁该活动。当发生这种情况时,有关活动状态的信息将丢失。如果发生这种情况,则系统仍然知道该活动在后台堆栈中占据位置,但当将该活动带到堆栈顶部时,系统必须重新创建它。” - Mike A.

1
解决方案是让我的用户类实现Parcelable接口。出于我不理解的原因,当保存实例状态并成功地将其作为Serializable对象放入Bundle中时,我可以将我的用户放入其中,并在恢复最后一个可见活动时成功地将其取出,但当后台堆栈中的活动重新启动时,它无法处理该对象存在于该bundle中的情况。

现在我的应用程序可以从后台被杀死中恢复。我会给@avimak和@Rajesh点赞,因为两个答案都教会了我很多。谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接