【发布时间】:2021-11-08 19:54:47
【问题描述】:
我正在开发一个 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
},
);
当应用程序运行时(在前台和后台),一切都运行良好。
但是,如果应用程序被杀死,BluetoothBroadcastReceiver(在插件的 Android 端)无法将任何数据传递到插件的 Flutter 端,因为 EventChannel 未初始化。
当BroadcastReceiver 被触发时,我找不到任何方法来“唤醒”插件的 Flutter 端(从而初始化EventChannel)。
谁能帮我解决这个问题?
非常感谢您
【问题讨论】:
标签: android flutter broadcastreceiver flutter-plugin