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

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

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

73d97d93d40d

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;

}

}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 查询所有图片和视频,Android系统详解之获取图片和视频的缩略图

从Android 2.2开始系统新增了一个缩略图ThumbnailUtils类&#xff0c;位于framework的android.media.ThumbnailUtils位置&#xff0c;可以帮助我们从mediaprovider中获取系统中的视频或图片文件的缩略图&#xff0c;该类提供了三种静态方法可以直接调用获取。1.static Bitmap c…

node将图片转换成html文件,node+puppeteer将整个网页html转换为图片并保存【滚动截屏】...

Puppeteer 是 Chrome 开发团队在 2017 年发布的一个 Node.js 包&#xff0c;用来模拟 Chrome 浏览器的运行。demo只支持将简单不需要翻页&#xff0c;不需要登陆的页面转换为图片需要node环境&#xff0c;以及npm或cnpm包管理工具(自行百度)开始进入一个新的项目目录&#xff0…

html hover效果下拉个框,关于下拉菜单(CSS)中,“:hover”样式的设置问题?

各位大大&#xff0c;请帮忙解决一下这个问题&#xff0c;先谢谢&#xff01;由于之前的代码不是全部帖出&#xff0c;可能造成一点信息误解。以下是针对这个问题另外写的代码&#xff1a;.nav {width: 50px;height: 50px;overflow:hidden;background-color: #09F;transition: …

计算机基础知识离线作业答案,浙大远程教育计算机离线作业1.计算机基础知识题...

浙大远程教育计算机离线作业1.计算机基础知识题第1章 计算机基础知识(单选题)这些题目必须做一遍&#xff0c;来自统考题库(期末考试题也多半出在这里)&#xff0c;参考答案在另一个Word文档中(上传自己做的答案后才可以下载…)。据说&#xff0c;统考题库中大约有10,000测试题…

go 生成hash_go基础之map-写在前面(一)

为什么分析map在计算机编程语言当中&#xff0c;用的最多的数据结构估计就是map。map以他近乎o(1)的查找效率和修改效率让他在大多数场景下都比较受青睐。map的常规的实现方式都是hash其他数据结构&#xff0c;如java是hash红黑树&#xff0c;而我现在即将要分析的go的实现方式…

大学数学建模大赛是用计算机,北京大学第十届“江泽涵杯”数学建模与计算机应用竞赛试题...

消息来源&#xff1a;http://www.math.pku.edu.cn:8000/news/read.php?newsid8014A题&#xff1a;投篮问题投篮是篮球运动中一项关键性技术&#xff0c;是一项重要的得分手段。在篮球赛中有三种特殊的投篮方式&#xff0c;“三分球”、“两分球”和“一分球(罚篮)”。其中&…

dynamo方程怎么写_【简明自控】为什么特征方程如此重要

简明自动控制——为什么特征方程如此重要。热场视频&#xff1a;自平衡杆-双轴反作用轮倒立摆_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com顶个棍子&#xff01;具有主动脚轮的全向移动机器人_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com我自行车怎么少…

用户计算机可以通过电话拨号,用户计算机可以通过大型局域网、小型局域网、无线连接、电话拨号和()等方式接入Internet。...

_在保险合同中&#xff0c;用于体现保险利益载体的保险对象条款&#xff0c;被称为()条款。何为C/H比&#xff1f;原料中的C/H比与原性能的关系是什么&#xff1f;选址意见书、规划条件、建设用地规划许可证、建设工程规划许可证的有效期为()福建木偶戏颇负盛名&#xff0c;以(…

和佳股份有没有纳米机器人_新高赛复赛入围项目(49)一种纳米硅质绝热材料及其制备方法...

点击上方“蓝字”关注我们“2020中国山东新旧动能转换高价值专利培育大赛”(简称“新高赛”)是由山东省市场监督管理局(知识产权局)主办&#xff0c;由山东省知识产权事业发展中心、知识产权出版社有限责任公司共同承办的以新旧动能转换高价值专利培育为主题的创新大赛。新高赛…

分数乘整数计算机在线应用,分数乘整数应用题.doc

分数乘法应用题【知识要点】求一个数的几分之几是多少和求一个数的几倍是多少的分数应用题的解题思路和解答方法。1、一本书100页&#xff0c;看了&#xff0c;看了多少页&#xff1f;想&#xff1a;看了&#xff0c;是看了 的&#xff0c;就是把 看作单位“1”&#xff0c;求看…

mastercam加工报表生成_2020北京加工中心编程培训工厂教学行业

2020北京加工中心编程培训工厂教学行业河北德玛数控培训自办工厂 全程四轴五轴实践 学生直接面对客户 承揽加工各种异形件复杂件 终身技术支持 可勤工俭学 解决企业各种技术问题&#xff0c;每个校区都有实训车间&#xff0c;实训图档不限、不限、时间不限、并且不另收费&#…

背景调查 跳槽_分享 | 录用背景调查,查的到底是什么?

招聘对于HR而言&#xff0c;是一项常规工作&#xff0c;同时也是一项非常重要的工作&#xff0c;招聘有一系列的步骤和程序&#xff0c;每一道步骤和程序都必不可少&#xff0c;显得那么的重要&#xff0c;这其中包括我们常说的笔试、面试、体检&#xff0c;还包括不常说的正式…

html链接word,word添加网址超链接方法

word添加网址超链接方法大家对于超链接都了解吗&#xff1f;那么在word中应该如何设置超链接呢&#xff1f;下面是小编分享给大家的word添加网址超链接方法&#xff0c;希望对大家有帮助。1、直接拖动选定文本这个方法是最简单的方法&#xff0c;在word文档中直接拖动鼠选定的文…

.class文件转换.java_Java中的动态链接VS操作系统动态链接

在操作系统OS中为了优化内存的使用会采用一种动态链接方式&#xff0c;一个文件想要在操作系统中运行必须经过编译、汇编译、链接、装载等步骤。可以参考Java程序是怎么跑起来的。本篇主要讲解Java栈帧中动态链接部分与操作系统的的动态链接的区别与联系操纵系统为什么需要动态…

计算机组成原理与应用,计算机组成原理简答与应用

简答与应用1&#xff0e;何谓中断&#xff1f;&#xff1f;中断是由外围设备或其他非预期的急需处理的事件引起的&#xff0c;CPU暂时中断正在执行的程序&#xff0c;转至另一服务程序去处理这一事件&#xff0c;待事件处理完毕后返回原程序继续执行。2.(不算CPU中的寄存器级)存…

宏观经济学gdp计算方法_宏观经济学考研的重要考点

宏观经济学考研重要考点西方国民收入核算宏观经济学的特点;国内生产总值;核算国民收入的两种算法(支出法和收入法);国内生产总值;个人可支配收入;国民收入的基本公式;名义GDP和实际GDP。要求&#xff1a;重点掌握本章基本概念及计算。简单国民收入决定理论均衡产出;凯恩斯的消费…

大学计算机基础试题 选择题,大学计算机基础试题选择题

大学计算机基础试题选择题第一章1. 世界上第一台全自动电子数字计算机ENIAC的诞生时间是( )A. 1945年 B. 1946年 C. 1948年 D. 1949年2. 第一位提出“存储程序”思想的科学家是( )A. 图灵 B. 莱布尼茨 C. 冯诺伊曼 D. 帕斯卡3. 电子计算机四个发展阶段的划分依据是( )不同A. 电…

json符号解释大全_牛年汪姓男孩高端大气的名字大全

牛年汪姓男孩高端大气的名字大全 张桉宁起名分享牛年汪姓男孩高端大气的名字大全&#xff1a;给男孩起名有很多的讲究&#xff0c;需要从多个方面考虑。牛年汪姓男孩如何起一个高端大气的好名字&#xff0c;是家长朋友们都十分重视的。给牛年的汪姓男孩起一个高端的名字&#x…

变电站计算机在线监控系统,变电站环境在线监测系统

原标题&#xff1a;变电站环境在线监测系统概述随着计算机技术、网络通讯技术以及电力系统保护技术的发展&#xff0c;配电室的自动化运行水平不断提高&#xff0c;大大减少了人为操作&#xff0c;使配电室的无人值守逐步变成了可能。配电的可靠和安全是整个电能管理系统中的一…

什么意思是谁_舔狗是什么意思?如果不是真的喜欢谁又愿意做舔狗呢出处?

[海峡网]网络上面经常会出现一些新的词句&#xff0c;比如最近舔狗这个词就经常出现在大家的视线中。相信很多小伙伴都知道&#xff0c;最近关于虎牙的包子的事情也是挺多的&#xff0c;不过关于包桑的梗也是很多&#xff0c;那么关于包桑的这句“如果不是真的喜欢&#xff0c;…