Android升级One UI 4.1后Pushy.me API推送通知失效问题
问题根因
报错日志已经明确给出原因:Android 12(API 31,对应你升级的One UI 4.1系统)新增强制规则:targetSdk为31及以上的应用,创建PendingIntent时必须显式声明FLAG_IMMUTABLE或FLAG_MUTABLE标志,缺失则直接抛出IllegalArgumentException。
你原有代码创建PendingIntent时仅传入了FLAG_UPDATE_CURRENT,未满足系统新版本要求,导致Pushy SDK接收到推送、反射调用你的PushReceiver时直接崩溃,通知无法弹出。
修复方案
你的使用场景是点击通知跳转固定的MainActivity,不需要后续修改PendingIntent内容,按照官方推荐使用FLAG_IMMUTABLE即可,仅需修改通知构建代码中setContentIntent对应的PendingIntent创建逻辑。
原生兼容写法(无额外依赖,适配全版本)
将原有创建PendingIntent的代码替换为版本适配逻辑:
// 初始化基础flag int pendingIntentFlags = PendingIntent.FLAG_UPDATE_CURRENT; // API 23及以上系统追加IMMUTABLE标志,兼容API31+的强制要求 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { pendingIntentFlags |= PendingIntent.FLAG_IMMUTABLE; } // 替换原有setContentIntent调用 .setContentIntent(PendingIntent.getActivity( context, 0, new Intent(context, Main.class), pendingIntentFlags ))
AndroidX简化写法
如果项目已经引入AndroidX Core依赖(绝大多数AndroidX项目默认集成),可以直接用PendingIntentCompat自动完成版本适配,不需要手动判断系统版本:
先确认模块级build.gradle中存在依赖(纯Java项目去掉-ktx后缀即可):
dependencies { implementation "androidx.core:core-ktx:1.9.0" }
直接替换代码:
.setContentIntent(PendingIntentCompat.getActivity( context, 0, new Intent(context, Main.class), PendingIntent.FLAG_UPDATE_CURRENT, false // 传入false即为使用FLAG_IMMUTABLE ))
补充说明
- 只有当你需要后续更新PendingIntent携带的Intent数据、实现通知内联回复、通知气泡这类特殊功能时,才需要使用
FLAG_MUTABLE,普通跳转场景一律使用FLAG_IMMUTABLE,符合官方安全规范。 - 修改后重新编译安装应用,推送即可正常展示。
内容的提问来源于stack exchange,提问作者Newbie Net Doc
相关产品推荐
相关产品推荐

