Android活动导致堆碎片导致服务崩溃



我有一个Android应用程序(活动),它也有相应的服务。服务由活动启动,即使在活动停止时也应连续运行。当活动再次启动时,它可以绑定到服务并查询它

有时操作系统会破坏和创建活动。这不应该影响事情,只应该重新创建活动并能够再次绑定到服务。这基本上有效。

然而。。。

我发现Dalvik VM堆和本机堆都是非压缩的,因此大小不断增加,直到活动耗尽内存并崩溃(尽管总内存使用量实际上是恒定的,并且没有泄漏)。由于在创建过程中进行了大量分配,破坏和重新创建活动会大大加剧这种情况。

这在很大程度上保证了活动在多次重新启动后会崩溃。这并没有让我太烦恼,但后来发生的是,该服务也会崩溃,因为它是同一应用程序的一部分。该服务包含一些重要数据,这些数据在崩溃过程中丢失。

关于如何解决这个问题,我有什么建议吗?

有没有一种方法可以将服务与活动分开(这样当活动崩溃时,它就不会同时使服务崩溃),但仍然将服务和活动放在同一个应用程序中?

我可以保存服务数据,但这需要对数据库进行多次访问,不利于节省电池。

听起来您的服务正在维护对已失效活动的引用。您应该使用已启动的服务,而不是绑定的服务。有关差异以及如何使用每种差异的详细信息,请参阅服务上的指南主题。

如果您想使用绑定服务(也就是说,出于某种原因,您确实需要使用bindService()),那么一定要在活动终止之前调用unbindService()。请注意,当最后一个活动解除绑定时,服务将暂停。

您应该在清单中指定服务"进程名称",您可以用":"或小写字符开头。引用:http://developer.android.com/guide/topics/manifest/service-element.html

如果分配给此属性的名称以冒号(":")开头,则在需要时创建应用程序专用的新流程并且服务在该过程中运行。如果进程名称以小写字符,该服务将在该名称,前提是它有这样做的许可。

清单就是一个例子

 <service android:name=".services.OfficeService"
            android:process=":myProcess" />

最新更新