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

子Activity onActivityResult回传数据至父Activity时遇异常排查

问题分析与修复方案

首先看你代码里的核心问题:在Activity B中回传结果时,你错误地创建了一个指向A.class的Intent,这会让系统尝试启动一个新的Activity A实例,而不是把结果返回给原来启动B的那个父A实例,这就导致了页面跳转混乱,进而触发了DeadObjectException(生命周期异常引发的Binder通信问题)。

另外还有一个潜在问题:你的父Activity A中判断的requestCode是CAMERA_REQUEST,但启动B时用的是B_Request,这两个值不匹配的话,A的onActivityResult根本不会处理回传的结果。

修复步骤

1. 修正Activity B的onActivityResult方法

去掉Intent中指定目标Activity的代码,只需要创建一个空Intent来携带数据即可,因为setResult会自动把结果返回给启动当前Activity的父实例:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); 
    if(result != null){ 
        if(result.getContents() == null){
            // 用户取消扫码,返回取消状态
            setResult(RESULT_CANCELED);
            finish();
            return; 
        } else { 
            String code = result.getContents();
            // 创建空Intent,只携带数据,不需要指定目标Activity
            Intent intent = new Intent(); 
            intent.putExtra("scannedCode", code); 
            setResult(RESULT_OK, intent); 
            finish();
        } 
    } else { 
        // 不是扫码相关的结果,交给父类处理
        super.onActivityResult(requestCode, resultCode, data); 
    } 
}

2. 统一父Activity A的requestCode

确保A中onActivityResult的requestCode和启动B时用的B_Request一致:

// 先定义统一的requestCode常量(比如在A中)
private static final int B_REQUEST = 1001;

// 启动Activity B的代码
Intent intentB = new Intent(this, B.class);
startActivityForResult(intentB, B_REQUEST);

// 修正后的A的onActivityResult
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode == B_REQUEST){ // 这里用B_REQUEST,和启动时一致
        if(resultCode == RESULT_OK){ 
            String scannedCode = data.getStringExtra("scannedCode"); 
            toastMessage("Scanned code: " + scannedCode); 
        } else if(resultCode == RESULT_CANCELED){
            // 处理用户取消扫码的情况
            toastMessage("扫码已取消");
        }
    } 
}

为什么会出现DeadObjectException?

当你错误地创建指向A.class的Intent并调用setResult后,系统的Activity栈管理出现混乱:原本应该销毁B并回到原来的A实例,结果你又启动了一个新的A,这导致系统在处理Activity生命周期和配置变更时,Binder通信出现异常(因为原有的组件可能已经被意外销毁),从而抛出了这个错误。

按照上面的修正方案,就能正确把扫码结果回传给原来的父Activity A,同时避免异常的发生。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:32:32