Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 绑定服务的多个实例—绑定服务在应用程序结束后仍然存在_Java_Android - Fatal编程技术网

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

Java 绑定服务的多个实例—绑定服务在应用程序结束后仍然存在,java,android,Java,Android,作为一名android新手,我想我可能误解了绑定服务 我创建了一个服务来包装对服务器的访问。作为该服务的一部分,该服务正在侦听多播地址,以识别本地网络上的设备何时出现和消失 但是,由于启动了多个服务实例,我遇到了一些问题。当活动关闭(使用“上一步”按钮)后不久重新打开时,会发生这种情况。其结果是服务无法绑定到本地端口,因此无法侦听多播 我原以为一旦活动停止,绑定服务就会死掉,但事实似乎并非如此 我是否误解了绑定服务,或者我是否做错了其他事情 编辑 因此,我的误解是,我假设程序将在最后一个非守护进

作为一名android新手,我想我可能误解了绑定服务

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

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

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

我是否误解了绑定服务,或者我是否做错了其他事情

编辑

因此,我的误解是,我假设程序将在最后一个非守护进程线程关闭时立即清理,而这将在活动终止时立即清理

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

尝试在onbackpressed()上使用Stopservice()

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

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

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

服务将在以下时间后销毁:

  • bindService()
    的所有调用都有相应的
    unbindService()
    ,并且
  • 如果为此正在运行的服务实例调用了
    startService()
    ,则调用
    stopService()
    或服务调用
    stopSelf()
服务被销毁的确切时间是不确定的,尽管从我所看到的情况来看,通常是相当快的。但是,我不能排除这样的可能性,即您的第二个活动实例在服务被销毁之前绑定到该服务,从而防止它被销毁

还是我做错了什么

当服务被破坏时,您可能没有正确清理多播套接字,或者您正在尝试打开套接字,而该套接字已经从以前的绑定打开


我不完全清楚为什么在这里使用绑定模式。就我个人而言,通常情况下,我觉得这比它的价值更麻烦。也许考虑使用命令模式,通过<代码>启动服务()/代码>向服务发送命令,并通过<代码>停止服务()/<代码>或<代码> StSelff()/<代码>停止服务。也就是说,您在服务中多次启动线程。(线程也可以继续运行而不被其他代码引用,它们不会被神奇地垃圾收集)
stopService()
不会与绑定模式一起使用。是的,谢谢。看来要过一段时间了。
ondestory()
方法更加快捷。