0

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

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

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

我原以为一旦活动停止绑定服务就会死掉,但事实并非如此。

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

编辑

所以它接缝我的误解是,我假设程序将在最后一个非守护线程关闭后立即被清理,并且只要活动终止

我已经通过显式取消侦听线程并关闭onDestroy().

4

2 回答 2

1

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

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

我原以为一旦活动停止绑定服务就会死掉,但事实并非如此。

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

  • 所有调用bindService()都有对应的unbindService(), 和
  • 如果您startService()曾经为此正在运行的服务实例调用过,那么您调用stopService()或服务调用stopSelf()

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

还是我做错了什么?

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

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

于 2013-03-25T19:25:58.233 回答
0

Try using Stopservice() on onbackpressed()

于 2013-03-25T19:12:22.457 回答