React Native桥接Android模块-RN获取Activity回调

React Native桥接Android模块-RN获取Activity回调

1.创建模块类

public class RNManagerModule extends ReactContextBaseJavaModule {
    private Context mContext;
    private static final int REQUEST_CODE = 1;
    public RNManagerModule(ReactApplicationContext reactContext) {
        super(reactContext);
        mContext = reactContext;
		//添加Activity回调的监听
        reactContext.addActivityEventListener(mActivityEventListener);
    }

    @Override
    public String getName() {
        return "RNManagerModule";
    }

private Callback mDoneCallback;
private Callback mCancelCallback;
  //实现回调
  private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {

        @Override
        public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent intent) {
            if (requestCode == REQUEST_CODE) {

                if (mDoneCallback != null) {

                    if (resultCode == Activity.RESULT_CANCELED) {
                        mCancelCallback.invoke("取消");
                    } else {
                        WritableMap map = Arguments.createMap();
                        map.putString("result", intent.getExtras().getString("result"));
                        mDoneCallback.invoke(map);
                    }

                }

                mCancelCallback = null;
                mDoneCallback = null;
            }
        }
    };

//    RN跳转Activity并实现Activity回调
    @ReactMethod
    public void RNActivityResult(final ReadableMap map, final Callback onDone, final Callback onCancel){
        String strData = map.hasKey("strData") ? map.getString("strData") : "0";
        Log.e("RN传来的数据", strData);
        Intent intent = new Intent(getCurrentActivity(), RnActivity.class);
        mCancelCallback = onCancel;
        mDoneCallback = onDone;
        intent.putExtra("strData", strData);
        getCurrentActivity().startActivityForResult(intent, REQUEST_CODE);
    }	
}

RnActivity的主要代码

Intent returnIntent = new Intent();
        returnIntent.putExtra("result", "RNActivity返回的数据");
        setResult(Activity.RESULT_OK, returnIntent);
        finish();

2.注册模块

public class RNPackage implements ReactPackage {
    @Override
     public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }


    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules=new ArrayList<>();
        //将我们创建的类添加进原生模块列表中
        modules.add(new RNManagerModule(reactContext));
        return modules;
    }

}

3.Android包的注册

将RNPackage添加到 MainApplication.java 中的 getPackages() 方法中
在这里插入图片描述

js调用原生代码

import { NativeModules, DeviceEventEmitter } from 'react-native';

<Button 
  title="RN获取Activity相关的回调"
  onPress={() => {
            NativeModules.RNManagerModule.RNActivityResult({strData:'RN向Android传输的数据'},(onDone)=>{console.log('onDone-->',onDone.result)},(onCancel) => {console.log('onCancel-->',onCancel)});
	        }}
	        />

RN调用Android需要module名和方法名相同,而Android调用RN只需要方法名相同。
(1)RCTDeviceEventEmitter 事件方式
优点:可任意时刻传递,Android主导控制。 可以用于多线程
(2)Callback 回调方式
优点:JS调用,Android返回。
缺点:CallBack为异步操作,返回时机不确定
(3)Promise
优点:JS调用,Android返回。
缺点:每次使用需要JS调用一次
(4)直传常量数据(原生向RN)
跨域传值,只能从原生端向RN端传递。RN端可通过 NativeModules.[module名].[参数名] 的方式获取。
注意:RN层调用NativeModule层进行界面跳转时,需要设置FLAG_ACTIVITY_NEW_TASK标志

相关链接

1. React Native桥接Android模块-Toast
2. React Native桥接Android模块-Activity
3. React Native桥接Android模块-用Promise机制调用安卓原生代码
4. React Native桥接Android模块-callback回调方式
5.React Native桥接Android模块-RNDeviceEventEmitter方式
6. React Native桥接Android模块-多线程RNDeviceEventEmitter方式
7.React Native桥接Android模块-RN获取Activity回调

参考链接

Android原生与RN如何交互通信
RN与原生通讯(安卓篇)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值