我正在追踪一个错误,该错误会在极少数情况下导致应用在后台运行一段时间后通过最近的应用列表重新激活时崩溃。发生这种情况时,调用堆栈信息表明活动尚未正确恢复其实例状态。用于保存/恢复状态的必要代码 - 状态保存在onSaveInstanceState
中并在onCreate
中恢复(在这种情况下不是onRestoreInstanceState
)。
我知道Android正在做什么:它会在某个时刻杀死应用程序进程以节省内存,并在重新激活应用程序时重新启动它。但似乎Android在杀死进程之前有时不会调用onSaveInstanceState,从而导致null
Bundle传递给onCreate。这是致命的,因为从应用程序的角度来看,它从未停止过,但现在状态已经消失。
任何想法如何发生这种情况?
另一个令人费解的细节是,虽然通过任务管理器杀死应用程序的过程无法(轻松)重现崩溃,但是将背景进程的数量设置为" none&#34可以始终如一地重现;在设备的开发者选项中。 (我知道整个过程实际上在两种情况下都被杀死了,因为当应用程序重新启动时,我可以看到它等待调试器附加,这在进程仍处于活动状态时不会发生。)
如果不允许后台进程,按主页按钮并通过最近的应用程序列表重新激活应用程序就足以重现崩溃。记录清楚地表明未调用onSaveInstanceState
,并且null
捆绑包已传递给onCreate
。
根据文档,在系统终止进程之前始终会调用onSaveInstanceState
。任何想法为什么在这种情况下不会这样做?
答案 0 :(得分:0)
您想要保存哪种类型的数据?最好在onPause()
中提交任何长期数据,因为有些情况可能无法调用onSaveInstanceState()
。我还建议检查数据的完整性,这样如果你从Bundle
得不到任何内容,它就会得到优雅的处理。来自Activity
文档:
" ...因此,您应该使用onPause()方法将任何持久性数据(例如用户编辑)写入存储。此外,在将活动置于这样的背景状态之前调用onSaveInstanceState(Bundle)方法,允许您将活动中的任何动态实例状态保存到给定的Bundle中,以便稍后在onCreate(Bundle)中接收需要重新创建。有关流程生命周期如何与其托管的活动相关联的详细信息,请参阅流程生命周期部分。请注意,在onPause()而不是onSaveInstanceState(Bundle)中保存持久数据非常重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的每种情况下调用。"