制作Android应用程序时是否有内存管理技巧?

MSa*_*udi 9 android android-layout android-memory

我最近在一次关于Android的采访中被问了一些问题.我搜索了其中一些,但我找不到合适的资源和答案.所以我想在这里与大家分享.

  1. 在Android中使用的首选布局是什么(为了更好的内存消耗等)?我没有答案,面试官告诉我这是相对布局.这是真的 ?对此有何解释?

  2. 告诉我你为更好的内存消耗做的一些做法?我看了一下,但似乎还有其他东西.因为面试官提到一些与静态变量相关的事情比较好.

  3. 如果Android需要内存,它会杀死服务还是活动?优先问题.我也没有找到任何人讨论这个问题.面试官说服务的一些事情比活动具有高优先级(??),因此活动是被杀死的组成部分.这是真的 ?任何进一步的资源或解释?

请分享您对此问题的所有知识或资源.

Luk*_*uth 9

一个接一个地回答:

NR.1

听起来不对.说它总是比任何其他布局更快RelativeLayout是错误的.布局"快"或"慢"的原因是计算所有孩子的位置和大小需要多长时间.因此,当您只显示15行,一行低于另一行时,肯定会更快(并且使用起来不那么麻烦).TextViewLinearLayout

一般来说,我建议使用最适合您情况的布局.

NR.2

偏好静态变量具有"优势",即它们仅被初始化(并且因此在内存中)仅一次.但这更像是一个设计决策,而不是一个表演决策.

你应该避免在内存中使用巨大的嵌套集合(例如List<List<HashMap<?,?>>),但这应该是常识.创建对象的事情是,如果你创建了许多对象并且没有对它们进行任何引用,那么它们将被垃圾收集.这将为您的应用程序增加运行时开销.

NR.3

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

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

只要服务已启动或客户端绑定服务,Android系统就会尝试保持托管服务的进程.当内存不足并且需要终止现有进程时, 托管服务的进程的优先级将是以下可能性中的较高者:[完整列表]

在活动中,列出以下内容:

活动基本上有四种状态:

  • 如果屏幕前景中的活动(位于堆栈顶部),则它处于活动状态或正在运行.

  • 如果活动失去焦点但仍然可见(即,新的非全尺寸或透明活动专注于您的活动),则会暂停活动.暂停的活动完全处于活动状态(它维护所有状态和成员信息并保持附加到窗口管理器),但可以在极低内存情况下被系统杀死.

  • 如果活动被另一个活动完全遮挡,则会停止活动.它仍然保留所有状态和成员信息,但是,它不再对用户可见,因此其窗口被隐藏,并且当其他地方需要内存时,它 通常会被系统杀死.

  • 如果某个活动暂停或停止,系统可以通过要求完成活动或仅删除其进程来从内存中删除活动.当它再次显示给用户时,必须完全重新启动并恢复到之前的状态.

因此,对于活动,它取决于当前状态被杀死的可能性.

结论

关于"MA Jackson"的优化报价:

我们在优化问题上遵循两条规则:
规则1:不要这样做.
规则2(仅限专家):不要这样做 - 也就是说,直到你有一个完全清晰且未经优化的解决方案.

不使用特定的平台功能,因为它"太慢"往往是一个坏主意.谷歌和甲骨文非常谨慎,他们的标准库尽可能优化.让专家担心这样的事情.