flutter中的原生通信介绍(BinaryMessenger和DartMessenger)
可以看到,DartExecutor里面的binaryMessenger本质上又利用了DartMessenger,而这个DartMessenger就是最底层的消息交互的实现类(创建消息队列,通过安卓线程池处理消息,接收flutter端消息,向flutter端发送或者回复消息等)从281行可以看出,进一步调用的是flutterJNI里面的方法,flutterJNI里面封装的都是native方法也就是c
提前劇透,安卓原生向flutter主动发送消息调用的是DartMessenger里面的send方法

从281行可以看出,进一步调用的是flutterJNI里面的方法,flutterJNI里面封装的都是native方法也就是c/c++代码,所以一般追到flutterJNI方法即可暂停,大体流程就已经清楚了


到此,安卓往flutter端发送消息大概清楚了(安卓回复flutter端是reply方法,和send基本一致,都是调用jni)

Send是主動发送,reply是根据dart端发来的消息进行回复
DartExecutor里面有dartMessenger(继承自BinaryMessenger)
dartMessenger里面主要就是负责安卓和flutter的通信,send是安卓端主动向flutter端发送消息,reply是回复flutter端的消息
BinaryMessenger
这是源码里面的核心代码,需要记清楚里面的每个方法和作用
BinaryMessenger是一个接口
内部包含几个子接口
TaskQueue:把消息保存到队列,队列里面使用安卓线程池处理消息
子类TaskQueueOptions:处理任务的选项,是串行还是并行处理消息
子接口BinaryMessageHandler:接受flutter发来的消息
子接口BinaryReply:回复flutter端消息
内部包含的方法:
send(@NonNull String channel, @Nullable ByteBuffer message, @Nullable
BinaryReply callback);
根据通道名称处理对应的消息
setMessageHandler(@NonNull String channel, @Nullable
BinaryMessageHandler handler);
设置消息回调,接受flutter端消息
makeBackgroundTaskQueue(TaskQueueOptions options)
MethodChannel
Methodchannel内部还是使用binaryMessenger来进行消息的传递,只要完全搞清楚binaryMessger,methodChanner就很简单,就是套壳而已
以我们常见的代码来分析流程

安卓端使用methodChannel都会使用flutterEngine. dartExecutor. binaryMessenger作为第一个参数

点进方法,看到调用了messenger.setMessageHandler,重点来了,这个messenger是哪里来的?

可以看出,methodChannel里面的messenger就是传进来的flutterEngine.dartExecutor.binaryMessenger(跟上面的疑问实现闭环)

接下来看一下,dartExecutor.binaryMessenger又是怎么实现的,本质又是什么?

可以看到,DartExecutor里面的binaryMessenger本质上又利用了DartMessenger,而这个DartMessenger就是最底层的消息交互的实现类(创建消息队列,通过安卓线程池处理消息,接收flutter端消息,向flutter端发送或者回复消息等)

最后可以看到,methodChannel里面接受发送消息都是使用dartMessenger处理的消息
DartMessenger
dartMessenger是BinaryMessenger的实现类,也是原生和flutter信息交互的具体实现类,BinaryMessenger有以下几个实现类,但是只有DartMessenger真正实现了交互逻辑,其他几个实现类都是套壳调用dartMessenger而已

以下列举几个DartMessenger比较重要的实现方法



DartEcecutor

关键方法:
executeDartEntrypoint(DartEntrypoint dartEntrypoint, @Nullable List<String> dartEntrypointArgs)
底层调用jni,执行dart方法,参数是资源文件地址+dart包文件地址+方法名
BinaryMessenger getBinaryMessenger():返回binaryMessenger给其他地方用
Send(String channel, ByteBuffer message)向flutter端发送消息,实际上就是调用dartMessenger的send方法
setMessageHandler(String channel, BinaryMessenger .Binary
MessageHandler handler)
设置flutter端发送消息过来的消息回调


更多推荐


所有评论(0)