制作Android应用程序时需要注意哪些内存管理提示?

9

最近在一次关于安卓系统的面试中,我被问到了一些问题。我搜索了一些答案,但是没有找到合适的资源和答案,所以我想在这里与大家分享。

  1. 在安卓系统中,使用哪种布局可以更好地使用内存等资源?我没有回答出来,面试官告诉我相对布局是首选。这是真的吗?有什么解释吗?

  2. 请告诉我一些优化内存消耗的实践方法?我看了一下这里,但似乎还有其他的东西,因为面试官提到了一些与静态变量相关的东西更好。

  3. 如果安卓需要内存,会杀死服务(Service)还是活动(Activity)?这是一个优先级问题。我也没有找到任何讨论这个问题的人。面试官说服务具有较高的优先级(??),因此将杀死活动组件。这是真的吗?是否有进一步的资源或解释?

请分享您知道的任何相关知识或资源。


这不是三个问题吗? - keiki
1个回答

9

逐个回答:

1号

听起来不对。说RelativeLayout比任何其他布局总是更快是错误的。一个布局是“快”还是“慢”取决于计算所有子项的位置和大小所需的时间。因此,当您仅显示15行TextView时,一个LinearLayout肯定会更快(且使用起来更加简便)。

通常,我建议使用最适合您情况的布局。

2号

偏爱静态变量的“优点”是它们只初始化一次(因此在内存中)。但这更多是一种设计决策而不是性能决策。

您应该避免在内存中使用大型嵌套集合(例如List<List<HashMap<?,?>>),但这应该是常识。关于对象创建的问题是,如果您创建了许多对象并且没有保留对它们的引用,则它们将被垃圾收集。这将增加应用程序的运行时开销。

3号

这既对又错。服务可以以不同的优先级启动。但在杀死应用程序使用的任何内容(无论是服务还是活动)之前,后台应用程序及其资源将被释放。

对于服务,文档提供了多个提示:

Android系统将尝试仅在服务已启动或客户端绑定到它时保留托管服务的进程。在内存不足且需要杀死现有进程时,托管服务的进程的优先级将是以下可能性中较高的[完整列表]

对于活动,列出了以下信息

一个Activity主要有四种状态: - 如果一个Activity在屏幕前台(堆栈的顶部),它就是活动或正在运行的。 - 如果一个Activity失去焦点但仍可见(也就是说,新的非全屏或透明的Activity已经位于你的Activity上方),它就暂停了。暂停的Activity完全存活着(它保持了所有状态和成员信息,并继续附加到窗口管理器),但在极低内存情况下可能被系统杀死。 - 如果一个Activity被另一个Activity完全遮挡,它就停止了。它仍然保留所有状态和成员信息,但它不再对用户可见,所以它的窗口被隐藏了,而且当需要在其他地方获得内存时,通常会被系统杀死。 - 如果一个Activity已被暂停或停止,系统可以通过要求它完成或简单地终止其进程来将其从内存中删除。当它再次显示给用户时,它必须完全重新启动并恢复到先前的状态。
因此,对于Activities而言,它是否被杀死取决于其当前状态。
"M. A. Jackson"提出的优化引用:
我们在优化问题上遵循两条规则:
规则1:不要优化。
规则2(仅限专家):不要优化,直到您拥有一个非常清晰和未经优化的解决方案。
因为某个特定平台的功能“太慢”而不使用它通常是个坏主意。Google和Oracle非常注重他们的标准库尽可能地得到了优化。让专家们去关心这样的事情吧。

谢谢您的回复。你知道吗,关于静态变量,面试官说我们不应该使用它们,因为当Android需要内存时,它们是首先释放的!我不确定他的任何答案是否正确。再次感谢。 - MSaudi
在2016年,人们必须对第一点持有不同意见。布局优化是一个严重的问题,无论是在嵌套布局中还是在像RecyclerView这样的适配器视图中。此外,提到AbsoluteLayout而没有说明它已经不再使用(由于重大原因)似乎现在是误导性的。 - natario
@mvai,你说得对,布局已经过时了。我的原意更多的是,你应该使用最适合手头工作的布局。我会相应地进行更改。 - Lukas Knuth
@Lukas,我明白了。谢谢你,如果我看起来傲慢的话,对不起。 - natario

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接