You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native裸工作流:自定义模块如何实现ActivityEventListener?

解决React Native自定义模块无法接收Activity返回结果的问题

1. 修复MainActivity中ReactInstanceManager的初始化问题

你当前的MainActivity仅声明了mReactInstanceManager但未初始化,直接调用onActivityResult会触发空指针异常。由于继承了DevMenuAwareActivity,可以通过父类提供的方法直接获取实例,无需手动声明变量:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 通过父类方法获取实例,避免空指针
    getReactInstanceManager().onActivityResult(this, requestCode, resultCode, data);
}

如果DevMenuAwareActivity未提供getReactInstanceManager()方法,可通过ReactActivityDelegate获取:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    getDelegate().getReactInstanceManager().onActivityResult(this, requestCode, resultCode, data);
}

2. 修正PaymentModule中的核心问题

(1)补全ReactMethod的Promise参数

你的openExampleApp方法未将Promise作为参数传入,导致this.promise = promise是无效赋值,后续无法正常回调结果:

@ReactMethod
public void openExampleApp(String amount, String messageType, String currencyCode, String currencyFraction, String currencyAlpha, String transactionId, Promise promise) {
    try {
        Log.d("PaymentModule", "Trigger openPaxPayment Fn: "+amount);
        this.promise = promise; // 正确赋值传入的Promise
        Intent paymentIntent = new Intent("com.my.example.REQUEST");
        // 填充Intent参数
        paymentIntent.putExtra("MESSAGE_TYPE", messageType);
        paymentIntent.putExtra("AMOUNT", amount);
        paymentIntent.putExtra("CURRENCY_CODE", currencyCode);
        paymentIntent.putExtra("CURRENCY_FRACTION", currencyFraction);
        paymentIntent.putExtra("CURRENCY_ALPHA", currencyAlpha);
        paymentIntent.putExtra("MERCHANT_TRS_ID", transactionId);
        // 移除多余的dataBundle参数,startActivityForResult无需传入已在Intent中的extras
        getReactApplicationContext().startActivityForResult(paymentIntent, 8888, null);
    } catch (Exception e) {
        Log.d("PaymentModule Err", String.valueOf(e));
        promise.reject("ERROR", e.getMessage()); // 异常时必须reject Promise,避免RN端挂起
        e.printStackTrace();
    }
}

(2)完善onActivityResult的逻辑处理

需要判断请求码和结果码,避免错误回调,同时处理data为空的边界情况:

@Override
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
    // 仅处理我们发起的请求
    if (requestCode == 8888 && this.promise != null) {
        if (resultCode == Activity.RESULT_OK && data != null) {
            this.promise.resolve(data.getDataString());
        } else if (resultCode == Activity.RESULT_CANCELED) {
            this.promise.reject("CANCELED", "用户取消了操作");
        } else {
            this.promise.reject("FAILED", "操作失败,结果码:" + resultCode);
        }
        // 重置promise,避免重复调用导致异常
        this.promise = null;
    }
}

(3)移除多余的Bundle参数

调用startActivityForResult时,第三个参数是用于设置额外启动选项(如动画、窗口模式),而非传递Intent的extras。你的Intent已经通过putExtra添加了参数,直接传null即可。

3. 确保模块正确注册

确认你的PaymentModule已在自定义Package中注册:

public class PaymentPackage implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();
        modules.add(new PaymentModule(reactContext));
        return modules;
    }

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

然后在MainApplication的getPackages()方法中添加该Package。


内容的提问来源于stack exchange,提问作者Franz Pichardo Rodriguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:35:47