【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 BasicMessageChannel 通信 )(一)

简介: 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 BasicMessageChannel 通信 )(一)

文章目录

前言

一、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 个子类 ;


image.png


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);
  }



目录
相关文章
|
1月前
|
Android开发 iOS开发 容器
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
|
3天前
|
传感器 前端开发 Android开发
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求。本文深入探讨了插件开发的基本概念、流程、集成方法、常见类型及开发实例,如相机插件的开发步骤,同时强调了版本兼容性、性能优化等注意事项,并展望了插件开发的未来趋势。
15 2
|
28天前
|
移动开发 Dart 搜索推荐
打造个性化安卓应用:从零开始的Flutter之旅
【10月更文挑战第20天】本文将引导你开启Flutter开发之旅,通过简单易懂的语言和步骤,让你了解如何从零开始构建一个安卓应用。我们将一起探索Flutter的魅力,实现快速开发,并见证代码示例如何生动地转化为用户界面。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供价值。
|
1月前
|
开发者
鸿蒙Flutter实战:07-混合开发
鸿蒙Flutter混合开发支持两种模式:1) 基于har包,便于主项目开发者无需关心Flutter细节,但不支持热重载;2) 基于源码依赖,利于代码维护与热重载,需配置Flutter环境。项目结构包括AppScope、flutter_module等目录,适用于不同开发需求。
77 3
|
21天前
|
传感器 开发框架 物联网
鸿蒙next选择 Flutter 开发跨平台应用的原因
鸿蒙(HarmonyOS)是华为推出的一款旨在实现多设备无缝连接的操作系统。为了实现这一目标,鸿蒙选择了 Flutter 作为主要的跨平台应用开发框架。Flutter 的跨平台能力、高性能、丰富的生态支持和与鸿蒙系统的良好兼容性,使其成为理想的选择。通过 Flutter,开发者可以高效地构建和部署多平台应用,推动鸿蒙生态的快速发展。
145 0
|
23天前
|
Dart 安全 UED
Flutter&鸿蒙next中的表单封装:提升开发效率与用户体验
在移动应用开发中,表单是用户与应用交互的重要界面。本文介绍了如何在Flutter中封装表单,以提升开发效率和用户体验。通过代码复用、集中管理和一致性的优势,封装表单组件可以简化开发流程。文章详细讲解了Flutter表单的基础、封装方法和表单验证技巧,帮助开发者构建健壮且用户友好的应用。
62 0
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
82 7
|
1月前
|
编解码 Dart API
鸿蒙Flutter实战:06-使用ArkTs开发Flutter鸿蒙插件
本文介绍了如何开发一个 Flutter 鸿蒙插件,实现 Flutter 与鸿蒙的混合开发及双端消息通信。通过定义 `MethodChannel` 实现 Flutter 侧的 token 存取方法,并在鸿蒙侧编写 `EntryAbility` 和 `ForestPlugin`,使用鸿蒙的首选项 API 完成数据的读写操作。文章还提供了注意事项和参考资料,帮助开发者更好地理解和实现这一过程。
70 0
|
1月前
|
Dart Android开发
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
本文介绍了在OpenHarmony平台上集成WebView的两种方法:一是使用第三方库`flutter_inappwebview`,通过配置pubspec.lock文件实现;二是编写原生ArkTS代码,自定义PlatformView,涉及创建入口能力、注册视图工厂、处理方法调用及页面构建等步骤。
58 0
|
5月前
|
开发框架 前端开发 测试技术
Flutter开发常见问题解答
Flutter开发常见问题解答