文章目录
前言
一、Android 端 BasicMessageChannel 构造函数
二、Android 端 MessageCodec 子类实现
三、Android 端 setMessageHandler 方法
四、Android 端 send 方法
五、Android 端实现 BasicMessageChannel 通信步骤
前言
本博客与 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 BasicMessageChannel 通信 ) 博客相对应 , 该博客中开发 Flutter 的 Dart 端 ;
本博客中开发 Android 中的 Java 端 , 最终目标是二者可以进行信息交流 ;
一、Android 端 BasicMessageChannel 构造函数
Android 端 Java 中 , BasicMessageChannel 构造函数方法原型如下 :
public final class BasicMessageChannel<T> { @NonNull private final BinaryMessenger messenger; @NonNull private final String name; @NonNull private final MessageCodec<T> codec; /** * Creates a new channel associated with the specified {@link BinaryMessenger} and with the * specified name and {@link MessageCodec}. * * @param messenger a {@link BinaryMessenger}. * @param name a channel name String. * @param codec a {@link MessageCodec}. */ public BasicMessageChannel( @NonNull BinaryMessenger messenger, @NonNull String name, @NonNull MessageCodec<T> codec) { if (BuildConfig.DEBUG) { if (messenger == null) { Log.e(TAG, "Parameter messenger must not be null."); } if (name == null) { Log.e(TAG, "Parameter name must not be null."); } if (codec == null) { Log.e(TAG, "Parameter codec must not be null."); } } this.messenger = messenger; this.name = name; this.codec = codec; } }
BasicMessageChannel 接收 3 33 个参数 :
BinaryMessenger messenger : 用于 发送 / 接收消息 ;
String name : Channel 消息通道的名称 , 该名称必须与 Dart 中的消息通道名称相同 ;
MessageCodec<T> codec : 消息编解码器 ;
二、Android 端 MessageCodec 子类实现
MessageCodec 消息编解码器的子类实现 : 在 Android Studio 使用 Ctrl + H , 查看 MessageCodec 子类 , 有 4 44 个子类 ;
BinaryCodec : 二进制编解码器 , 返回值类型 和 入参类型 都是二进制格式 , 即 Byte 数组 ; 编解码器没有做任何操作 , 原封不动的传递二进制数据 ; 支持 二进制数据 ;
适用场景 : 传递大量的二进制数据 , 如图片 , 音视频等 , 可以直接传递内存块 , 不用再进行编解码 , 导致消耗不必要的性能 ;
StringCodec : 二进制 Byte 数组与字符串之间进行编解码 , 字符串编码格式 UTF-8 ; 发送的时候是 String 类型 , 经过 Channel 通道时编码成二进制类型 , 接收时在解码成 String 类型 ; 支持 字符串 数据 ;
JSONMessageCodec : 二进制数据 与 基础数据 之间进行编解码 , 支持 基础数据类型 / 列表 / 字典 ;
StandardMessageCodec : BasicMessageChannel 消息通道的 默认编码器 ; 支持 基础数据类型 / 二进制数据 / 列表 / 字典
BinaryCodec 实现 :
Android : ByteBuffer ;
iOS : NSData ;
Flutter : Uint8List ;
StringCodec 实现 :
Android : java.lang.String ;
iOS : NSString ;
Flutter : String ;
JSONMessageCodec 实现 :
Android : SONUtil , StringCodec ;
iOS : NSJSONSerialization ;
三、Android 端 setMessageHandler 方法
创建了 BasicMessageChannel 实例对象后 , 需要设置信息监听 , 如果要接收 Dart 端发送来的消息 , 需要设置消息处理器 ;
调用 setMessageHandler 方法 , 可以为 BasicMessageChannel 设置一个 消息处理器 ;
BasicMessageChannel.setMessageHandler 函数原型如下 :
/** * Registers a message handler on this channel for receiving messages sent from the Flutter * application. * * <p>Overrides any existing handler registration for (the name of) this channel. * * <p>If no handler has been registered, any incoming message on this channel will be handled * silently by sending a null reply. * * @param handler a {@link MessageHandler}, or null to deregister. */ @UiThread public void setMessageHandler(@Nullable final MessageHandler<T> handler) { messenger.setMessageHandler(name, handler == null ? null : new IncomingMessageHandler(handler)); }
设置的 MessageHandler<T> handler 参数 , 就是消息处理器 ;
在 MessageHandler 接口中 , 只有一个 onMessage 方法 , 该方法是用于接收 Dart 传递来的消息的 ;
onMessage 参数简介 :
T message : Dart 端传递来的消息 ;
Reply<T> reply : 向 Dart 端回传的数据 ;
MessageHandler 接口原型如下 :
/** A handler of incoming messages. */ public interface MessageHandler<T> { /** * Handles the specified message received from Flutter. * * <p>Handler implementations must reply to all incoming messages, by submitting a single reply * message to the given {@link Reply}. Failure to do so will result in lingering Flutter reply * handlers. The reply may be submitted asynchronously. * * <p>Any uncaught exception thrown by this method, or the preceding message decoding, will be * caught by the channel implementation and logged, and a null reply message will be sent back * to Flutter. * * <p>Any uncaught exception thrown during encoding a reply message submitted to the {@link * Reply} is treated similarly: the exception is logged, and a null reply is sent to Flutter. * * @param message the message, possibly null. * @param reply a {@link Reply} for sending a single message reply back to Flutter. */ void onMessage(@Nullable T message, @NonNull Reply<T> reply); }