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

时间:2012-05-11 05:37:24

标签: android

发生了什么:

  1. 我打开我的应用程序,然后按主页按钮暂时离开。
  2. 我进入Settings > Applications > Manage Applications > Running,在缓存的背景应用列表中找到我的应用,然后停止它。
  3. 然后我按住主页按钮,在最近的应用列表中选择我的应用,再次运行。
  4. [注意:这些步骤只是我强迫测试人员看到的相同症状的方式 - 他们只是正常进出应用程序,而不是强行关闭。]

    它在我离开它的活动中打开,但处于不良状态。第一个问题是持有用户信息的内存消失了(如果应用程序被杀死则有意义)。我解决了这个问题,方法是将User类序列化并将当前用户对象存储在onSaveInstanceState中,然后将其加载到onCreate中。同样,我不得不重新创建我的ClientConnectionManager以使网络重新开始工作。

    “重新加载”活动运行得很好,我可以导航到并使用新创建的活动,但是如果我按下后退按钮返回到我强行停止之前创建的活动应用程序,我得到一个异常,说User类不存在(ClassNotFoundException,显然是在执行一个unparcel时)。

    为什么会这样?应用程序被杀死时处理案例的正确方法是什么,但仍然知道在重新打开时要返回哪个活动?应用程序未运行但未完全关闭的状态名称是什么?

3 个答案:

答案 0 :(得分:4)

  1. 您可以指定哪些活动会在“最近的应用”中显示,并确保仅包含主Activity或任何其他“安全”Activityandroid:excludeFromRecents
  2. 您可以通过在发布Intent
  3. 中查找FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY来识别“从历史记录中启动”案例

答案 1 :(得分:4)

当应用程序终止时(由操作系统或用户强制执行),将清除完整的活动堆栈。因此后备堆栈中没有活动,当您重新启动它时,前台中的活动是后堆栈中的唯一活动。因此,您无法从堆栈顶部返回。也可能发生后备栈被清除,只留下Tasks and Back Stack

中提到的根活动
  

如果用户长时间离开任务,系统将清除除根活动之外的所有活动的任务。当用户再次返回任务时,仅恢复根活动。系统以这种方式运行,因为在很长一段时间之后,用户可能已经放弃了之前正在做的事情,并且正在返回任务以开始新事物。

答案 2 :(得分:1)

解决方案是让我的User类实现Parcelable。由于我不理解的原因,我可以在保存实例状态时将我的用户放在Bundle中作为Serializable对象,并在最后一次可见活动恢复时成功将其拉出,但是当后台重新启动它无法处理该捆绑中的那个对象。

现在我的应用程序在后台被杀死了。我赞成@avimak和@Rajesh,因为这两个答案都教会了我很多。感谢。