我正在与一些其他开发人员合作开发一个Android项目,并且在垃圾收集中没有保留实例状态的错误:
报告的实际错误:
该应用有一个活动,包含一堆片段。如果在开发人员选项中选中“不保留活动”,并且用户单击任何更改可见片段的按钮,然后导航离开应用程序然后返回,则会将应用程序重新启动到其原始状态而不是最后状态
该项目的另一位开发人员提出了以下问题:
“保存实例会导致内存大小的应用程序膨胀。 由于可绘制的数量,应用程序内存大小已经是 太高。
没问题,如果应用程序在用户暂停一段时间后重新启动。“
我的理解是savedInstance Bundle实际上被写入物理内存,这是不正确的?以上引用是否是一个有效的问题?
答案 0 :(得分:3)
我的理解是savedInstance Bundle实际上被写入物理内存,这是不正确的?
我正在解释"写入物理记忆"作为意义"写入文件系统上的文件" (a.k.a。,"坚持")。
实例状态Bundle
未保留。 Android 5.0+为PersistableBundle
提供了一个不同的挂钩, 持久存在,因此可以在重新启动后继续使用。
但是,实例状态Bundle
跨进程边界传递给核心OS进程。如果您的流程已终止,则可以使用该数据,但当您的任务仍然存在时,用户会返回您的应用程序(例如,通过最近任务列表)。
以上引用是否是一个有效的问题?
这篇引文中唯一能够由SO在此合理评估的部分是:
保存实例会导致内存大小的应用程序膨胀
在Bundle
中保存一个字节将比在Bundle
中保存零字节消耗更多内存。因此,在数学上,引用是准确的。关键是保持Bundle
小。由于其他原因,它们无论如何都不会变得太大(IPC呼叫限制为1MB)。小实例状态Bundles
应该不是问题。
答案 1 :(得分:0)
正确编码的saveinstance状态将在后台存活数周,并且不需要超过几个字节,最差情况下只有几k内存。
您的其他开发人员存在学习曲线问题。
InstanceState保存您重新创建应用当前向用户查看的方式所需的内容。让我们用一个tic tac toe比喻。你有九个职位。每个位置都是x o或空白。而且你可以拯救谁。十字符串没有膨胀,这不是火箭科学。
应用的InstanceState,屏幕上有10个drawable。你将drawables保存到外部存储器jpg甚至bmp。然后在instanceState中保存drawable的名称。 1000个实例的字符表示没有膨胀,这是计算机科学1k重启一个非常复杂的应用程序。
SaveinstanceState并不是一个很棒的应用程序。