2

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

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

然而...

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

这几乎保证了该活动将在多次重新启动后崩溃。这并没有让我很困扰,但是随后发生的事情是该服务也崩溃了,因为它是同一个应用程序的一部分。该服务包含一些重要数据,然后在崩溃期间丢失。

我对如何解决这个问题的任何建议感兴趣?

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

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

4

2 回答 2

0

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

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

于 2012-02-26T23:16:50.660 回答
0

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

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

清单中有一个例子

 <service android:name=".services.OfficeService"
            android:process=":myProcess" />
于 2014-11-11T11:08:46.107 回答