美文网首页混合式开发
ReactNative与java交互

ReactNative与java交互

作者: Simplelove_f033 | 来源:发表于2019-03-04 01:06 被阅读134次

    在ReactNative中与Android进行交互

    第一实现ReactContextBaseJavaModule接口,

    在ReactContextBaseJavaModule中与React交互的方法需要@ReactMethod注解:如下

        public class ToastExampleMoudle extends ReactContextBaseJavaModule {
            private static final String MESSAGE = "MESSAGE";
            public ToastExampleMoudle(ReactApplicationContext reactContext) {
                super(reactContext);
            }
            @Nullable
            @Override
            public Map<String, Object> getConstants() {
                //让js那边能够使用这些常量
                Map<String,Object> constants = new HashMap<>();
                return constants;
            }
    
            @ReactMethod
            public void show(int duration){
                Toast.makeText(getReactApplicationContext(), "dongnao:" + duration, Toast.LENGTH_SHORT).show();
            }
            @ReactMethod
            public void testAndroidCallBack(String msg, Callback callback) {
                Toast.makeText(getReactApplicationContext(),msg,Toast.LENGTH_LONG).show();
                callback.invoke("david");
            }
            @ReactMethod
            public void textAndroidPromiseMethod(String msg, Promise promise){
                Toast.makeText(getReactApplicationContext(),msg,Toast.LENGTH_SHORT).show();
                String result = "david";
                promise.resolve(result);
            }
        @ReactMethod
            public void onScaning() {
                WritableMap params = Arguments.createMap();
                params.putString("key","mydata");
                getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                        .emit("EventName", params);
            }
            @Override
            public String getName() {
                return "ToastForAndroid";//名称
            }
    
            @Override
            public boolean canOverrideExistingModule() {
                return true;
            }
        }
    

    上面代码中我使用四种方式与react交互
    1、show方法直接获得react数据
    2、testAndroidCallBack方法获得react数据之后需要放回数据给react这里采用Callback接口回调
    3、textAndroidPromiseMethod方法是Promise返回给react数据
    4、onScaning方法是react调用Java

    第二步、实现ReactPackage接口

    在实现ReactPackage接口之后 需要在实现的接口中需要添加Module模块
    如下:

        /注册模块
        public class ExampleReactNativePackage implements ReactPackage {
        //完成注入需要被js调用java方法
            @Override
            public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
                List<NativeModule> modules = new ArrayList<>();
                modules.add(new ToastExampleMoudle(reactContext));
                return modules;
            }
    
            @Override
            public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
                return Collections.emptyList();
            }
        }
    

    第三步 需要在MainApplication中重写getPackage方法将注册ExampleReactNativePackage添加进去
    如下

          private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
            @Override
            public boolean getUseDeveloperSupport() {
              return BuildConfig.DEBUG;
            }
    
            @Override
            protected List<ReactPackage> getPackages() {
              return Arrays.<ReactPackage>asList(
                  new MainReactPackage(),
                      new ExampleReactNativePackage()//添加进去
              );
            }
            @Override
            protected String getJSMainModuleName() {
              return "index";
            }
          };
    

    第四、js调用原生的
    需要导入import {NativeModules} from 'react-native';
    如下

        import React, {Component} from 'react';
        import {Platform, StyleSheet,ToastAndroid, DeviceEventEmitter,Text, TouchableOpacity,View,NativeModules} from 'react-native';
    
        export default class App extends Component<Props> {
          constructor(props){
            super(props);
            this.state= {
              text:"river",
              text2: "默认",
            }
    
            }
    
            componentDidMount(): void {
              //观察者对象     监听java  调用js
              DeviceEventEmitter.addListener("EventName",function (msg) {
                let rest = NativeModules.ToastForAndroid.MESSAGE;
                ToastAndroid.show("DeviceEventEmitter收到消息:" + "\n" + rest, ToastAndroid.SHORT)
              })
    
            }
    
          _onPressButton(){
            NativeModules.ToastForAndroid.show(1000);//表示传递数据给java
          }
    
          _onPressButton2(){
          //表示表示传递数据给java之后, Java返回数据给js
            NativeModules.ToastForAndroid.testAndroidCallBack("hello David",(result)=>{
                this.setState({
                  text: result
                })
            });
          }
    
          _onPressButton3(){
            //表示表示传递数据给java之后, Java通过Promise返回数据给js
            NativeModules.ToastForAndroid.textAndroidPromiseMethod("hello David").then((result)=>{
              this.setState({
                text2: result
              })
            })
          }
          _onPressButton4(){
          //java传递传递数据给js
            NativeModules.ToastForAndroid.onScaning();
          }

    相关文章

      网友评论

        本文标题:ReactNative与java交互

        本文链接:https://www.haomeiwen.com/subject/dyimuqtx.html