绑定服务的多个实例 - 绑定服务在应用程序结束后仍然存在

时间:2013-03-25 19:07:24

标签: java android

作为一名刚接触Android的开发人员,我想我可能误解了绑定服务。

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

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

我曾经想过,一旦活动停止,绑定的服务就会消失,但事实并非如此。

我是否误解了绑定的服务,或者我做错了什么?

修改

所以我接受了我的误解,就是我假设一旦最后一个非守护程序线程被关闭就会清理程序,并且一旦活动终止就会立即清理。< / p>

我通过明确取消监听线程并关闭onDestroy()中的套接字来解决这个问题。

2 个答案:

答案 0 :(得分:1)

  

但是由于有多个服务实例已启动,我遇到了问题

在您的流程中,任何时候都只会有零个或一个给定服务类的实例。

  

我曾经想过,一旦活动停止,绑定的服务就会消失,但事实并非如此。

该服务将在以下某个时间销毁:

  • bindService()的所有来电都有相应的unbindService()
  • 如果您为此正在运行的服务实例致电startService(),则致电stopService()或服务电话stopSelf()

服务被销毁的确切时间是不确定的,尽管通常它与我所看到的相当快。但是,我不能排除第二个活动实例在销毁之前绑定到服务的可能性,从而防止它被销毁。

  

或者我做错了什么?

也许您在销毁服务时没有正确清理多播套接字,或者当您从先前的绑定中打开套接字时,可能正在尝试打开套接字。

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

答案 1 :(得分:0)

尝试在onbackpressed()

上使用Stopservice()