本篇文章介绍的搭建Android与Rn之间的简易通信架构,需要了解通信的基本使用的同学可以参考下面的链接

开篇先上图 - “简易版的通信架构图”

RN与Android之间通信的架构图

本架构实现的功能有:

自定义通信规则,并以Json作为数据传输格式进行传输

实现通信场景分两种: 1) RN主动向Android获取数据 2)Android主动向RN传输数据

先着重介绍场景1(RN主动向Android获取数据),进行数据传输的格式

协议:rn://xxxmodule?funTarget=main_cache

协议的Schema:‘rn://’标识为此通信的标识,可验证通信正确性

协议的Host:‘xxxmodule’此标识为传递给对应的业务模块执行。包括:网络加载模块,本地数据缓存模块等等。

协议的queryParams: ‘funTarget’ 这个key用于标识模块需要执行的动作。比如网络模块需要拉取个人信息,需要拉取首页信息,此标识用于执行动作的区分

如下例子:

rn://networkmodule?funTarget=person_info, 到网络模块中拉取个人信息

rn://networkmodule?funTarget=main_page, 到网络模块中拉取首页信息

以上协议贯穿了整个架构的设计,下面介绍代码实现部分

协议规则实现类BridgeUrlConfig, BridgeUrlConst

public interface BridgeUrlConst {

String RN_SCHEMA = "rn";

String RN_NETWORK_MODULE = "network";

String COMPLETE_RN_SCHEMA = RN_SCHEMA + "://";

}

public enum BridgeUrlConfig {

//target: 网络模块

NETWORK_MODULE(BridgeUrlConst.COMPLETE_RN_SCHEMA + BridgeUrlConst.RN_NETWORK_MODULE),

//action: 网络模块下执行main_cache动作

NETWORK_SYNC_MAIN_CACHE(NETWORK_MODULE, "main_cache"),

//action: 网络模块下执行second_cache动作

NETWORK_SYNC_SECOND_CACHE(NETWORK_MODULE, "second_cache"),

//action: 网络模块下执行request动作

NETWORK_ASYNC_REQUEST(NETWORK_MODULE, "request");

private String target;

private BridgeUrlConfig parentConfig;

BridgeUrlConfig(String target) {

this.target = target;

this.parentConfig = null;

}

BridgeUrlConfig(BridgeUrlConfig parentConfig, String target) {

this.target = target;

this.parentConfig = parentConfig;

}

public String getTarget() {

return target;

}

public BridgeUrlConfig getParentConfig() {

return parentConfig;

}

}

以上使用接口常量与枚举实现规则定义, 更直观的方便我们后面的解析解析和判断的使用

如何使用协议?RN与原生通信入口 BridgeUrlAnalysis

//用来声明模块

public interface IModuleExecuteEntry {

/*

* funTarget: 需要执行的action

* argJson: 执行此action需要的参数

* promise: 用于执行结果的回调,可查看官网文档,上方链接有说

* 明。注意异步或同步兼用回调返回。

*/

void execute(String funTarget, String argJson, Promise promise);

}

//通信协议执行入口类

public class BridgeUrlAnalysis {

private static BridgeUrlAnalysis bridgeUrlAnalysis = new BridgeUrlAnalysis();

private BridgeUrlAnalysis() {

}

public static BridgeUrlAnalysis getInstance() {

return bridgeUrlAnalysis;

}

final Map modules = new HashMap<>();

//1.注册可执行模块

{

modules.put(URI.create(BridgeUrlConfig.NETWORK_MODULE.getTarget()).getHost(), new NetworkModule());

}

/**

* //2.通信入口方法

* 正确的url格式:‘ react_native://xxxmodule?funTarget='main_cache' "

*

* @param url

* @param argsJson

*/

public void analysis(String url, String argsJson, Promise promise) {

if (TextUtils.isEmpty(url)) {

throw new RuntimeException("please url not empty");

}

URI uri = URI.create(url);

if (!uri.getScheme().equals(BridgeUrlConst.RN_SCHEMA)) {

throw new RuntimeException("please url not correct");

}

//根据url中的host获取对应注册的module

String host = uri.getHost();

IModuleExecuteEntry entry = modules.get(host);

if (entry == null) {

throw new RuntimeException("this target module not init");

}

//解析url中的query,获取name为“funTarget”的值

String paramString = uri.getQuery().split("#")[0];

Matcher matcher = Pattern.compile("(^|&)" + "funTarget=" + "([^&]*)").matcher(paramString);

matcher.lookingAt();

entry.execute(matcher.group(2), argsJson, promise);

}

}

以上类需要注意两点:

1.注册可执行协议的模块

2.通信协议的入口执行逻辑

然后介绍场景2,Android主动发送数据给RN

此处使用了事件发送技术,类似EventBus的用法。

因为比较简单就直接上Android代码

/**

* 1.原生模块可以在没有被调用的情况下往 JavaScript 发送事件通知

*/

public interface INativeSendToRnBridge {

/**

* 发送事件到RN上

* @param eventName 设置发送事件的名称,RN可对此名称的事件进行监听

* @param jsonObj

*/

void sendEvent(String eventName, String jsonObj);

}

/**

*具体实现类

*/

public class AndroidSendToRNBridge implements INativeSendToRnBridge {

private ReactContext mReactContext;

public AndroidSendToRNBridge(ReactContext context) {

this.mReactContext = context;

}

/**

* 发送数据的入口,规定了发送事件的格式

* eventName: 用于区分事件,相当于key

* jsonObj: 事件所包含的数据,相当于value。建议以Json格式数

* 据发送

*/

@Override

public void sendEvent(String eventName, String jsonObj) {

mReactContext

.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)

.emit(eventName, jsonObj);

}

public ReactContext getReactContext() {

return mReactContext;

}

public void setReactContext(ReactContext mReactContext) {

this.mReactContext = mReactContext;

}

}

本篇文章介绍完毕啦,需要源码的小伙伴可私信我。

android rn框架开发的例子,RN与安卓通信架构篇相关推荐

  1. 安卓开发(2)之安卓操作系统架构

    Android架构 Android 操作系统是一个软件组件的栈,在架构图中它大致可以分为四个主要层. 四层架构(自下而上): 第一层(最底层).Linux内核层 最底层为Linux内核,提供进程管理, ...

  2. android webview js 交互框架,自定义android混合框架开发实践1:实现基础andorid和webview交互...

    1. 本地web资源 1.构建assets/web文件夹 2.创建index.html你的html代码 3.使用本地web资源WebView mv = findViewById(...); mv.lo ...

  3. Android适合手机开发的又一力证——安卓街机

    Android发布至今,关于Android是不是适合游戏开发之争一直没有间断过,不支持者大多认为: 1. Android运行在java虚拟机上,不能发挥全部的硬件性能. 2. PC游戏诞生至今,经典游 ...

  4. android硬编码封装mp4,【Android 音视频开发打怪升级:音视频硬解码篇】四、音视频解封和封装:生成一个MP4...

    [声 明] 首先,这一系列文章均基于自己的理解和实践,可能有不对的地方,欢迎大家指正. 其次,这是一个入门系列,涉及的知识也仅限于够用,深入的知识网上也有许许多多的博文供大家学习了. 最后,写文章过程 ...

  5. 【Android智能硬件开发】【011】安卓串口转USB

    情景 一般硬件设备提供的内置串口数量是有限的,当串口不够用时,就需要通过USB来外接这些设备 CH341是一种芯片,它可以将以串口方式进行通信的设备,转接到USB口上进行通信 使用该方案,需要购买对应 ...

  6. android 微信分身开发,【技巧】2021安卓手机微信分身方法

    微信的使用场景已经渗透到我们生活的各个角落,无论是上街买菜还是工作交流都能看到微信神一般的存在着.有时为了工作的需要,一些人可能需要专门申请一个微信号来应对纷繁的工作,所以在一部手机上打开两个微信就显 ...

  7. 开发自己的山寨Android注解框架

    目录 开发自己的山寨Android注解框架 开发自己的山寨Android注解框架 参考 Github黄油刀 Overview 在上一章我们学习了Java的注解(Annotation),但是我想大家可能 ...

  8. android+Unity3D游戏开发之简单的物体运动

    android+Unity3D游戏开发之简单的物体运动 其实这篇也是转载的,真的感觉对于我们初学者来说很不错的,不信你看看嘛;原创链接:http://bbs.9ria.com/thread-98192 ...

  9. android mvp框架基类,Android MVP架构项目搭建封装,基类封装

    综述 对于MVP (Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的.而对于Android应用的开发中本身可视为一种MVC架构 ...

  10. Android Swift iOS开发:语言与框架对比

    转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...

最新文章

  1. Googlenet笔记
  2. JUL执行原理和流程
  3. RT-Thread智能音箱音频应用实践
  4. C#开源资源大汇总(转)
  5. 判断字符串是不是application/x-www-form-urlencoded字符串(URL编码格式的字符串)
  6. 2013Esri中国用户大会,show应用,赢大奖--获奖名单公布!
  7. 面试中Shiro常见的问题
  8. 辞职文案火了,程序员的辞职理由要命不要钱。
  9. 【学术分享】40个科研学术网站,收藏必备,予取予求!
  10. matlab画热力网格图
  11. python查询12306余票_使用 Python 在 12306 查询火车票余票
  12. Connection error: QRedisClient compiled without ssh support
  13. 华为人均工资70万人人想要,可华为员工16项标准你能做到几条?
  14. 【爱情叙记】--刚闹完别扭
  15. 《iPad开发从入门到精通》——6.6节系统设置
  16. 今天向大家推荐一款国产良心工具包 -- Hutool,让你的java变得更甜
  17. 无情链表的创建,,插入,,删除第一个位
  18. 生信人迷惑的一天 bam转fq
  19. 如何判断二阶系数线性非齐次方程是单根,还是重根
  20. 自己搭建IOC容器(C#)(二)实现Ioc容器基本功能

热门文章

  1. BUUCTF [WUSTCTF2020]alison_likes_jojo
  2. 手把手教你写数独计算器(1)
  3. ‘xxx‘ is missing in props validation
  4. 什么样的运动耳机比较好、跑步运动耳机推荐
  5. c语言韦达定理求方程解,高一上韦达定理,高次,多元方程解法.doc
  6. infer的用法_infer使用的浅谈简析
  7. Enjoying virus ⌒●ǒ●⌒
  8. 怎么把word文档免费转换成pdf文件
  9. 优化 AIX 6.1 的性能 (转帖)
  10. 03一般过去时和主谓双宾