You need to enable JavaScript to run this app. Android Fragment使用ActivityResultContract时返回结果异常
优惠活动
大模型
产品
解决方案
定价
更多

Android Fragment使用ActivityResultContract时返回结果异常

问题根因
  • 你在FragmentB中编写的返回结果逻辑,完全违背了Android Activity的结果传递机制,这是导致回调始终收到RESULT_CANCELED、Uri为空的核心原因。
  • 你构造完携带Uri的Intent后,错误调用了startActivity(intent):该方法的作用是根据Intent启动一个新的Activity,这个Intent的作用域属于新启动的页面,和当前ActivityB的返回结果没有任何关联。
  • 当你调用requireActivity().finish()销毁ActivityB时,系统会读取Activity内通过setResult()配置的返回值;由于你全程没有调用过setResult()方法,系统会默认返回RESULT_CANCELED,你在自定义Contract中写的解析逻辑自然无法接收到正确的Uri。
代码中的具体错误
  • 错把「回传给启动方的结果Intent」当成了「启动新页面的跳转Intent」,额外触发了无意义的新页面启动流程。
  • 给Intent配置的FLAG_ACTIVITY_REORDER_TO_FRONT是页面跳转场景的专属Flag,在返回结果场景下没有任何生效逻辑。
  • 整个返回流程缺失了最关键的setResult调用,完全没有把携带Uri的Intent告知系统需要随ActivityB的销毁回传给FragmentA。
修正后的FragmentB代码
Uri uri = Uri.parse("custom://thank_you?id=" + id + "&amt_paid=" + totalPaidAmt + "&order_type=" + orderType);
Intent intent = new Intent();
intent.setData(uri);
// 移除错误的startActivity调用和跳转类Flag
requireActivity().setResult(Activity.RESULT_OK, intent);
requireActivity().finish();
机制补充
  • ActivityResultContract的回调触发,完全依赖被启动的目标Activity在销毁时,通过setResult回传的固定结果码和Intent内容,和目标页面内部的其他跳转逻辑没有关联。
  • 只要目标Activity在销毁前没有主动配置RESULT_OK级别的返回结果,无论你在Contract中实现了什么解析逻辑,都只会拿到系统默认的取消状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 08:24:01