我有一个Android应用(活动),它也有相应的服务。该服务由活动启动,即使活动停止也应该连续运行。当活动再次启动时,它可以绑定到服务并进行查询。
有时活动会被操作系统破坏并创建。这不应该影响事情,应该重新创建活动,并能够再次绑定到服务。这基本上有效。
...然而
我发现Dalvik VM堆和本机堆都是非压缩的,因此不断增加大小,直到活动耗尽内存并崩溃(即使总内存使用量实际上是不变的而且没有泄漏)。由于在创建过程中完成了大量的分配,因此破坏和重新创建活动会加剧这种情况。
这非常谨慎,经过多次重启后,活动将崩溃。这并不会让我感到烦恼,但接下来发生的事情是该服务也崩溃了,因为它是同一个应用程序的一部分。该服务包含一些重要数据,然后在崩溃期间丢失。
我对如何解决这个问题的任何建议感兴趣?
有没有办法将服务与活动分开(这样当活动崩溃时它也不会使服务崩溃),但仍然在同一个应用程序中有服务和活动?
我可以保留服务数据,但这需要对数据库进行多次访问,并且不利于节省电池。
答案 0 :(得分:0)
听起来您的服务正在维护您已解散活动的参考。您应该使用已启动的服务,而不是绑定的服务。有关差异以及如何使用每个差异的详细信息,请参阅Services上的指南主题。
如果您想使用绑定服务(也就是说,出于某种原因,您确实需要使用bindService()
),请务必在活动终止前致电unbindService()
。请注意,当最后一个活动解除绑定时,服务将暂停。
答案 1 :(得分:0)
您应该指定服务"流程名称"在清单中,您可以使用':'来启动名称。或小写字符。引用:http://developer.android.com/guide/topics/manifest/service-element.html
如果分配给此属性的名称以冒号(':')开头,则a 在需要时创建应用程序专用的新进程 并且该服务在该过程中运行。如果进程名称以 一个小写字符,该服务将在全局进程中运行 该名称,只要它有权这样做。
示例将在清单
中 <service android:name=".services.OfficeService"
android:process=":myProcess" />