提前劇透,安卓原生向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端发送消息过来的消息回调

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐