升级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位存索引的编码规则:
- 改用全局请求码池为每个Fragment的跳转请求分配唯一的requestCode,开发者传入的原始code不会直接保留在低16位,原有位与解码逻辑完全失效,拿到的解码结果就会呈现随机特征。
- 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
相关产品推荐
相关产品推荐

