我有一个与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设备已断开连接?
答案 0 :(得分:0)
此行为似乎是由两个因素引起的:
!=
来比较两个UsbDevice
实例,但无法捕获引用同一设备的两个不同的类实例。所以我们需要做两件事:
UsbDevice#equals()
而不是相等运算符进行比较。