android - Flutter 插件:将数据从 Android BroadcastReceiver 发送到 Flutter 代码
问题描述
我正在开发一个 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
. 然后,我保留EventSink
了onListen
.StreamHandler
这允许我将数据从插件的 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
}
}
- 在
onReceive
my 的函数中BroadCastReceiver
,我使用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
它没有被初始化。
EventChannel
当BroadcastReceiver
触发时,我找不到任何方法来“唤醒”插件的 Flutter 端(并因此初始化)。
任何人都可以帮助我吗?
非常感谢您提前
解决方案
我终于在 Medium 上找到了一篇非常有趣的帖子,它解释了如何在应用程序终止后将数据从原生 (Android) 代码发送到 Dart:https ://medium.com/@chetan882777/initiating-calls-to-dart-from-带有flutter-plugin-7d46aed32c47的背景中的本机侧
推荐阅读
- r - 拆分/组向量中的R计数变量?
- apache - 如何通过共享相同的凭据来使用 htpasswd 保护多个域?
- javascript - 如何使用 vanilla javascript 动态添加 SVG 图标
- python - 如何使用 Python 从 Square 中的 create customer 方法中检索客户 ID
- azure - Azure AD B2C 重置密码电子邮件链接
- node.js - NodeJS'@azure/storage-blob':上传文件时如何设置 Blob 服务属性
- python - 在 Python 中创建异步函数
- javascript - 将表单详细信息保存到谷歌表格
- php - symfony2:未选中复选框的值未考虑在内
- java - 执行请求时出错 (loadMoreOutputTail): /execution/tailExecutionOutput?format=json in rundeck