BasicMessageChannel是一种能够在native与flutter之间互相发送消息的通信方式,它支持数据类型最多,使用范围最广。EventChannel与MethodChannel的应用场景可以使用BasicMessageChannel来实现,但BasicMessageChannel的应用场景就不一定能够使用EventChannel与MethodChannel来实现。该方式有返回值。它的使用方式如下。
首先来看Android代码的实现。
- //这里支持的数据类型为String。
- public class BasicMessageChannelPlugin implements BasicMessageChannel.MessageHandler<String> {
- private Activity activity;
- private BasicMessageChannel<String> messageChannel;
- static BasicMessageChannelPlugin registerWith(FlutterView flutterView) {
- return new BasicMessageChannelPlugin(flutterView);
- }
- private BasicMessageChannelPlugin(FlutterView flutterView) {
- this.activity = (Activity) flutterView.getContext();
- this.messageChannel = new BasicMessageChannel<String>(flutterView, "BasicMessageChannelPlugin", StringCodec.INSTANCE);
- messageChannel.setMessageHandler(this);
- }
- @Override
- public void onMessage(String s, BasicMessageChannel.Reply<String> reply) {
- reply.reply("BasicMessageChannelPlugin收到:" + s);
- if (activity instanceof FlutterAppActivity) {
- ((FlutterAppActivity) activity).showContent(s);
- }
- }
- void send(String str, BasicMessageChannel.Reply<String> reply) {
- messageChannel.send(str, reply);
- }
- }
笔者对Android端代码做了一个简单的封装,还是很好理解的。下面就来看flutter代码实现。
- class _MyHomePageState extends State<MyHomePage> {
- //StringCodec()为编码格式
- BasicMessageChannel<String> _basicMessageChannel =
- BasicMessageChannel("BasicMessageChannelPlugin", StringCodec());
- @override
- void initState() {
- _basicMessageChannel.setMessageHandler((message) => Future<String>(() {
- print(message);
- //message为native传递的数据
- setState(() {
- _content = message;
- });
- //给Android端的返回值
- return "收到Native消息:" + message;
- }));
- _controller = TextEditingController();
- super.initState();
- }
- //向native发送消息
- void _sendToNative() {
- Future<String> future = _basicMessageChannel.send(_controller.text);
- future.then((message) {
- _resultContent = "返回值:" + message;
- });
- }
- @override
- Widget build(BuildContext context) {...}
- }
上面就是通过BasicMessageChannel来进行通信的代码实现。在Android端只需要调用BasicMessageChannelPlugin的send方法就可以向flutter发送数据,BasicMessageChannel.Reply是返回值的回调方法。在flutter端使用只需要参考_sendToNative方法的实现即可。
4、通信原理
从分析Android与Flutter通信的源码来看,实现还是比较简单的,都是以ByteBuffer为数据载体,然后通过BinaryMessenger来发送与接收数据。整体设计如下。

从图中可以看出,Android侧与flutter侧采用了相同的设计。前面说过通信时是异步进行的,那么线程切换在哪?其实是在系统底层实现的。在Android与Flutter通信中,系统底层屏蔽了线程切换、数据拷贝等大量复杂操作。使得Android侧与flutter侧能方便的来进行通信。
(编辑:威海站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|