targetSdkVersion升级至31后PendingIntent设FLAG_IMMUTABLE仍崩溃如何解决
修复方案
1 排查自有代码所有PendingIntent创建场景
你当前的适配代码仅覆盖了PendingIntent.getActivity()场景,且未拼接原有业务需要的flag,这是最常见的漏改原因:
- 检查所有
PendingIntent.getBroadcast()、PendingIntent.getService()、PendingIntent.getForegroundService()调用,尤其桌面小组件的RemoteViews绑定点击事件通常会用到getBroadcast(),这类调用全部要加上版本适配 - 不要直接替换原有flag,需要用按位或拼接规则:如果你的业务需要更新PendingIntent的extra、复用已有PendingIntent,需要保留
FLAG_UPDATE_CURRENT等原有flag,示例代码如下:
val pendingFlag = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) { // 不需要系统修改PendingIntent的场景用FLAG_IMMUTABLE // 用于inline回复、气泡通知、小组件交互的场景必须用FLAG_MUTABLE PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT } else { PendingIntent.FLAG_UPDATE_CURRENT } pendingIntent = PendingIntent.getActivity(context, 0, intent, pendingFlag)
2 排查第三方依赖库的适配问题
即使你自己的代码全部适配完成,第三方SDK内部创建的PendingIntent未适配也会触发崩溃:
- 打开Firebase Crashlytics的崩溃堆栈,定位崩溃触发的具体类和方法,如果归属第三方SDK,直接将对应SDK升级到2021年10月之后发布的适配Android12的版本即可
- 重点排查以下组件:
- 各类推送SDK(小米、华为、极光、个推等)
- 广告、统计类SDK
- Jetpack WorkManager需升级到2.7.0及以上版本
3 特殊场景适配
如果你的PendingIntent用于以下场景,必须使用FLAG_MUTABLE,不能用FLAG_IMMUTABLE,否则系统无法修改PendingIntent参数触发对应交互,也会抛出异常:
- 通知的inline回复功能
- 气泡通知功能
- 桌面小组件的交互事件
内容的提问来源于stack exchange,提问作者Oscar Berggren
相关产品推荐
相关产品推荐

