设置了“不保留活动”,不调用onSaveInstanceState

时间:2020-04-13 21:43:24

标签: android android-activity android-lifecycle onsaveinstancestate

我正在测试我的应用程序是否能够从意外情况中恢复,这些情况导致内存由于内存不足等不同情况而导致操作系统终止我的应用程序的进程。为此,我在开发人员选项中启用了“不保留活动”。

我正在尝试通过生命周期方法onSaveInstanceState将状态值保存在“活动包”中来恢复应用程序的状态,但是在设置断点后,我注意到onSaveInstanceState 没有得到

问题: 我期望在这种情况下调用onSaveInstanceState是错误的,还是可能有其他因素阻止该方法触发?如果都不是,在这种情况下我还能做些什么来恢复状态?

1 个答案:

答案 0 :(得分:0)

我认为应该有两种可能性。

  1. 您的情况是错误的

The official reference说:

请勿将此方法与活动生命周期回调(例如, onPause(),当用户不再活跃时总是调用 与活动交互,或与onStop()交互,当活动进行时 变得不可见。 onPause()和onStop()的一个示例是 被调用,而不是此方法是当用户从活动中导航回来时 B到活动A:无需调用onSaveInstanceState(Bundle) 在B上,因为该特定实例将永远无法还原,因此 系统避免调用它。不调用onPause()的示例 onSaveInstanceState(Bundle)是活动B在前面启动时 活动A:系统可以避免调用onSaveInstanceState(Bundle) 如果活动A在B的生命周期内没有被杀死,那么 A的用户界面状态将保持不变。

如果您的情况是“不需要致电”的情况,则不会致电onSaveInstanceState

  1. 您的断点是错误的

如果调用,此方法将在应用程序的onStop()之后发生 以Build.VERSION_CODES.P开头的定位平台。对于 针对较早平台版本的应用程序,此方法将 发生在onStop()之前,并且不能保证它是否 将在onPause()之前或之后发生。

因此onSaveInstanceState的调用时间取决于您的定位平台。

一个简单的解决方法是在onPause中使用SharedPreference等备份数据。