0

我在处理OnSaveInstanceState/OnRestoreInstanceState对时有些问题。据说是为了暂时保存状态,最好的例子是手机旋转时。这部分对我很有用。

然而OnSaveInstanceState,当应用程序简单地退出时也会调用。几个小时后,我启动了应用程序(从我的角度来看,这是一个新的运行),令我惊讶的是 Android 调用OnRestoreInstanceState并能够挖掘出状态的“旧”值。

这破坏了我的逻辑,因为我当前的代码假设这对仅在应用程序持续运行时(从用户的角度)被调用,所以在第二种情况下,我的应用程序的一半表现得像刚刚启动(正确),而另一半表现得像它是在处理一些数据的过程中(因为它从保留状态中获取了这些值;这不是故意的)。

当然我可以破解它并完全放弃这对并在应用程序实例中使用全局值,但我想知道如何在不使用大枪的情况下正确/温和地做到这一点?

更新:发生的重要事件:

  • 我的应用程序的第一次运行
  • 屏幕是否旋转
  • 我的应用程序通过 OnPause 或其他什么,关键是它通过OnSaveInstanceState
  • 一段时间过去了
  • 我再次运行该应用程序,在日志中我看到调用了应用程序构造函数(据我所知,一切都是全新创建的)
  • 在新的应用程序实例活动中调用 OnCreate/OnResume/etc
  • 其中OnRestoreInstanceState也被调用,并且它的 bundle 实例不为空——这意味着临时状态实例跨越了应用程序(不仅仅是活动)的生命周期(这让我担心)

姜饼 2.3。

目前我最终使用了存储在应用程序中的全局变量,因为它在每次启动时都会重新创建,但在屏幕旋转时会保留它的行为,就像我预期的那样。

4

1 回答 1

1

几个小时后,我启动了应用程序(从我的角度来看,这是一个新的运行),令我惊讶的是,Android 调用了 OnRestoreInstanceState 并且能够挖掘出状态的“旧”值。

在现代版本的 Android 上,保存的实例状态只有大约 30 分钟,而不是几个小时。但是,这仍然可能是在您的进程在您的应用程序处于后台时终止之后,以释放系统 RAM。

我想知道如何在不使用大枪的情况下正确/温和地做到这一点?

仅将保存的实例状态Bundle用于流程终止场景。

对于配置更改,如果您正在使用现代版本的 Android,您将使用ViewModel. 您的“Gingerbread 2.3”表明您正在进行逆向计算,并且目前几乎没有支持这种旧操作系统版本的库。对于 API 级别 10 的纯 Android SDK 解决方案,您可以onRetainNonConfigurationInstance()使用getLastNonConfigurationInstance(). ViewModel是在这些方法之上(间接)构建的。

于 2020-08-23T18:47:47.333 回答