关于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
相关产品推荐
相关产品推荐

