0

我工作的一个机器人项目,其他一些开发商和bug已被提出,其中实例的状态并没有被保留在垃圾收集:savedInstanceState记忆影响

实际的错误报告:

的应用程序有一个活动与一堆碎片。如果在开发人员选项中选中“不保留活动”,并且用户单击任何更改可见碎片的按钮,然后导航离开应用然后返回,则会将应用重新启动到原始状态而不是最后一个状态。

在该项目的另一个开发提出了以下关注:

“情况下的保存会导致内存大小的应用程序,以臃肿 目前,由于可绘量,该应用程序的内存大小 太高。

如果应用程序在一段时间内没有被用户使用后重新启动,那么它很好。“

我的理解是,savedInstance包实际上被写入物理内存,这是不正确的?上述报价是否有效?

回答

3

我的理解是savedInstance Bundle实际上被写入物理内存,这是不正确的吗?

我正在将“写入物理内存”解释为“写入文件系统中的文件”(又名“持久”)。

实例状态Bundle未被保留。 Android 5.0+为您提供了一个PersistableBundle的不同挂钩,,因此存活并重启。

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

以上报价是否有效?

该报价是可以合理地被人在这里评价了做的唯一的一块是:

实例的储蓄将导致应用程序的内存大小臃肿

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

+0

在数学上说保存实例状态会导致应用程序膨胀你的数学解决方案是草率概括的谬误,因为一个字节不会膨胀。 – danny117 2014-11-14 18:38:07

0

正确编码的saveinstance状态在一段时间内将在后台存活数周,并且不需要超过几个字节,最坏的情况是几k的RAM。

你的其他开发者有一个学习曲线问题。

InstanceState保存您需要重新创建应用程序当前查看用户的方式。我们用一个tic tac toe比喻。你有九个职位。每个位置都是xo或空白。而且你可以节省谁是它。一个十字符串不会在这里膨胀,这不是火箭科学。

InstanceState在屏幕上有10个可绘制的应用程序。您将drawables保存为外部存储器,如jpg甚至bmp。然后,将可绘制的名称保存在instanceState中。 1000个字符的实例状态不会膨胀,这是计算机科学1k重新启动一个非常复杂的应用程序。

SaveinstanceState不是膨胀的软件它的一个真棒应用程序。