背景介绍
在调查一个外部拉起App的问题时,意外发现MainActivity在onCreate收到的intent的参数是陈旧的。经过一番调查,了解到,App在后台被系统Kill时(内存不足,权限变更等场景),系统会通过SavedInstanceState机制进行恢复。此时onCreated通知获得的intent将是被Kill之前的MainActivity的intent参数。新的intent会在后续的onNewIntent中通知。
Android官方介绍: 保存界面状态 | Android Developers
什么时候触发?
Android应用存在两种被Kill的场景:
用户发起的界面状态解除
在以下场景,用户的期待是永久终止程序的运行,不需要进行恢复。
- 从“Overview”(“Recents”)屏幕中滑动关闭 activity。
- 从设置界面终止或强制退出应用。
- 重新启动设备。
- 完成某种“完成”操作(由
Activity.finish()
提供支持)。
系统发起的界面状态解除
在以下场景,用户无法意识到应用会被Kill,所以需要进行恢复。
- 配置更改(例如旋转或切换到多窗口模式)
如何正确处理?
- 在Activity详细设计阶段,考虑SavedInstanceState的场景:
- 在onCreated中判定是否处于SavedInstanceState流程中,是否需要恢复之前的场景。
- 在外部通过intent发起请求时,onCreated中处理旧的intent是否会影响到onNewIntent的处理。
- 在发起intent时,考虑SavedInstanceState的场景:
- 可以通过指定FLAG_ACTIVITY_CLEAR_TASK参数,要求系统不再恢复之前的场景。