明天和意外你永远都不知道哪一个先来,编程界亦是如此。例如某个已经有原生代码开发模块的项目要求用RN扩张某些功能;又例如,RN中未封装到的组件非得求助于原生代码。所以RN与原生代码通讯对于混合编程是至关重要的。为了实现两者之间的通信,facebook也提供了三种通信方式。
看内容.jpg
RCTDeviceEventEmitter消息机制:由Native主导控制,可以任意时刻传递
Callback回调方式:由js代码调用,原生代码返回。
Promise机制方式:由js调用,只是每次使用都需要调用。
一、RN调用安卓代码(简单)
RN调用安卓原生的代码,大致分为如下几步。
1、用Android Studio打开一个已经创建好的RN项目,选择android/build.gradle文件。
01.jpg
2、创建一个类继承ReactContextBaseJavaModule,在该类中我们应该要暴露出一些让RN调用的方法,封装成一个原生模块。
新建一个类MyReactPackage继承ReactContextBaseJavaModule
02.jpg
public class MyNativeModule extends ReactContextBaseJavaModule{
}
实现getName方法。该方法用于返回RN代码需要寻找的类的名称。(alt+enter快捷键可快速实现父类方法)
@Override
public String getName() {
// 一定要有名字 RN代码要通过名字来调用该类的方法
return "ToastModule";
}
实现类的构造方法。在这里将传入的上下文赋值给类内部私有的上下文
// 创建一个上下文,放到构造函数中,得到reactContext
private ReactApplicationContext mContext;
public MyNativeModule(ReactApplicationContext reactContext){
super(reactContext);
mContext = reactContext;
}
创建暴露给RN调用的方法。但是要用注释符号@ReactMethod修饰。
//方法不能返回值 因为被调用的原生代码是异步的 原生代码执行结束之后只能通过回调函数或者发送消息给RN
@ReactMethod
public void rnCallNative(String msg){
//这个方法是说弹出一个弹窗到界面Toast.makeText(mContext,msg,Toast.LENGTH_LONG).s