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

Android中三个类通过Intent传递数据:回传变量未更新问题

解决Activity间数据回传失效的问题

嘿,我知道你遇到的问题了!你现在的核心问题是类B向类C传递数据后,没法接收C修改后的回传值——因为你用普通的startActivity启动C,这种方式只是单向打开新页面,没法把数据从C主动送回B。咱们用「带结果返回」的Activity启动机制就能解决这个问题,下面分两种方案给你说明:

方案一:使用旧版startActivityForResult(兼容低版本)

这种方式是传统的回传实现,适合还在使用非AndroidX库的项目:

1. 修改类B启动类C的代码

把原来普通的startActivity替换成带请求码的启动方式:

// 类B中启动C的代码
Intent intent = new Intent(B.this, C.class);
intent.putExtra("name", Uname); // 把当前的name传给C
startActivityForResult(intent, 100); // 100是自定义请求码,只要唯一就行

2. 类C中修改数据并返回给B

在C中修改完name为"Ramesh"后,通过setResult把数据回传:

// 类C中的处理逻辑
String modifiedName = "Ramesh";
Intent resultIntent = new Intent();
resultIntent.putExtra("modified_name", modifiedName);
setResult(RESULT_OK, resultIntent); // 设置成功状态和回传数据
finish(); // 关闭C页面,回到B

3. 类B中重写回调接收结果

在B中重写onActivityResult方法,接收C返回的数据并更新Uname:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 匹配请求码和结果状态,确保是C返回的有效数据
    if (requestCode == 100 && resultCode == RESULT_OK) {
        String updatedName = data.getStringExtra("modified_name");
        Uname = updatedName; // 这里Uname就会被更新为"Ramesh"了
        // 可以在这里更新UI或者执行其他后续逻辑
    }
}

方案二:使用新版Activity Result API(AndroidX推荐)

如果你的项目已经迁移到AndroidX,推荐用这种更安全、更灵活的方式,替代已废弃的startActivityForResult:

1. 类B中注册Activity Result回调

在B的类成员中注册一个回调,用于接收C返回的结果:

// 类B的成员变量
private ActivityResultLauncher<Intent> startCForResult = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        if (result.getResultCode() == RESULT_OK) {
            Intent data = result.getData();
            if (data != null) {
                String updatedName = data.getStringExtra("modified_name");
                Uname = updatedName; // 更新Uname为"Ramesh"
                // 处理更新后的逻辑,比如刷新UI显示新值
            }
        }
    }
);

2. 类B中启动类C的代码

用刚才注册的Launcher来启动C,代替普通的startActivity:

Intent intent = new Intent(B.this, C.class);
intent.putExtra("name", Uname);
startCForResult.launch(intent);

3. 类C的返回代码(和方案一一致)

String modifiedName = "Ramesh";
Intent resultIntent = new Intent();
resultIntent.putExtra("modified_name", modifiedName);
setResult(RESULT_OK, resultIntent);
finish();

为什么原来的方式不行?

你之前直接用startActivity启动C,相当于创建了一个独立的C实例,C里修改的数据只是在自己的实例里,没法主动通知B更新。只有通过「请求-返回结果」的机制,让B在回调中接收C返回的新数据,才能把B里的Uname更新为预期的"Ramesh"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:49:21