如何将Android Service中广播接收器的蓝牙设备数据传递给AIDL Stub实现类
实现方案
你可以按照以下步骤完成数据传递:
- 首先在
MyService中提前声明binder成员变量,你当前的代码只在onCreate中赋值,没有提前定义变量 - 在
MyServiceImpl中新增公开方法,用于接收配对完成的蓝牙设备,你可以在该方法中实现自己的业务逻辑,比如更新内部的btConnection信息、触发AIDL回调等 - 广播接收器是
MyService的内部类,可以直接访问binder实例,在配对完成的分支调用上述新增方法传入设备即可
修改后的完整代码示例
class MyService : Service() { // 提前声明binder成员变量 private lateinit var binder: MyServiceImpl override fun onBind(intent: Intent): IBinder { return binder } override fun onUnbind(intent: Intent?): Boolean { return super.onUnbind(intent) } override fun onCreate() { binder = MyServiceImpl() filterNewDevices() } override fun onDestroy() { super.onDestroy() // 注销广播避免内存泄露 unregisterReceiver(mBroadcastReceiverBond) } private fun filterNewDevices() { val filter = IntentFilter() filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED) registerReceiver(mBroadcastReceiverBond, filter) } private val mBroadcastReceiverBond: BroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent) { if (intent.action == BluetoothDevice.ACTION_BOND_STATE_CHANGED) { val device = intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE) if (device?.bondState == BluetoothDevice.BOND_BONDED) { // 直接调用binder的方法传入设备 binder.onDeviceBonded(device) } if (device?.bondState == BluetoothDevice.BOND_BONDING) { } if (device?.bondState == BluetoothDevice.BOND_NONE) { } } } } class MyServiceImpl : IBluetoothConnection.Stub(), IBinder { private lateinit var btConnection: BTConnection override fun registerUuid(name : String?, uuid : String?, connectionId : Int, btDevice : BluetoothDevice?) { btConnection = BTConnection(this) btConnection.initialize(name!!, UUID.fromString(uuid), connectionId, btDevice) } // 新增接收配对设备的公开方法 fun onDeviceBonded(device: BluetoothDevice) { // 在这里处理你的业务逻辑,比如更新btConnection的设备信息、触发AIDL回调等 // 示例:如果已经初始化过btConnection,可以直接调用它的方法更新设备 if (::btConnection.isInitialized) { btConnection.updateBondedDevice(device) } } } }
注意事项
- 安卓12及以上系统需要主动申请
BLUETOOTH_CONNECT权限,否则无法正常获取蓝牙设备信息 - 如果需要通过AIDL回调通知客户端配对完成,注意AIDL方法默认在服务端的Binder线程池运行,涉及UI操作需要切换到主线程处理
- 如果有多个设备配对的场景,你可以在
MyServiceImpl中维护一个已配对设备的集合,按需存储
内容的提问来源于stack exchange,提问作者RKVM
相关产品推荐
相关产品推荐

