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