如何区分OnRestoreInstanceState的路径?
How to tell the difference of the path of OnRestoreInstanceState?
我在处理 OnSaveInstanceState
/OnRestoreInstanceState
对时遇到了一些问题。据说是为了临时保存状态,最好的例子就是phone旋转的时候。这部分很适合我。
然而,当应用程序简单退出时,也会调用 OnSaveInstanceState
。几个小时后我启动应用程序(从我的角度来看它是一个新的 运行),令我惊讶的是 Android 调用 OnRestoreInstanceState
并且能够挖掘出状态的“旧”值。
这破坏了我的逻辑,因为我当前的代码假定仅当应用程序 运行 不断(从用户角度来看)时才调用这对,因此在第二种情况下,我的应用程序的一半表现得就像刚启动一样(正确),而另一半的行为就像它正在处理某些数据(因为它从保留状态获得了这些值;这不是故意的)。
当然我可以破解它并完全放弃这对并在应用程序实例中使用全局值,但我想知道如何在不使用大枪的情况下做到这一点correctly/gently?
更新:发生的重要事件:
- 我的应用程序的第一个 运行
- 屏幕是否旋转
- 我的应用程序经历了 OnPause 或其他什么,关键是它经历了
OnSaveInstanceState
- 一段时间过去了
- 我再次 运行 应用程序,在日志中我看到调用了 application 构造函数(据我所知,一切都是全新创建的)
- 在新的应用程序实例中 activity OnCreate/OnResume/etc 被调用
- 并且其中
OnRestoreInstanceState
也被调用了,它的 bundle 实例不为空——这意味着临时状态实例跨越了 application(不仅仅是 activity) 寿命(这让我担心)
姜饼 2.3.
目前我最终使用存储在应用程序中的全局变量,因为它在每次启动时重新创建,但在屏幕旋转时保留它的行为符合我的预期。
Several hours later I start app (from my perspective it is a new run), and to my surprise Android calls OnRestoreInstanceState and is able to dig out "old" values of the state.
在 Android 的现代版本中,保存的实例状态只有大约 30 分钟,而不是几个小时。但是,这仍然可能是在您的应用程序处于后台时终止您的进程之后,以释放系统 RAM。
I wonder how to do it correctly/gently without using big guns?
仅将保存的实例状态 Bundle
用于 process-termination 场景。
对于配置更改,如果您正在使用 Android 的现代版本,您将使用 ViewModel
。您的“Gingerbread 2.3”表明您正在进行逆向计算,并且目前很少有库支持这样一个旧的 OS 版本。对于 API 级别 10 的纯 Android SDK 解决方案,您将使用 onRetainNonConfigurationInstance()
和 getLastNonConfigurationInstance()
。 ViewModel
是(间接地)建立在这些方法之上的。
我在处理 OnSaveInstanceState
/OnRestoreInstanceState
对时遇到了一些问题。据说是为了临时保存状态,最好的例子就是phone旋转的时候。这部分很适合我。
然而,当应用程序简单退出时,也会调用 OnSaveInstanceState
。几个小时后我启动应用程序(从我的角度来看它是一个新的 运行),令我惊讶的是 Android 调用 OnRestoreInstanceState
并且能够挖掘出状态的“旧”值。
这破坏了我的逻辑,因为我当前的代码假定仅当应用程序 运行 不断(从用户角度来看)时才调用这对,因此在第二种情况下,我的应用程序的一半表现得就像刚启动一样(正确),而另一半的行为就像它正在处理某些数据(因为它从保留状态获得了这些值;这不是故意的)。
当然我可以破解它并完全放弃这对并在应用程序实例中使用全局值,但我想知道如何在不使用大枪的情况下做到这一点correctly/gently?
更新:发生的重要事件:
- 我的应用程序的第一个 运行
- 屏幕是否旋转
- 我的应用程序经历了 OnPause 或其他什么,关键是它经历了
OnSaveInstanceState
- 一段时间过去了
- 我再次 运行 应用程序,在日志中我看到调用了 application 构造函数(据我所知,一切都是全新创建的)
- 在新的应用程序实例中 activity OnCreate/OnResume/etc 被调用
- 并且其中
OnRestoreInstanceState
也被调用了,它的 bundle 实例不为空——这意味着临时状态实例跨越了 application(不仅仅是 activity) 寿命(这让我担心)
姜饼 2.3.
目前我最终使用存储在应用程序中的全局变量,因为它在每次启动时重新创建,但在屏幕旋转时保留它的行为符合我的预期。
Several hours later I start app (from my perspective it is a new run), and to my surprise Android calls OnRestoreInstanceState and is able to dig out "old" values of the state.
在 Android 的现代版本中,保存的实例状态只有大约 30 分钟,而不是几个小时。但是,这仍然可能是在您的应用程序处于后台时终止您的进程之后,以释放系统 RAM。
I wonder how to do it correctly/gently without using big guns?
仅将保存的实例状态 Bundle
用于 process-termination 场景。
对于配置更改,如果您正在使用 Android 的现代版本,您将使用 ViewModel
。您的“Gingerbread 2.3”表明您正在进行逆向计算,并且目前很少有库支持这样一个旧的 OS 版本。对于 API 级别 10 的纯 Android SDK 解决方案,您将使用 onRetainNonConfigurationInstance()
和 getLastNonConfigurationInstance()
。 ViewModel
是(间接地)建立在这些方法之上的。