2012-02-26 87 views
2

我有一个Android应用程序(活动),它也具有相应的服务。该服务由活动启动,即使活动停止,也应该连续运行。当活动再次启动时,它可以绑定到服务并进行查询。由于堆碎片导致服务崩溃的Android活动

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

但是......

我发现,无论是Dalvik虚拟机堆和本地堆是不可压制成型和规模因此不断增加,直到活动运行的内存和崩溃(即使总内存用量实际上是不变的,不会泄漏)。由于在创建过程中进行了大量分配,因此通过销毁和重新创建活动而加剧了这种情况。

这几乎可以保证活动在多次重新启动后都会崩溃。这并不会影响我,但是接下来发生的事情是该服务也会崩溃,因为它是同一应用程序的一部分。该服务包含一些重要数据,然后在崩溃期间丢失。

我对如何解决这个问题有什么建议感兴趣?

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

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

回答

0

这听起来像你的服务是保持参考你已停用的活动。您应该使用已启动的服务,而不是绑定的服务。请参阅Services指南主题了解有关差异以及如何使用每个差异的详细信息。

如果您想使用绑定服务(即出于某种原因您确实需要使用bindService()),那么请确保在您的活动死亡之前拨打unbindService()。请注意,当最后一个活动解除绑定时,服务将暂停。

+0

我需要的服务,既启动并装订成册,我的确叫unbindService()。我认为问题在于,因为服务仍在运行(这是打算的),那么当前堆仍保持活动状态。当活动重新启动时,它将使用与服务相同的堆,现在该服务严重分散。 – chris 2012-02-26 23:40:02

+1

@chris - 您可以通过在您的服务中指定['android:process'](http://developer.android.com/guide/topics/manifest/service-element.html#proc)值来测试您的假设表现。这将使服务与应用程序的活动分开进行。 – 2012-02-26 23:46:08

0

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

如果分配给该属性的名称以冒号(“:”),一个 新工艺,专用的应用程序,当它需要 创建和服务在该进程中运行。如果进程名称以 以小写字符开头,则该服务将在名称为 的全局进程中运行,前提是该进程有权这样做。

一个例子是在清单

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