主要通过解析一段代码来讲解BroadcastReceiver。
//创建匿名内部类
private final BroadcastReceiver permissionReceiver = new BroadcastReceiver() {
/*这是 BroadcastReceiver 中的一个抽象方法,在接收到广播时会被调用。onReceive 方法接收两个参数:Context 和 Intent,分别表示广播的上下文和内容。*/
@Override
public void onReceive(Context context, Intent intent) {
/*这行代码检查接收到的广播是否是 USB 设备权限请求的广播事件。ACTION_USB_PERMISSION 是一个常量,表示 USB 设备权限请求的广播动作,确保线程安全。处理 USB 设备权限请求的逻辑:在这段代码中,permissionReceiver 广播接收器处理了 USB 设备权限请求的逻辑。当收到 USB 设备权限请求的广播时,会执行 onReceive 方法。在该方法中,会尝试从 Intent 中获取附加的 USB 设备对象,并根据权限是否被授予执行相应的操作。*/
/*多线程环境下的问题:
由于 permissionReceiver 是在主线程中执行的,如果多个 USB 设备权限请求的广播同时到达,并且同时被处理,就可能导致竞态条件。特别是在访问共享资源 device 变量时,可能会出现数据不一致或其他线程安全问题。*/
if (ACTION_USB_PERMISSION.equals(intent.getAction())) {
/*这是一个同步块,确保在处理接收到的广播时只有一个线程可以访问关键代码部分。在这段代码中使用同步块的主要原因是为了保证 device 变量的正确性。*/
synchronized (this) {
/*这行代码从接收到的广播 Intent 中获取附加的 USB 设备对象。UsbManager.EXTRA_DEVICE 是一个常量,表示 USB 设备对象。getParcelableExtra 方法用于获取附加在 Intent 中的 Parcelable 类型对象。*/
UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
/*这行代码检查 USB 设备权限是否被授予。UsbManager.EXTRA_PERMISSION_GRANTED 是一个常量,表示 USB 设备权限是否被授予。getBooleanExtra 方法用于获取附加在 Intent 中的布尔类型数据,默认值为 false。*/
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if (device != null) {
// 向 USB 设备发送 AT 指令
sendATCommand(device);
}
} else {
showToast("用户拒绝了 USB 设备的访问权限");
}
}
}
}
};