2013-03-25 29 views
0

作为一个刚接触android的开发人员,我想我可能误解了绑定服务。绑定服务的多个实例 - 绑定服务在应用程序的末端生存

我创建了一个服务来包装对服务器的访问。作为此服务的一部分,该服务正在侦听多播地址以识别本地网络上的设备何时出现和消失。

但是,由于存在多个启动服务实例,我遇到了问题。这种情况发生在活动关闭时(使用后退按钮),然后很快重新开启。其效果是服务无法绑定到本地端口,因此无法侦听多播。

我曾经认为一旦活动停止,绑定的服务就会死亡,但看起来并非如此。

我误解了绑定服务还是我在做其他错误?

编辑

所以接缝我的误解是,我会认为该方案将尽快清理作为最后一个非守护线程关闭并会尽快终止活动是

我已通过显式取消侦听线程并关闭onDestroy()中的套接字来解决此问题。

+0

服务就像单身人士:http://stackoverflow.com/a/3692966/995891 - 在你的实现中有其他东西阻塞了端口,也就是说你在你的服务中多次启动你的线程。 (线程可以继续运行而不被其他代码引用,它们不会被神奇地收集到) – zapl 2013-03-25 19:21:17

回答

1

但是我有问题,是由于那里是服务的多个实例启动

将有永远只能是零个或一个实例在您的流程中随时运行一个给定的服务类。

我曾经认为绑定的服务会在活动停止后死亡,但看起来并非如此。

的服务将被销毁一段时间后:

  • bindService()所有调用其相应的unbindService()已经并
  • 如果你叫startService()曾经为这个正在运行的服务实例,调用stopService()或服务电话stopSelf()

被销毁的服务的确切时间是ind尽管通常情况下,从我所见过的情况来看,它们相当快。不过,我不能排除这种可能性,尽管如此,您的第二个活动实例会在服务被销毁之前绑定到服务,从而防止它被销毁。

还是我在做别的事情?

也许你在服务被销毁时没有正确地清理你的多路广播套接字,或者你可能试图打开套接字,当它已经从上一个绑定打开时。

我不完全清楚你为什么在这里使用绑定模式。就我个人而言,通常情况下,我觉得它比它的价值更麻烦。也许可以考虑使用命令模式,通过startService()向服务发送命令并通过stopService()stopSelf()停止服务。

+0

非常感谢。看起来好像有一段时间了。 'onDestroy()'方法更加及时。 – 2013-03-25 22:18:16

0

尝试使用Stopservice()onbackpressed()

+1

'stopService()'不用于绑定模式。 – CommonsWare 2013-03-25 19:21:20