首先,在AOSP问题跟踪器上有一个追踪此问题的
开放问题。提交错误的人可以在所有Android 4.x版本中重现此问题,但未测试5.x。
术语简要说明:
- NsdManager - Android应用程序与之交互以注册其NSD服务并发现其他NSD服务的类。NsdManager实际上只是建立与NsdService的异步连接的外壳。
- NsdService(com.android.server.NsdService) - 隐藏的Android系统服务,可以从多个客户端进行连接。执行创建和管理NSD服务以及向客户端应用程序通信事件的所有繁重工作和簿记。
- NSD服务 - NsdService代表您创建的服务,它在网络上宣传您的应用程序的存在。
我刚刚在5.1上测试了此问题,并已解决(从源代码来看,修复已进入5.0)。我创建了一个简单的应用程序,仅注册NsdService并记录任何重要事件(包括onCreate、onResume、onPause和onDestroy的生命周期事件)。通过重新启动、启动我的应用程序,然后通过Android Studio重新安装,我得到了以下日志。
W/SimpleNsdActivity(14379): onCreate
D/NsdService( 3516): startMDnsDaemon
D/NsdService( 3516): New client listening to asynchronous messages
D/NsdService( 3516): New client, channel: com.android.internal.util.AsyncChannel
@3c114a11 messenger: android.os.Messenger@3213e776
D/NsdService( 3516): Register service
D/NsdService( 3516): registerService: 2 name: NsdTest, type: _http._tcp., host:
null, port: 1349
W/SimpleNsdActivity(14379): onResume
D/NsdService( 3516): Register 1 2
W/SimpleNsdActivity(14379): onServiceRegistered as NsdTest
D/NsdService( 3516): SERVICE_REGISTERED Raw: 606 2 "NsdTest"
D/NsdService( 3516): Client disconnected
D/NsdService( 3516): Terminating client-ID 1 global-ID 2 type 393225
D/NsdService( 3516): unregisterService: 2
D/NsdService( 3516): stopMDnsDaemon
W/SimpleNsdActivity(15729): onCreate
D/NsdService( 3516): startMDnsDaemon
D/NsdService( 3516): New client listening to asynchronous messages
D/NsdService( 3516): New client, channel: com.android.internal.util.AsyncChannel
@38bace07 messenger: android.os.Messenger@26d8cd5d
D/NsdService( 3516): Register service
D/NsdService( 3516): registerService: 3 name: NsdTest, type: _http._tcp., host:
null, port: 1349
D/NsdService( 3516): Register 1 3
W/SimpleNsdActivity(15729): onResume
D/NsdService( 3516): SERVICE_REGISTERED Raw: 606 3 "NsdTest"
W/SimpleNsdActivity(15729): onServiceRegistered as NsdTest
您可以看到,
onPause()
和
onDestroy()
都没有被调用,因此我的应用程序没有显式地清理NSD服务。NsdService会在检测到与客户端的AsyncChannel终止时进行适当的清理。您可以通过查看
这里的源代码来更深入地了解NsdService日志。
总结一下,我将回答提示中的问题:
- 对于4.x版本,没有超时时间,它会一直保持到重新启动。对于5.x版本,NsdService会在您的应用程序断开连接时关闭NSD服务。
- 无法保证调用onDestroy(),更深入的解释在这里。通过Android Studio安装可能会在不调用该方法的情况下杀死正在运行的应用程序。有趣的是,看看通过应用商店的更新是否以同样的方式或更优雅地关闭正在运行的应用程序。
- 在5.x中不存在这个问题,因为它会立即终止它们。在4.x中,由于您立即失去注册侦听器,所以没有办法删除旧的注册。
onDestroy
方法被调用,可以尝试使用stopService
方法。 - Philip LiberatoonDestroy
是否有可能不被调用? - Kerry