У меня есть приложение, которое взаимодействует с устройством USB OTG:
IntentFilter
в манифесте.onCreate()
заполняет IntentFilter
, добавляя действия, на которые служба должна реагировать при запуске, включая UsbManager.ACTION_USB_DEVICE_DETACHED
. Добавление дополнительных выходных данных отладки говорит мне, что метод запускается, когда я ожидаю этого, т.е. IntentFilter
заполняется, когда я регистрирую получателя.onStartCommand()
вызывает внутренний метод, который регистрирует BroadcastReceiver
для фильтра намерений (если служба была запущена с намерением запуска и имеет необходимые разрешения - иначе служба завершается).UsbManager.ACTION_USB_DEVICE_DETACHED
и устройство, о котором сообщается, является тем, которое в данный момент подключено, оно останавливает службу.Теперь, если я подключаю устройство USB, я получаю подтверждение, и служба запускается, и когда я отключаю устройство, служба снова останавливается. Все идет нормально.
Однако в некоторых случаях служба продолжает работать даже после отключения устройства. Я заметил, что это всегда происходит, когда основное действие было открыто, когда я подключил устройство. Журналы показывают, что сервис никогда не получает широковещательную UsbManager.ACTION_USB_DEVICE_DETACHED
.
Выполняя дальнейшие тесты (откройте основное действие и отойдите от него перед подключением устройства), я обнаружил доказательства того, что по какой-то причине может быть два экземпляра службы.
Что здесь происходит, и как я могу надежно определить, что USB-устройство было отключено?
Такое поведение вызвано двумя факторами:
!=
Для сравнения двух экземпляров UsbDevice
, который не может перехватить два разных экземпляра класса, ссылающихся на одно и то же устройство.Итак, нам нужно сделать две вещи:
UsbDevice#equals()
вместо оператора равенства для сравнения.