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.pswp.cn/news/529624.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529624.shtml
英文地址,請注明出處:http://en.pswp.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;…