在哪里保存了onSaveInstanceState包?

Jle*_*leu 20 android

我想知道存储onSaveInstanceState(Bundle outState)方法的bundle"outState"的位置.

它是存储在内存中还是存储在设备中?

我担心存储在捆绑中的数据的安全性.

use*_*305 9

要仅为应用程序生命周期(即临时)存储数据,请使用onSaveInstanceState(Bundle)活动事件

此数据仅在应用程序关闭之前保留在内存中,只要此活动在应用程序的当前生命周期内开始,数据就可用.

说明:如果数据由活动A存储在此处,则应用程序显示不同的活动或旋转屏幕(因此关闭A)然后返回到A,可以检索数据以填充控件.但是,如果应用程序关闭并再次打开,数据将会消失,控件将恢复为默认值.

使用示例:存储用户输入的文本和组成订单,博客条目,消息等的选择...

注意:

重要的是要注意只有Activity被销毁和重新创建,而不是整个应用程序!Android应用程序可以包含许多活动,服务和ContentProviders!如果应用程序已关闭(例如,通过按"后退"按钮,则所有值都将消失.soredInstaceState仅用于在销毁/重新创建活动时保留临时数据,而不是应用程序本身.

如果要永久保留数据,则需要将其另存为"首选项"或ContentProvider /数据库.


Gen*_* S. 7

我认为任何恶意后台进程都无法获取应用程序的捆绑数据.没有记录Android如何处理Bundle数据.在您的应用程序被清理时,它可能会也可能不会写入磁盘,而后台则是.但是,鉴于我们不知道这些数据是否保存到磁盘,如果是这样,假设我们不知道哪里,并且几乎肯定没有读取访问磁盘的那部分,我不会不用担心某些第三方进程能够恢复该数据.

因此,我不清楚你认为曝光是什么.虽然我可能会遗漏一些东西.但是,在回答你的问题时,它绝对是在你的应用程序存活的内存中,并且如果你的应用程序是背景的,它可能会或可能不会被隐藏在某处,但我们不知道因为Google没有告诉我们.

收集内存时,它会随应用程序一起被销毁.

  • 这是一个不准确的答案.考虑应用程序进程被操作系统自动杀死的情况(当应用程序在后台时),然后用户返回应用程序,然后操作系统恢复应用程序(创建新进程并恢复活动堆栈).尽管应用程序进程在一段时间内不存在,但是捆绑包被提供给已恢复的活动,因此它以某种方式/某处存储在系统中.反过来,系统只是不确定它如何存储捆绑包,所以理论上它可能使用文件系统. (2认同)

Ugu*_*rim 7

以下是outStateBundle 数据保存位置的详细答案:

...bundle 是一种 IPC 机制,所以它不会进入文件系统。但是现在涉及到一个 P——它是哪个进程?这个过程对这些数据做了什么?我需要担心吗?事实证明,这些实例状态包存储在 Activity Manager 服务中。此服务在 Android 源代码中的包 com.android.server.am 下实现。回想一下,Activity 是一个叠在一起的,Android 将这些堆栈称为“任务”……这些任务中的每一个都在内部用TaskRecord类的对象表示。这个类包含一个ActivityRecord数组对象,每个对象管理一个活动的状态。ActivityRecord 包含一个名为 icicle 的 Bundle 类型成员。这个 icicle-bundle 是保存的实例状态,它实际上存储在 Activity Manager 服务的内存空间中

来源:https : //www.linkedin.com/pulse/android-onsaveinstancestate-bundle-secret-safe-daniel-pietsch/


crg*_*dos 7

文档已被更新,准确地指示状态序列化到磁盘:

保存的实例状态包同时保留配置更改和进程死亡,但由于将数据序列化到磁盘而受到存储量和速度的限制onSavedInstanceState()

您还可以找到一个表格,比较不同的方法来保留 UI 状态

保留 UI 状态的选项

来源:https : //developer.android.com/topic/libraries/architecture/saving-states