我正在开发一个Flutter插件(仅适用于Android),当设备连接到特定的蓝牙设备时,该插件会自动执行Flutter任务。
以下是插件在Android端的操作:
- 在清单文件中,注册一个监听蓝牙事件的
BroadcastReceiver
。
<receiver android:name=".BluetoothBroadcastReceiver">
<intent-filter>
<action android:name="android.bluetooth.device.action.ACL_CONNECTED" />
<action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" />
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
</intent-filter>
</receiver>
在我的“FlutterPlugin”类中,我初始化了一个
EventChannel
并设置了一个StreamHandler
。然后,我保留了在StreamHandler
的onListen
函数中提供的EventSink
的引用。这允许我将来自插件Android端的数据发送到插件Flutter端。class BluetoothPlugin : FlutterPlugin {
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
EventChannel(flutterPluginBinding.binaryMessenger, "event_channel_bluetooth_event")
.setStreamHandler(object : StreamHandler {
override fun onListen(arguments: Any?, eventSink: EventChannel.EventSink) {
BluetoothPlugin.eventSink = eventSink
}
override fun onCancel(arguments: Any?) {}
})
}
companion object {
var eventSink: EventChannel.EventSink? = null
}
}
- 在我的
BroadCastReceiver
的onReceive
函数中,我使用EventSink
通知Flutter插件的一次蓝牙事件发生了。
class BluetoothReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == BluetoothDevice.ACTION_ACL_CONNECTED) {
BluetoothPlugin.eventSink?.success("Bluetooth device is connected")
}
}
}
以下是我在 Flutter 插件的部分所做的事情:
- 我设置了一个
EventChannel
,用于监听传递给EventSink
的任何信息。
EventChannel('event_channel_bluetooth_event').receiveBroadcastStream().listen(
(data) {
// A bluetooth event happened
},
);
当应用在前台和后台运行时,一切都可以完美工作。但是,如果应用被杀掉,Android端插件中的
BluetoothBroadcastReceiver
无法向Flutter端插件传递任何数据,因为EventChannel
未初始化。我找不到任何方法在触发
BroadcastReceiver
时“唤醒”Flutter端插件(从而初始化EventChannel
)。有谁能帮我解决这个问题吗?
非常感谢您的帮助。