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

Fragment使用ActivityResultLauncher跨多Activity跳转后返回回调未触发求助

编辑更新
我之前遗漏了测试应用和正式项目的核心差异:测试应用跳转流程为Activity > DialogFragment > VideoViewer,正式项目跳转流程为Fragment > DialogFragment > PreviewActivity > VideoViewer。移除PreviewActivity后回调可以正常触发,但我需要保留任务预览环节,请问跨多个Activity跳转后如何正确获取ActivityResult返回结果?


解答

问题根因

ActivityResult的回调遵循栈内逐层回传规则,你在MainFragment中注册的launcher仅接收它直接启动的Activity的返回结果。加入PreviewActivity后,VideoViewer的结果只会返回给它的上一层Activity也就是PreviewActivity,不会直接穿透到MainFragment,因此回调无法触发。

解决方案:中间层结果转发

只需要让中间的PreviewActivity承担结果转发的职责即可,改动量极小:

  1. 调整TaskListDialog的启动逻辑,用传入的launcher启动PreviewActivity而非直接启动VideoViewer,把需要传递给VideoViewer的参数先带入PreviewActivity
// TaskListDialog中启动逻辑修改
Intent previewIntent = new Intent(TaskListDialog.this.getActivity(), PreviewActivity.class);
previewIntent.putExtra("media", response.body());
launcher.launch(previewIntent);
  1. 在PreviewActivity中单独注册一个launcher用于启动VideoViewer,收到VideoViewer的返回结果后直接原封不动回传给上层
// PreviewActivity全局注册launcher,必须在onCreate/onAttach阶段初始化
private ActivityResultLauncher<Intent> videoLauncher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        // 直接转发结果给上一层,不需要额外处理
        setResult(result.getResultCode(), result.getData());
        finish();
    }
);

// PreviewActivity中跳转到VideoViewer的逻辑
Intent watchVideo = new Intent(this, VideoViewer.class);
watchVideo.putExtra("media", getIntent().getSerializableExtra("media"));
videoLauncher.launch(watchVideo);

注意事项

  • 所有registerForActivityResult调用必须放在Activity/Fragment的生命周期STARTED之前(也就是全局初始化或者onCreate/onAttach阶段执行),禁止在点击事件等动态场景中注册
  • 确认VideoViewer中自定义的RESULT_OK值和系统标准Activity.RESULT_OK(值为-1)一致,避免结果码匹配失败
  • 如果后续跳转层级更多,每一层中间Activity都按照同样的逻辑转发结果即可,最上层的launcher就能正常收到回调

内容的提问来源于stack exchange,提问作者Edgar M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 05:51:04