android rn框架开发的例子,RN与安卓通信架构篇
本篇文章介绍的搭建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与安卓通信架构篇相关推荐
- 安卓开发(2)之安卓操作系统架构
Android架构 Android 操作系统是一个软件组件的栈,在架构图中它大致可以分为四个主要层. 四层架构(自下而上): 第一层(最底层).Linux内核层 最底层为Linux内核,提供进程管理, ...
- android webview js 交互框架,自定义android混合框架开发实践1:实现基础andorid和webview交互...
1. 本地web资源 1.构建assets/web文件夹 2.创建index.html你的html代码 3.使用本地web资源WebView mv = findViewById(...); mv.lo ...
- Android适合手机开发的又一力证——安卓街机
Android发布至今,关于Android是不是适合游戏开发之争一直没有间断过,不支持者大多认为: 1. Android运行在java虚拟机上,不能发挥全部的硬件性能. 2. PC游戏诞生至今,经典游 ...
- android硬编码封装mp4,【Android 音视频开发打怪升级:音视频硬解码篇】四、音视频解封和封装:生成一个MP4...
[声 明] 首先,这一系列文章均基于自己的理解和实践,可能有不对的地方,欢迎大家指正. 其次,这是一个入门系列,涉及的知识也仅限于够用,深入的知识网上也有许许多多的博文供大家学习了. 最后,写文章过程 ...
- 【Android智能硬件开发】【011】安卓串口转USB
情景 一般硬件设备提供的内置串口数量是有限的,当串口不够用时,就需要通过USB来外接这些设备 CH341是一种芯片,它可以将以串口方式进行通信的设备,转接到USB口上进行通信 使用该方案,需要购买对应 ...
- android 微信分身开发,【技巧】2021安卓手机微信分身方法
微信的使用场景已经渗透到我们生活的各个角落,无论是上街买菜还是工作交流都能看到微信神一般的存在着.有时为了工作的需要,一些人可能需要专门申请一个微信号来应对纷繁的工作,所以在一部手机上打开两个微信就显 ...
- 开发自己的山寨Android注解框架
目录 开发自己的山寨Android注解框架 开发自己的山寨Android注解框架 参考 Github黄油刀 Overview 在上一章我们学习了Java的注解(Annotation),但是我想大家可能 ...
- android+Unity3D游戏开发之简单的物体运动
android+Unity3D游戏开发之简单的物体运动 其实这篇也是转载的,真的感觉对于我们初学者来说很不错的,不信你看看嘛;原创链接:http://bbs.9ria.com/thread-98192 ...
- android mvp框架基类,Android MVP架构项目搭建封装,基类封装
综述 对于MVP (Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的.而对于Android应用的开发中本身可视为一种MVC架构 ...
- Android Swift iOS开发:语言与框架对比
转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...
最新文章
- Googlenet笔记
- JUL执行原理和流程
- RT-Thread智能音箱音频应用实践
- C#开源资源大汇总(转)
- 判断字符串是不是application/x-www-form-urlencoded字符串(URL编码格式的字符串)
- 2013Esri中国用户大会,show应用,赢大奖--获奖名单公布!
- 面试中Shiro常见的问题
- 辞职文案火了,程序员的辞职理由要命不要钱。
- 【学术分享】40个科研学术网站,收藏必备,予取予求!
- matlab画热力网格图
- python查询12306余票_使用 Python 在 12306 查询火车票余票
- Connection error: QRedisClient compiled without ssh support
- 华为人均工资70万人人想要,可华为员工16项标准你能做到几条?
- 【爱情叙记】--刚闹完别扭
- 《iPad开发从入门到精通》——6.6节系统设置
- 今天向大家推荐一款国产良心工具包 -- Hutool,让你的java变得更甜
- 无情链表的创建,,插入,,删除第一个位
- 生信人迷惑的一天 bam转fq
- 如何判断二阶系数线性非齐次方程是单根,还是重根
- 自己搭建IOC容器(C#)(二)实现Ioc容器基本功能
热门文章
- BUUCTF [WUSTCTF2020]alison_likes_jojo
- 手把手教你写数独计算器(1)
- ‘xxx‘ is missing in props validation
- 什么样的运动耳机比较好、跑步运动耳机推荐
- c语言韦达定理求方程解,高一上韦达定理,高次,多元方程解法.doc
- infer的用法_infer使用的浅谈简析
- Enjoying virus ⌒●ǒ●⌒
- 怎么把word文档免费转换成pdf文件
- 优化 AIX 6.1 的性能 (转帖)
- 03一般过去时和主谓双宾