RN和安卓交互~~~

先统一一下,第一个是关于RN传递到安卓的:

          /**
     * Callback 方式 RN调用原生回调的方式 jS调用一次,Native返回一次 CallBack为异步操作,返回时机不确定
     * rn调用Native,并获取返回值
     * 安卓这边需要注册
     * @param msg
     * @param callback
     */
    @ReactMethod
    public void rnCallNativeFromCallback(String msg, Callback callback) {
        // 1.处理业务逻辑...
        String result = "处理结果:" + msg;
        // 2.回调RN,即将处理结果返回给RN
        callback.invoke(result);
    }
   NativeModules.MutualInformationModeule.rnCallNativeFromCallback( "我是第一个callback", () => {
                    alert("第一个")
                })
    /**
     * Promise RN调用原生回调的方式 JS调用一次,Native返回一次 每次使用需要JS调用一次
     * 安卓这边需要注册
     * @param msg
     * @param promise
     */
    @ReactMethod
    public void rnCallNativeFromPromise(String msg, Promise promise) {
        try {
            //业务逻辑处理
            Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();
            String componentName = getCurrentActivity().getComponentName().toString();
            promise.resolve(componentName);
        }catch (Exception e){
            promise.reject("100",e.getMessage());//promise 失败
        }
    }
RN调用这个方法
   NativeModules.MutualInformationModeule.rnCallNativeFromPromise('rn调用原生模块的方法-成功啦').then(
            (msg) => {
                console.log('promise成功:'+msg);
            }
        ).catch(
            (err) => {
                console.log(err);
            }
        );

               俩种方式:一个是callback,一种是promise。可以看一下ES6的

----------------------------------------------------------------------------------------------------------------------------------

这个是android原生发送消息到RN

    public static final String EVENT_NAME = "nativeCallRn";

 /**
     * Native调用RN 可任意时刻传递,Native主导控制 个人觉得此种方式缺点小
     * @param msg
     */
    public  void nativeCallRn( String msg) {
        this.getReactNativeHost().getReactInstanceManager().getCurrentReactContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit(EVENT_NAME, msg);
    }

其中RN端需要处理的方式:

    //在组件中使用
    componentWillMount() {
        this.listener = DeviceEventEmitter.addListener('nativeCallRn', this.iseCallback.bind(this));  //对应了原生端的名字
    }

    componentWillUnmount() {
        this.listener && this.listener.remove();  //记得remove哦
        this.listener = null;
}

其中名称要对,标红的地方


------------------------------下面是安卓跳转到RN的---------------------------------------------------------------------


/**
     * js页面跳转到activity 并传数据
     *
     * @param name
     */
    @ReactMethod
    public void startActivityByClassname(String name) {
        try {
            Activity currentActivity = getCurrentActivity();
            if (null != currentActivity) {
                Class aimActivity = Class.forName(name);
                Intent intent = new Intent(currentActivity, aimActivity);
                currentActivity.startActivity(intent);
                currentActivity.finish();
            }
        } catch (Exception e) {
            throw new JSApplicationIllegalArgumentException(
                    "无法打开activity页面: " + e.getMessage());
        }
    }




    /**
     * 从js跳转页面到原生的,并且传递数据
     *
     * @param name
     * @param params
     */
    @ReactMethod
    public void startActivity(String name, String params) {
        try {
            Activity currentActivity = getCurrentActivity();
            if (null != currentActivity) {
                Class toActivity = Class.forName(name);
                Intent intent = new Intent(currentActivity, toActivity);
                intent.putExtra("params", params);
                currentActivity.startActivity(intent);
                currentActivity.finish();
            }
        } catch (Exception e) {
            throw new JSApplicationIllegalArgumentException(
                    "不能打开Activity : " + e.getMessage());
        }
    }


    /**
     * Activtiy跳转到JS页面,传输数据
     *
     * @param successBack
     * @param errorBack
     */
    @ReactMethod
    public void dataToJS(Callback successBack, Callback errorBack) {
        try {
            Activity currentActivity = getCurrentActivity();
            String result = currentActivity.getIntent().getStringExtra("data");
            if (TextUtils.isEmpty(result)) {
                result = "没有数据";
            }
            successBack.invoke(result);
        } catch (Exception e) {
            errorBack.invoke(e.getMessage());
        }
    }
然后正确的姿势可以看一下我demo,放在github上面了,有意向的上去下载记得来颗星星。。。。

 https://github.com/FOXwei/RN-InteractionAndroidDemo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值