我在使用usb api时遇到了麻烦。我正在尝试使用广播接收器来接收ACTION_USB_DEVICE_ATTACHED意图的广播,但是它无法正常工作。
为了澄清,我之前已经通过清单文件成功实现过这一点,但是这会创建一个新的活动(并添加到后退堆栈),我发现这很不理想,尤其是考虑到我的应用程序性质(终端)。
我猜测设备过滤器XML元数据需要添加到意图过滤器中,但我不知道该如何操作。
欢迎任何反馈!
编辑- 以下是一些代码。 这是来自清单文件的关键部分。请注意,为了让动态注册的BroadcastReceiver捕获意图,必须将意图过滤器注释掉。
这是广播接收器的声明。
我在清单文件中避免声明接收器,因为我不确定在那里使用的惯例(接收器是独立于任何活动存在的)。我想知道是否正确地认为,即使在清单文件中声明了接收器,只要应用程序在运行,它就会一直运行,或者它只能在前台运行?如果有相关文献,敬请赐教。
后来,我通过给活动设置“singleTop”启动模式并实现onNewIntent()方法来解决了这个问题。这样既可以实现我想要的行为,也允许在没有运行活动的情况下启动应用程序(使用清单文件)。这是我的最终目标。然而,我真的希望能理解这种行为,并对解决方案保持高度关注!
进一步编辑:我的调试设备是三星Galaxy S3。我没有改变ROM。
为了澄清,我之前已经通过清单文件成功实现过这一点,但是这会创建一个新的活动(并添加到后退堆栈),我发现这很不理想,尤其是考虑到我的应用程序性质(终端)。
我猜测设备过滤器XML元数据需要添加到意图过滤器中,但我不知道该如何操作。
欢迎任何反馈!
编辑- 以下是一些代码。 这是来自清单文件的关键部分。请注意,为了让动态注册的BroadcastReceiver捕获意图,必须将意图过滤器注释掉。
//<intent-filter>
// <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
// <category android:name="android.intent.category.DEFAULT" />
//</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter"/>
这里是连接接收器的代码
//register for attachment
IntentFilter attachedFilter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
registerReceiver(mUsbAttachedReceiver, attachedFilter);
这是广播接收器的声明。
private final BroadcastReceiver mUsbAttachedReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
//BREAKPOINT HERE IS NEVER HIT
String action = intent.getAction();
showDebugToast(action);
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
synchronized(this)
{
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (device != null){
getDevicePermission(device);
}
}
}
}
};
我在清单文件中避免声明接收器,因为我不确定在那里使用的惯例(接收器是独立于任何活动存在的)。我想知道是否正确地认为,即使在清单文件中声明了接收器,只要应用程序在运行,它就会一直运行,或者它只能在前台运行?如果有相关文献,敬请赐教。
后来,我通过给活动设置“singleTop”启动模式并实现onNewIntent()方法来解决了这个问题。这样既可以实现我想要的行为,也允许在没有运行活动的情况下启动应用程序(使用清单文件)。这是我的最终目标。然而,我真的希望能理解这种行为,并对解决方案保持高度关注!
进一步编辑:我的调试设备是三星Galaxy S3。我没有改变ROM。