加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

一篇看懂Android与Flutter之间的通信

发布时间:2019-06-25 16:48:30 所属栏目:评论 来源:Android高级架构师
导读:Flutter作为一种跨平台解决方案,经常会作为一个模块嵌入到原生Android与iOS应用中,Flutter与Android原生端的通信必不可少。所以本文就来讲述一下Android如何与flutter进行通信。 1、架构概述 消息通过平台通道在native(host)与flutter(client)之间传递,

BasicMessageChannel是一种能够在native与flutter之间互相发送消息的通信方式,它支持数据类型最多,使用范围最广。EventChannel与MethodChannel的应用场景可以使用BasicMessageChannel来实现,但BasicMessageChannel的应用场景就不一定能够使用EventChannel与MethodChannel来实现。该方式有返回值。它的使用方式如下。

首先来看Android代码的实现。

  1. //这里支持的数据类型为String。 
  2. public class BasicMessageChannelPlugin implements BasicMessageChannel.MessageHandler<String> { 
  3.  private Activity activity; 
  4.  private BasicMessageChannel<String> messageChannel; 
  5.  static BasicMessageChannelPlugin registerWith(FlutterView flutterView) { 
  6.  return new BasicMessageChannelPlugin(flutterView); 
  7.  } 
  8.  private BasicMessageChannelPlugin(FlutterView flutterView) { 
  9.  this.activity = (Activity) flutterView.getContext(); 
  10.  this.messageChannel = new BasicMessageChannel<String>(flutterView, "BasicMessageChannelPlugin", StringCodec.INSTANCE); 
  11.  messageChannel.setMessageHandler(this); 
  12.  } 
  13.  @Override 
  14.  public void onMessage(String s, BasicMessageChannel.Reply<String> reply) { 
  15.  reply.reply("BasicMessageChannelPlugin收到:" + s); 
  16.  if (activity instanceof FlutterAppActivity) { 
  17.  ((FlutterAppActivity) activity).showContent(s); 
  18.  } 
  19.  } 
  20.  void send(String str, BasicMessageChannel.Reply<String> reply) { 
  21.  messageChannel.send(str, reply); 
  22.  } 

笔者对Android端代码做了一个简单的封装,还是很好理解的。下面就来看flutter代码实现。

  1. class _MyHomePageState extends State<MyHomePage> { 
  2.  //StringCodec()为编码格式 
  3.  BasicMessageChannel<String> _basicMessageChannel = 
  4.  BasicMessageChannel("BasicMessageChannelPlugin", StringCodec()); 
  5.  @override 
  6.  void initState() { 
  7.  _basicMessageChannel.setMessageHandler((message) => Future<String>(() { 
  8.  print(message); 
  9.  //message为native传递的数据 
  10.  setState(() { 
  11.  _content = message; 
  12.  }); 
  13.  //给Android端的返回值 
  14.  return "收到Native消息:" + message; 
  15.  })); 
  16.  _controller = TextEditingController(); 
  17.  super.initState(); 
  18.  } 
  19.  //向native发送消息 
  20.  void _sendToNative() { 
  21.  Future<String> future = _basicMessageChannel.send(_controller.text); 
  22.  future.then((message) { 
  23.  _resultContent = "返回值:" + message; 
  24.  }); 
  25.  } 
  26.  @override 
  27.  Widget build(BuildContext context) {...} 

上面就是通过BasicMessageChannel来进行通信的代码实现。在Android端只需要调用BasicMessageChannelPlugin的send方法就可以向flutter发送数据,BasicMessageChannel.Reply是返回值的回调方法。在flutter端使用只需要参考_sendToNative方法的实现即可。

4、通信原理

从分析Android与Flutter通信的源码来看,实现还是比较简单的,都是以ByteBuffer为数据载体,然后通过BinaryMessenger来发送与接收数据。整体设计如下。

一篇看懂Android与Flutter之间的通信

从图中可以看出,Android侧与flutter侧采用了相同的设计。前面说过通信时是异步进行的,那么线程切换在哪?其实是在系统底层实现的。在Android与Flutter通信中,系统底层屏蔽了线程切换、数据拷贝等大量复杂操作。使得Android侧与flutter侧能方便的来进行通信。

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读