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
相关产品推荐
相关产品推荐

