Прежде всего, это открыть отслеживание этой проблемы в системе отслеживания проблем 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 убивает работающее приложение без его вызова. Было бы интересно посмотреть, будут ли обновления через App Store вести себя так же или более изящно закрывать работающее приложение.
- Не проблема в 5.x, так как он их сразу убивает. В 4.x нет возможности удалить старые регистрации, так как вы немедленно теряете прослушиватель регистрации.
person
Trevor Carothers
schedule
11.08.2015
onDestroy
, попробуйте использовать методstopService
. - person Philip Liberato   schedule 23.03.2014onDestroy
не будет вызываться, если/когда пользователь обновит версию? - person Kerry   schedule 23.03.2014