Android网络服务发现了“超时”该怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (29)

我正在使用Android上的网络服务发现(NSD)在设备上宣传REST服务器。我的REST服务器被包装在android.app.Service的一个实例中。

似乎在开发过程中,当我通过Eclipse推送我的应用程序的新实例时,无法保证服务onDestroy将被调用。这意味着我的服务仍在广告中,下次服务开始时,我将收到我的服务(1)我的服务(2)等。

我知道NSD会修改服务名称来创建一个独特的实例。我的问题是:

  1. 如果广告服务不再存在,将被删除的预计超时时间是多少?
  2. 有没有办法确保我onDestroy在推送应用程序的新实例时被调用?这种情况是否类似于用户在安装我的应用程序更新时可能遇到的情况?即onDestroy保证在正在运行的应用程序关闭时调用,以便可以安装该应用程序的新版本?
  3. 我的应用程序中有没有办法检测旧注册并将其删除?
提问于
用户回答回答于

你可以执行以下操作:

  • 在您的服务onCreate()方法中,生成一个随机数或时间戳并将其保存到本地字段; 这将是服务ID
  • BroadcastReceiver在你的注册一个自定义Service,它会对你的自定义行动作出反应
  • 在每次Service创作时,发送包含您自定义动作的广播和当前的Service ID作为额外的参数
  • 对于每个激活Service,注册BroadcastReceiver将被触发; 现在将收到的ID与当前服务的ID进行比较
    • 如果它们不同,则调用 stopSelf()

用户回答回答于

首先,在AOSP问题跟踪器中存在一个公开的问题来跟踪这个问题。提交该bug的人可以在所有Android 4.x版本中重新生成,但未使用5.x进行测试。

我通过重新启动,启动我的应用程序,然后通过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

扫码关注云+社区