无尽的活动计划

时间:2011-10-27 13:44:12

标签: android memory android-activity native lifecycle

在我的应用程序中,有能力拥有无尽的活动堆栈。场景是您从一个用户的页面开始,该页面包含该用户的“朋友”的人员列表。然后你可以点击一个朋友去他们的页面,看起来就像上一个页面,然后你可以点击另一个朋友去他们的页面,依此类推......

我面临的一个大问题是无尽的原生堆。我相信每次视图膨胀时我都会添加到这个堆中。经过几次迭代后,我一直都会遇到OOM错误,所以我必须找到某种解决方案。诀窍是,我想保持最后几个活动,以便导航一些历史。

我能想出的最好的方法是监控活动堆栈,然后在达到某个点时开始完成活动。这听起来像是一个可靠的方法,还是更进一步,任何人都可以指出我对该方法或其他方法的实现?

由于

编辑:

堆栈非常简单。点击listrow(朋友),转到他们的页面。这是使用正常的startActivity调用,意图使用您所在的同一页面,并使用用户ID的额外intent,然后调用数据库或远程api调用以获取用户的数据。

另外,为了跟进Dalvik vs Native,我在导航过程中经常检查meminfo转储。我保持dalvik堆尽可能小,清理onStop中的资源。本机堆增长得更快。我在任何地方都没有对位图的硬性引用,但屏幕上有很多可用的通道。这些drawables会导致android最终杀死我的活动吗?最好的我可以告诉他们只是导致OOM,而我的任何活动都没有被预防性地销毁。

如果我可以手动销毁我的活动而不是仅停止它们(就像Android声称在内存不足时那样做),并且在保存状态的情况下将被破坏的活动保留在堆栈上,这将是理想的。

再次编辑:

另一个关键是这些活动会将其他活动混入其中,例如

用户 - >用户 - >活动a - >用户 - >活动b - >用户

这就是为什么我想要使用内置堆栈,所以我知道什么时候我必须去用户活动,什么时候不去。

2 个答案:

答案 0 :(得分:1)

如何进行此活动singleInstance,拦截KeyEvent.KEYCODE_BACK,为此活动构建自己的后退按钮堆栈

我在这里做了一些例子:

http://esilo.pl/selvin/endlessactivity.zip

答案 1 :(得分:0)

我认为您遇到的OOM问题与您打开的活动数量无关。随着内存压力的增加,Android应该在后台销毁任何旧活动。然后,当用户通过任务堆栈返回时,将重新创建这些活动。

您是否使用了MAT(内存分析器工具)等工具来检查在应用程序运行时分配的内容。我怀疑你可能有内存泄漏,或者你的内存分配可能需要更聪明。