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

关于Android中startActivityForResult与onActivityResult的行为疑问

关于多次调用startActivityForResult的行为解析

嘿,我来帮你理清这个场景下的运行逻辑——其实这个机制的核心就是请求码(requestCode),它就是用来区分不同跳转请求的关键,咱们一步步拆解:

核心运行逻辑

  • 请求码的唯一性标识
    你每次调用startActivityForResult(intent, requestCode)时传入的不同requestCode,会在Activity2返回结果时原封不动地带回Activity1的onActivityResult(int requestCode, int resultCode, Intent data)方法里。不管你跳多少次,只要requestCode不一样,就能在onActivityResult里精准对应到每一次跳转请求,绝对不会搞混。

  • 独立的返回流程
    当Activity2里调用setResult(RESULT_OK, intent)(或其他resultCode)然后finish()时,系统会把携带mystr的Intent和对应的requestCode绑定后传递回Activity1。哪怕你先后打开了两个Activity2实例,系统也会分别处理每个实例的返回,不会出现数据串线的情况——因为每个跳转请求都有专属的requestCode标记。

常见坑点&注意事项

  • 绝对不要给两次跳转设置相同的requestCode!如果requestCode重复,onActivityResult里根本没法区分是哪一次的返回结果,直接导致逻辑混乱。
  • 确保Activity2在finish前调用了setResult():如果用户直接按返回键(没手动设置结果),Activity1会收到RESULT_CANCELED的resultCode,此时data大概率是null,一定要做好非空判断,避免空指针异常。
  • 若Activity1跳转后被系统回收(比如后台内存不足),重新创建时onActivityResult仍会正常触发,但建议在onSaveInstanceState里保存关键状态,防止数据丢失。

代码示例参考

Activity1中发起两次跳转

// 第一次跳转,请求码设为1001
Intent intentFirst = new Intent(this, Activity2.class);
startActivityForResult(intentFirst, 1001);

// 第二次跳转,请求码设为1002(与第一次不同)
Intent intentSecond = new Intent(this, Activity2.class);
startActivityForResult(intentSecond, 1002);

Activity2中返回数据

// 假设满足特定条件时返回携带mystr的结果
if (specificConditionIsMet) {
    Intent resultIntent = new Intent();
    resultIntent.putExtra("mystr", "这里是要返回的字符串内容");
    setResult(RESULT_OK, resultIntent);
} else {
    // 不满足条件时返回取消状态
    setResult(RESULT_CANCELED);
}
finish();

Activity1中处理返回结果

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    // 先判断结果是否正常返回
    if (resultCode == RESULT_OK && data != null) {
        String mystr = data.getStringExtra("mystr");
        // 通过requestCode区分两次跳转的返回
        switch (requestCode) {
            case 1001:
                // 处理第一次跳转的返回结果
                Log.d("Activity1", "第一次返回的mystr: " + mystr);
                break;
            case 1002:
                // 处理第二次跳转的返回结果
                Log.d("Activity1", "第二次返回的mystr: " + mystr);
                break;
        }
    } else if (resultCode == RESULT_CANCELED) {
        // 处理取消返回的情况
        Log.d("Activity1", "跳转请求被取消");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:21:37