Android端接口

RN端向Android侧通信可以通过Android侧的接口来实现。

实现接口

Android侧的接口都需要继承ReactContextBaseJavaModule类,如下:

class MyModule extends ReactContextBaseJavaModule {@NonNull@Overridepublic String getName() { return "MyModule"; } // 1@ReactMethodpublic void handleMessage(String msg, Promise pro) { } // 2
}
  1. 这些类统一都需要实现getName函数,这个函数的用途是返回原生模块代码的名称以供RN模块调用,在RN侧使用这个名称来调用在这个类中定义的函数。

  2. 想要调用的函数必须要用@ReactMethod关键字将其注释为一个React函数才能在RN侧被调用。

    并且这些函数不能有返回值,因为被调用的原生代码是异步执行的。

    那么如果我们想要执行完原生的逻辑后想要得到返回值该怎么办呢?我们可以使用异步的方法来做,例如回调函数Promiseasync等。

    值得注意的是,即使正确调用了回调函数,这些回调函数也不会立即这些,因为混合开发中的桥接机制是异步的,中间应该用了一个类似于消息队列的机制。

注册模块

在 Android侧要做的最后一件事就是注册这个模块。为此开发者需要实现一个React包管理类。这个类需要继承ReactPackage类。我们需要在这个ReactPackage类的createNativeModules方法中添加我们实现好的模块。如果模块没有被注册,它也无法在 JavaScript 中被访问到。

class MyPackage extends ReactPackage {@Overridepublic List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {List<NativeModule> modules = new ArrayList<>();modules.add(new MyModule(reactContext));// 这个包管理类的List里可以管理多个modulereturn modules;}
}

这个ReactPackage类将在MainApplication.javagetPackages方法中被创建一个实例。

protected List<ReactPackage> getPackages() {@SuppressWarnings("UnnecessaryLocalVariable")List<ReactPackage> packages = new PackageList(this).getPackages();packages.add(new MyPackage()); // <-- 添加这一行,类名替换成你的Package类的名字 name.return packages;
}

RN端使用

handleMessage(string msg) {let { NativeModules } = require('react-native');NativeModules.handleMessage(msg).then(() => { });
}

注意:如果我们更改了Android项目中的代码,我们需要重新编译Android项目,项目在编译时会中断cmd窗口的监听程序,我们需要再次打开一个cmd运行’react-native start’ 重新开始监听。

跨语言常量

同样的我们可以在Android端通过实现名为getConstants的成员函数来将某些常量暴露给RN侧,这个方法在Android和RN侧需要保持某些常量的一致的时候会有用处。如下:

@Override
public Map<String, Object> getContants() { return MyMap; }

Android侧主动向RN侧发消息

当Android侧需要主动向RN侧发消息时,可以使用消息机制。

// Android侧
MyContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName, msg);
// rn侧
DeviceEventEmitter.addListener(eventName, (msg) => { })

注意:使用getJSModule必须要有一个ReactApplicationContext的实例,那么,我们如何获得这个ReactApplication的实例呢?

这里就需要提出一个开发的建议:尽管getJSModule可以在任何位置使用,但是还是建议在ReactContextBaseJavaModule中使用,因为MyModule在创建和注册的时候——createNativeModule 会传递一个ReactApplicationContext,所以创建MyModule的时候可以让构造函数中带上这个参数,这样我们就可以在MyModule中使用ReactApplicationContext了。

Android与RN界面的切换

同样的,我们可以让原生代码初始化一个视图,并且让这个视图获得焦点,这样就实现了RN和原生界面的切换.

初始界面的界定

Android应用初始界面在AndroidManifest.xml文件中进行设置。文件中含有“intent-filter”字段所在的Activity就是默认启动的第一个Activity。

我们可以观察一个项目中被intent-filter标注的Activity,如果这个Activity继承的是ReactActiity,那么这个项目的初始界面就是一个RN界面。

RN向Android的跳转

RN向Android的跳转很简单,与上面接口的实现很类似,只要在需要跳转的时候调用Android端的接口,然后在这个接口中创建intent执行startActivity即可。(//TODO: 可以直接start一个Fragment吗?)

关键在于Android端回到RN端,如果Android不需要传递消息,那么在Android的Activity执行了finish之后就可以回到RN界面,如果需要回传消息,那么就需要在自己实现的ReactContextBaseJavaModule类中实现onActivityResult(),解析出传回来的消息后再使用Promise机制或者消息机制将消息传递给RN端。

Android向原生的跳转

如果初始界面为Android的界面,那么就需要实现从Android向原生的跳转。

Android向RN的跳转不是直接跳转到RN,而是跳转到RN在Android侧的界面容器中。我们需要在Android注册一个ReactActivity假设叫MyReactActivity,当我们需要进行跳转的时候,startActivity就是要启动这个MyReactActivity。

class MyReactActivity extends ReactActivity { }

那么MyReactActivity如何映射到RN界面呢,这就需要在RN端进行注册。如下所示:

// APP.js
import MyComponent from './index.js';
AppRegistry.registerComponent('MyReactActivity', () => MyComponent);

RN与Android的交互相关推荐

  1. ReactNative开发——RN与android Native交互初探

    ReactNative开发--RN与android Native交互初探 环境 window10,reactnative 0.44版 RN调用android方法 1.导入NativeModules组件 ...

  2. RN与Android原生交互

    前言:最开始做RN开发的时候,没有和原生打交道,结果居然把项目做出来,后来有人问我,RN页面可以跳转到Activity页面吗?我蒙了,我想了一下为什么还要调到原生页面呢?那样就不兼容andoid和io ...

  3. rn+android+sdk,RN与Android原生交互

    场景:在RN界面中需要调用原生的拍照和选择相册功能,将拍照或者选择的照片的路径回传给RN 步骤如下: 1.RN的界面跳转到原生Activity,并接收从原生回传的数据 import React, { ...

  4. RN 与 Android 代码交互

    如果在开发中要用到一个 RN 没有提供的组件,或者想复用 Java 代码已经实现的组件而不是用 JavaScript 再造一个车轮子,或者想使用 Java 高效的处理图片.访问数据库.多线程编程等,你 ...

  5. RN 与android原生交互

    缘由 有时候App需要访问平台api,但在RN中没有相应的模块,或者需要你复用一些原生代码,这就需要进一步开发RN原生模块.一般用React Native开发App时会用到一些原生模块,比如:在做社会 ...

  6. Android 与 JS 的交互 以及 JS与Android 的交互

    Android与JS交互以及JS与Android 的交互 是通过WebView互相调用方法 对于Android调用JS代码的方法有2种: 通过WebView的loadUrl() 通过WebView的e ...

  7. android ios web兼容,js与android iOS 交互兼容

    js与android iOS 交互兼容 在Android与js交互方面还是要比iOS方便很多,而UIWebView只暴漏出- (BOOL)webView:(UIWebView *)webView sh ...

  8. android html 启动app,Android js交互 与 Html启动App

    最近项目刚好有做到内部HTML页面跳转原生页面和html代码启动App页面的功能,做完之后觉得相关知识可以整理一下 先说下项目所用到的js交互 android调取JS的方法 WebView直接加载js ...

  9. JSON在Android网络交互中的使用方法

    在Android网络交互中使用到JSON传输接收数据. JSONObject为键值对形式的数据,内部使用LinkedHashMap实现.键的类型固定为String,值可取的类型在JSONObject, ...

最新文章

  1. 福布斯发布2019全球品牌价值100强:华为上榜苹果夺冠
  2. python - DBUtils 连接池减少oracle数据库的连接数
  3. 各个版本通道_绝地求生各个参数对画面的影响,软硬件优化帧数,拒绝做睁眼瞎...
  4. 如何用Python实现八大排序算法
  5. 5个拓展潜客的创意方法
  6. C/C++语言函数中参数的入栈顺序
  7. (视频+图文)机器学习入门系列-第7章 KNN算法
  8. 简单易用的.NET免费开源RabbitMQ操作组件EasyNetQ解析
  9. python中i+=1不等于++i
  10. html中购物车总金怎么算额,计算购物车金额总和( jquery )
  11. Java导出源程序_JAVA导出项目的所有源代码到一个文件
  12. 安装 Python IDLE (Linux)
  13. linux多播 多个接收方,在同一端口上接收多个多播源 – C,Linux
  14. c语言iec 103协议程序,IEC103通信流程详解.doc
  15. 使用触发器对学生表操作进行日志记录
  16. 设备接入(LWM2M协议)
  17. matlab误差分析报告,误差分析实验报告
  18. Python灰帽子黑客与逆向工程师的Python编程之道
  19. python怎么取百位_#python计算结果百位500向下取整,(0-499取000,500-999取500)
  20. Java引用和C++引用

热门文章

  1. Vue中如何扩展⼀个组件
  2. 第7讲、OrCAD页连接符的使用以及电源电路等绘制
  3. php中strrpos函数的返回值类型是型_strrpos()和strripos()函数【PHP】
  4. 【每日一题】——网购
  5. ​iOS 最新打包发布流程
  6. 开源数据库模型建模工具PDMan v2.2.0源码
  7. Power BI 中 关键影响因素(Key Influencers Visualization)功能详细分析(内附福利)——Power BI迈向AI的一大步?
  8. EXCEL IF函数的简单使用
  9. Windows10+UBUNTU-18.04 -20.04完整新手安装教程
  10. Android 仿微信朋友圈图片效果