本来想将这个记录到 react-native遇到的坑 一篇中去的,但为了记住这个明显的差异,独立出来。
原生开发中,我们是用startActivityForResult(intent,requestCode)配合onActivityResult(int requestCode, int resultCode, Intent data)获取从另一个activity返回的数据。
在ReactNative-Android中,我们在rn中调用原生模块,像往常一样重写了onActivityResult,发现根本没调用。
正确的方式:
方式1. 构造函数里添加ActivityEventListener监听,实现onActivityResult()方法
方式 2. 继承BaseActivityEventListener
一个简单的二维码扫描的例子说明。
public class ScannerModule extends ReactContextBaseJavaModule{
private final int REQUEST_ECODE_SCAN=1;
private Promise mPromise;
private ReactApplicationContext mContext;
public ScannerModule(ReactApplicationContext reactContext) {
super(reactContext);
mContext=reactContext;
mContext.addActivityEventListener(mActivityEventListener );
}
@Override
public String getName() {
return "ScannerModule";
}
private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {
@Override
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
if(mPromise!=null&&requestCode==REQUEST_ECODE_SCAN){
if (resultCode == Activity.RESULT_CANCELED) {
mPromise.reject("300", "Image picker was cancelled");
}else if(resultCode==RESULT_OK&&data.getData()!=null){
String result=data.getStringExtra("codedContent");
mPromise.resolve(result);
}else{
mPromise.reject("203","二维码识别失败,请稍候再试");
}
mPromise=null;
}
}
};
@ReactMethod
public void requestEcoderScan(final Promise promise){
this.mPromise=promise;
Activity activity=getCurrentActivity();
if (activity == null) {
mPromise.reject("E_ACTIVITY_DOES_NOT_EXIST", "Activity doesn't exist");
return;
}
try{
Intent intent=new Intent(activity, CaptureActivity.class);
activity.startActivityForResult(intent,REQUEST_ECODE_SCAN);
}catch (Exception e){
mPromise.reject("START_ACTIVITY_ERROR", "" +
"START_ACTIVITY_ERROR");
mPromise=null;
}
}
}
这里使用了promise。关于promise用法请移步官方文档
js中的调用
scanEcode(){
NativeModules.ScannerModule.requestEcoderScan()
.then(function(result){
//成功回调
return result;
})
.catch(function(error) {
//失败回调
console.log('There has been a problem with your fetch operation: ' + error.message);
});
}