0

我发现这篇非常老的帖子基本上总结了我的问题:

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/QsSjuB62Kow

考虑到 OP 指出在 1.5 版之前没有发生这种情况,该线程的结果(hackbod/mark/romain 答案)对我来说似乎有些不满意。

长与短:

Activity starts service.
finish is called on Activity.
Application's memory allocation remains constant
(despite views being garbage collected either eventually or manually)

我提出这个的原因。

我有一个通过广播接收器在启动时启动的服务,使用大约 5 MB。

当我的活动开始时,内存分配会跳转到 40MB(我有很多视图正在进行,所以这是意料之中的)。活动结束,服务仍在运行(按设计)。内存分配仍然很高,我认为这是一个问题。

在这个活动中,清空所有内容onDestroy,遍历所有视图和数组并清空,System.gc()(是的,我知道这只是建议),强制 GC,也不打开尽可能多的应用程序以使总设备可用内存低于 20% 对此分配没有任何作用. 即使没有剩余的活动痕迹(在 MAT 中花费了大量时间),它仍保持在 40MB 不变。

我怎样才能让这个分配从 40MB 降到 5MB?或者这不是Android的做事方式吗?

我采取了极端措施来确保上下文或对象不会从活动泄漏到服务/等(事实上,除了通过共享首选项之外,两者之间没有任何引用)。如果您在原始帖子中看到极其基本的示例,我想这将有助于阐明这种情况。

如果我将服务与活动分离,或者只运行服务或只运行活动,但从不同时运行两者,那么内存分配是可预测的。服务从不消耗超过 5MB,活动从不超过 35MB。并且当调用任何一个 onDestroy 时,内存不再显示为为每个分配的。

我在 Android 2.3 和 4.x 中都注意到了相同的行为。

也许我在这里遗漏了一些基本的东西,或者这只是一个愚蠢的问题。

4

1 回答 1

1

我在 MAT 中倾注了几个小时,正如 Andrew 所建议的那样,只要服务还在运行,Activity 的一些资源就会一直存在。

对于任何为此苦苦挣扎的人,我找到了一个便宜的简单解决方案。

只需在单独的进程中生成您的服务。

这个“排序”成功了,现在当我的 ActivityonDestroy被调用时,Activity 使用的内存(在我的情况下为 35MB)被移动到“缓存进程”并且活动运行的服务返回到以前的状态(在我的情况下5MB)。

在您的清单中:

android:process属性是这里的关键。更多关于这里:

http://developer.android.com/guide/topics/manifest/service-element.html

于 2013-01-30T17:05:35.410 回答