savedInstanceState 内存含义



我正在与其他一些开发人员一起开发一个 android 项目,并提出了一个错误,其中实例状态未保留在垃圾回收中:

报告的实际错误:

该应用程序有一个包含一堆片段的活动。如果在开发者选项中选中了"不保留活动",并且用户单击了更改可见片段的任何按钮,然后离开应用,然后返回,则会将应用重新启动到其原始状态,而不是上一个状态。

该项目的另一位开发人员提出了以下问题:

"保存实例将导致内存大小的应用程序膨胀。 由于可绘制对象的数量,应用程序的内存大小已经 太高了。

没关系,如果应用程序在用户不使用一段时间后重新启动。

我的理解是,保存的实例捆绑包实际上是写入物理内存的,这是不正确的吗? 上述报价是否有效?

我的理解是,保存的实例捆绑包实际上是写入物理内存的,这是不正确的吗?

我将"写入

物理内存"解释为"写入文件系统上的文件"(又名"持久化")。

实例状态Bundle不会保留。Android 5.0+ 为您提供了一个不同的钩子,用于持久保存的PersistableBundle,因此在重新启动后幸存下来。

但是,实例状态Bundle跨进程边界传递到核心操作系统进程。如果您的流程终止,但用户在您的任务仍然存在时返回您的应用(例如,通过最近任务列表),则可以使用该数据。

上述报价是否有效?

这句话中唯一可以被SO上的人们合理评估的部分是:

保存实例将导致应用程序内存大小膨胀

Bundle中保存一个字节将比在Bundle中保存零字节消耗更多的内存。因此,从数学上讲,报价是准确的。关键是要保持Bundle小。由于其他原因(IPC 调用限制为 1MB),它们无论如何都不能变得太大。小型实例状态Bundles应该不是问题。

正确编码的保存实例状态一次将在后台存活数周,并且只需要几个字节(最坏的情况是几k个内存)。

您的其他开发人员存在学习曲线问题。

实例状态保存重新创建应用当前对用户的外观所需的内容。 让我们用井字游戏来类比。 你有九个职位。 每个位置都是 x o 或空白。你保存了轮到谁了。 十个字符的字符串在这里没有膨胀,这不是火箭科学。

屏幕上有 10 个可绘制对象的应用的实例状态。 您可以将可绘制对象作为 JPG 甚至 BMP 保存到外部存储中。 然后,将可绘制对象的名称保存在实例状态中。 一个 1000 个字符的实例状态没有膨胀,这是计算机科学 1k 重新启动一个非常复杂的应用程序。

保存实例状态不是膨胀软件,它是一个很棒的应用程序。

相关内容

  • 没有找到相关文章

最新更新