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

React Native Android模块如何正确实现onActivityResult方法

报错原因

你遇到cannot find symbol onActivityResult报错的根本原因是*ReactContextBaseJavaModule基类本身不存在onActivityResult方法*,直接加@Override注解尝试重写自然会提示找不到符号。onActivityResult是Android Activity的生命周期回调,在RN原生模块里不能直接重写,需要通过RN提供的ActivityEventListener接口来接收事件。

正确实现方案

按以下步骤修改即可:

  • 让你的Module类实现ActivityEventListener接口
  • 在Module构造方法中,向React上下文注册当前实例为Activity事件监听器
  • 实现接口要求的两个方法,在onActivityResult中编写你的结果处理逻辑
  • 不要调用不存在的super.onActivityResult,同时修正原代码中错误的Activity.this上下文引用
  • 在RN实例销毁时移除事件监听,避免内存泄漏

修改后的完整可运行代码参考:

public class RNWhatsAppStickersModule extends ReactContextBaseJavaModule implements ActivityEventListener {
    private static final int REQUEST_CODE = 替换成你自己定义的请求码常量;
    private final ReactApplicationContext reactContext;

    public RNWhatsAppStickersModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
        // 注册Activity事件监听
        reactContext.addActivityEventListener(this);
    }

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

    // 示例:你原来启动Activity的方法,需要从当前挂载的Activity调用startActivityForResult
    @ReactMethod
    public void launchTargetActivity() {
        Activity currentActivity = getCurrentActivity();
        if (currentActivity == null) return;
        Intent intent = new Intent(currentActivity, 你要启动的目标Activity.class);
        currentActivity.startActivityForResult(intent, REQUEST_CODE);
    }

    @Override
    public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
        // 这里不要调用super.onActivityResult,接口没有默认实现
        if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK && data != null) {
            try {
                String requiredValue = data.getStringExtra("key");
                // 拿到结果后如果需要回传给JS层,可以通过发送事件、或者之前保存的Promise回调传递
            } catch (Exception ex) {
                // 直接用方法入参的activity作为上下文即可,原代码的Activity.this是错误写法
                Toast.makeText(activity, ex.toString(), Toast.LENGTH_SHORT).show();
            }
        }
    }

    // 接口要求必须实现的方法,不需要处理新Intent场景的话留空即可
    @Override
    public void onNewIntent(Intent intent) {}

    @Override
    public void onCatalystInstanceDestroy() {
        super.onCatalystInstanceDestroy();
        // 移除监听避免内存泄漏
        reactContext.removeActivityEventListener(this);
    }
}

注意事项:

  • 不要在Module类里长期持有Activity的强引用,需要使用Activity时随时调用getCurrentActivity()获取即可,避免内存泄漏
  • 如果需要把Activity返回结果同步给JS层,建议配合Promise实现:调用启动方法时传入Promise实例存为成员变量,在onActivityResult触发时调用resolve返回结果、reject返回异常,处理完成后把Promise引用置空。

内容的提问来源于stack exchange,提问作者CrackerKSR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:01:04