Fragment使用ActivityResultLauncher跨多Activity跳转后返回回调未触发求助
编辑更新
我之前遗漏了测试应用和正式项目的核心差异:测试应用跳转流程为Activity > DialogFragment > VideoViewer,正式项目跳转流程为Fragment > DialogFragment > PreviewActivity > VideoViewer。移除PreviewActivity后回调可以正常触发,但我需要保留任务预览环节,请问跨多个Activity跳转后如何正确获取ActivityResult返回结果?
解答
问题根因
ActivityResult的回调遵循栈内逐层回传规则,你在MainFragment中注册的launcher仅接收它直接启动的Activity的返回结果。加入PreviewActivity后,VideoViewer的结果只会返回给它的上一层Activity也就是PreviewActivity,不会直接穿透到MainFragment,因此回调无法触发。
解决方案:中间层结果转发
只需要让中间的PreviewActivity承担结果转发的职责即可,改动量极小:
- 调整TaskListDialog的启动逻辑,用传入的launcher启动PreviewActivity而非直接启动VideoViewer,把需要传递给VideoViewer的参数先带入PreviewActivity
// TaskListDialog中启动逻辑修改 Intent previewIntent = new Intent(TaskListDialog.this.getActivity(), PreviewActivity.class); previewIntent.putExtra("media", response.body()); launcher.launch(previewIntent);
- 在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
相关产品推荐
相关产品推荐

