作为一名刚接触Android的开发人员,我想我可能误解了绑定服务。
我已经创建了一个服务来包装对服务器的访问。作为此服务的一部分,该服务正在侦听多播地址,以识别本地网络上的设备何时出现和消失。
但是由于启动了多个服务实例,我遇到了问题。当活动关闭(使用后退按钮)然后不久重新打开时会发生这种情况。结果是服务无法绑定到本地端口,因此无法侦听多播。
我曾经想过,一旦活动停止,绑定的服务就会消失,但事实并非如此。
我是否误解了绑定的服务,或者我做错了什么?
修改
所以我接受了我的误解,就是我假设一旦最后一个非守护程序线程被关闭就会清理程序,并且一旦活动终止就会立即清理。< / p>
我通过明确取消监听线程并关闭onDestroy()
中的套接字来解决这个问题。
答案 0 :(得分:1)
但是由于有多个服务实例已启动,我遇到了问题
在您的流程中,任何时候都只会有零个或一个给定服务类的实例。
我曾经想过,一旦活动停止,绑定的服务就会消失,但事实并非如此。
该服务将在以下某个时间销毁:
bindService()
的所有来电都有相应的unbindService()
和startService()
,则致电stopService()
或服务电话stopSelf()
服务被销毁的确切时间是不确定的,尽管通常它与我所看到的相当快。但是,我不能排除第二个活动实例在销毁之前绑定到服务的可能性,从而防止它被销毁。
或者我做错了什么?
也许您在销毁服务时没有正确清理多播套接字,或者当您从先前的绑定中打开套接字时,可能正在尝试打开套接字。
我不清楚为什么你在这里使用绑定模式。就个人而言,通常情况下,我发现它比它的价值更麻烦。也许考虑使用命令模式,通过startService()
向服务发送命令,并通过stopService()
或stopSelf()
停止服务。
答案 1 :(得分:0)
尝试在onbackpressed()
上使用Stopservice()