Android 12设备上App基于WorkManager实现的通知无法显示如何解决
Android 12 环境下 WorkManager 通知不展示修复方案
Android 12(API 31)针对通知、组件跳转新增了多项强制规则,结合WorkManager的历史兼容问题,低版本正常、Android12全设备(含原生模拟器)通知完全不展示的问题,按以下优先级排查修复即可:
- 最高优先级:修复PendingIntent创建逻辑
当targetSdkVersion ≥ 31时,所有PendingIntent必须显式声明可变性标志,否则系统会直接抛出IllegalArgumentException,若Worker中未做异常捕获,代码会在通知发送前直接中断,这是该场景下最常见的诱因。
正确的创建代码如下:
仅当PendingIntent需要被其他应用修改(比如通知内直接回复、快捷操作)时,才替换val notifyIntent = Intent(context, MainActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val pendingIntentFlags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE } else { PendingIntent.FLAG_UPDATE_CURRENT } val pendingIntent = PendingIntent.getActivity(context, 0, notifyIntent, pendingIntentFlags)FLAG_IMMUTABLE为FLAG_MUTABLE,其余场景统一使用FLAG_IMMUTABLE。 - 次高优先级:升级WorkManager依赖版本
2.7.1之前版本的WorkManager内部创建PendingIntent时未适配Android12的可变性规则,即使业务代码完全正确,WorkManager在处理任务调度、前台服务启动逻辑时也会触发崩溃,导致Worker提前终止,通知逻辑无法执行。
在模块级build.gradle中将WorkManager依赖升级到2.7.1及以上稳定版即可:implementation "androidx.work:work-runtime-ktx:2.8.1" - 特殊场景检查:全屏通知权限声明
如果通知调用了setFullScreenIntent()实现全屏唤醒(比如闹钟、来电类通知),Android12要求必须在AndroidManifest.xml中声明专属权限,否则通知会被系统直接拦截:<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" /> - 快速排查技巧
- 给Worker的
doWork()方法加全局try-catch,打印异常堆栈,绝大多数场景可以直接定位到具体报错点,无需盲目试错 - 优先在原生Android12模拟器上验证,排除国产ROM自定义通知拦截规则的干扰,原生环境验证通过后再适配厂商定制逻辑
- 若通知仅不弹出横幅、但能在通知抽屉找到,检查通知渠道的重要性设置,Android12不会自动抬升
IMPORTANCE_LOW及以下级别渠道的通知展示优先级
- 给Worker的
内容的提问来源于stack exchange,提问作者Tomáš Staroň
相关产品推荐
相关产品推荐

