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

startActivityForResult与RESULT_OK失效,onBackPressed无法回传结果

问题解决:startActivityForResult始终返回RESULT_CANCELED

可能的原因及对应解决方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:52:36