У меня есть приложение, которое взаимодействует с устройством USB OTG:
- Когда подключается устройство USB, запускается вспомогательная операция для отображения диалогового окна подтверждения Android.Это делается с помощью
IntentFilter
в манифесте. - Вспомогательное действие запускает службу, запускаемую отправкой ей специфического для приложения намерения.
- Метод
onCreate()
службы заполняет IntentFilter
, добавляя действия, на которые служба должна реагировать при запуске, включая UsbManager.ACTION_USB_DEVICE_DETACHED
.Добавление дополнительных выходных данных отладки говорит мне, что метод запускается, когда я ожидаю этого, то есть IntentFilter
заполняется, когда я регистрирую получателя. - Метод
onStartCommand()
службы вызывает внутренний метод, который регистрирует BroadcastReceiver
для фильтра намерений (если служба была запущена с начальным намерением и имеет необходимые разрешения - в противном случае служба завершается). - Когда получатель получает
UsbManager.ACTION_USB_DEVICE_DETACHED
, а сообщаемое устройство является тем, которое в данный момент является текущимподключен, останавливает службу. - Существует также основное действие, которое не связано с обработкой USB-устройства.
- Служба также вызывается по другим причинам, особенно когда зарядное устройствосвязано.В этом случае служба ищет устройство Bluetooth (если устройство USB уже подключено, что указывается, что элемент экземпляра службы не равен NULL, оно пропускается и служба завершается).
Теперь, если я подключаю устройство USB, я получаю подтверждение, и служба запускается, и когда я отключаю устройство, служба снова останавливается.Пока все хорошо.
Однако в некоторых случаях служба продолжает работать даже после отключения устройства.Я заметил, что это всегда происходит, когда основное действие было открыто, когда я подключил устройство.Журналы показывают, что служба никогда не получает UsbManager.ACTION_USB_DEVICE_DETACHED
трансляцию .
Во время проведения дальнейших тестов (откройте основное действие и отойдите от него перед подключением устройства), я обнаружил доказательства того, что Возможно, по какой-то причине два экземпляра службы запущены .
Что здесь происходит и как я могу надежно определить, что USB-устройство было отключено?