startActivityForResult与RESULT_OK失效,onBackPressed无法回传结果
可能的原因及对应解决方案
1. 确认Activity A的启动代码正确
确保启动Activity B时使用startActivityForResult而非普通startActivity:
Intent intent = new Intent(ActivityA.this, ActivityB.class); startActivityForResult(intent, REQUEST_CODE_PLAYBACK);
(注:若项目targetSdkVersion ≥ 30,建议使用ActivityResultContracts.StartActivityForResult替代旧API;若坚持使用onActivityResult,需保证启动方式正确)
2. 检查Activity B的launchMode配置
打开AndroidManifest.xml,确认Activity B的launchMode为默认的standard,禁止设置为singleTask或singleInstance:
<activity android:name=".ActivityB" android:launchMode="standard" /> <!-- 保持默认或显式声明standard -->
非standard的launchMode会让Activity B运行在独立任务栈中,导致结果无法正确回传给Activity A。
3. 修正onBackPressed的实现逻辑
不要同时调用finish()和super.onBackPressed()——super.onBackPressed()内部已包含finish()操作,重复调用会覆盖返回结果。
正确写法二选一:
- 方式一:调用super.onBackPressed()
@Override public void onBackPressed() { Intent intent = new Intent(); intent.putExtra("Title", "Sending the title back to MainActivity"); setResult(RESULT_OK, intent); super.onBackPressed(); // 内部自动执行finish,无需额外调用 }
- 方式二:手动调用finish()
@Override public void onBackPressed() { Intent intent = new Intent(); intent.putExtra("Title", "Sending the title back to MainActivity"); setResult(RESULT_OK, intent); finish(); // 不要调用super.onBackPressed(),避免重复销毁Activity }
4. 修正返回按钮的点击事件逻辑
自定义Toolbar返回按钮时,设置结果后直接调用finish()即可,无需调用super.onBackPressed():
ImageButton toolBarBackButton = toolBar.findViewById(R.id.player_back_button); toolBarBackButton.setOnClickListener(v -> { Intent i = new Intent(); i.putExtra("Title", "Sending the title back to MainActivity"); setResult(RESULT_OK, i); finish(); // 直接销毁当前Activity并返回结果 });
同时确保未为Toolbar设置默认导航点击监听(如toolbar.setNavigationOnClickListener),避免覆盖自定义逻辑。
5. 检查Activity B的Manifest配置
确认Activity B未设置android:noHistory="true"——该属性会让Activity销毁时不保留历史栈,无法返回结果:
<activity android:name=".ActivityB" <!-- 移除android:noHistory="true"配置 --> />
6. 排查是否有其他逻辑干扰返回结果
检查Activity B中是否有其他代码在返回前调用了finish(),或在setResult(RESULT_OK)后又调用setResult(RESULT_CANCELED),导致结果被覆盖。
内容的提问来源于stack exchange,提问作者Simran Thakkar

