我发现这篇非常老的帖子基本上总结了我的问题:
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 中都注意到了相同的行为。
也许我在这里遗漏了一些基本的东西,或者这只是一个愚蠢的问题。