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

升级AppCompat版本后OnActivityResult返回异常requestCode问题咨询

AppCompat 1.3+ 版本 requestCode 变化原因及解决方案

核心改动点

你遇到的问题是androidx.appcompat:appcompat从1.3.0版本开始,底层调整了Fragment调用startActivityForResult的请求码编码逻辑,具体变化如下:

  • 1.2.0及更低版本:Fragment调用startActivityForResult时,系统会将Fragment索引存放在requestCode的高16位,开发者传入的自定义请求码存放在低16位,所以之前用requestCode & 0x0000ffff解码的逻辑可以正常拿到原始请求码。
  • 1.3.0及更高版本:底层依赖的AndroidX Activity组件升级到1.2.0以上,引入了新的Activity Result API的底层实现,废弃了原有的高16位存索引的编码规则:
    1. 改用全局请求码池为每个Fragment的跳转请求分配唯一的requestCode,开发者传入的原始code不会直接保留在低16位,原有位与解码逻辑完全失效,拿到的解码结果就会呈现随机特征。
    2. AppCompatActivity的父类ComponentActivity新增了请求码范围校验逻辑,只有符合规则的请求码才会被分发到对应Fragment,Activity层拿到的requestCode已经是系统分配后的完整值,和开发者当初传入的值没有直接关联。

适配方案

你可以根据自己的项目进度选择任意一种适配方式:

  • 方案1:切换到官方推荐的Activity Result API实现跳转回调,该方式不需要手动处理requestCode,是未来的标准实现方案。
  • 方案2:保留原有startActivityForResult逻辑,不在Activity层手动解码请求码:在Activity的onActivityResult中优先调用super.onActivityResult(requestCode, resultCode, data),直接在对应Fragment中重写onActivityResult方法处理回调,此时Fragment中收到的requestCode就是你最初传入的原始值,不需要额外解码。
  • 方案3:继续使用你当前的临时规避方案,通过getActivity().startActivityForResult发起跳转,绕开Fragment的请求码编码逻辑,直接使用Activity的请求码规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:36:04