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

Android 12设备上App基于WorkManager实现的通知无法显示如何解决

Android 12 环境下 WorkManager 通知不展示修复方案

Android 12(API 31)针对通知、组件跳转新增了多项强制规则,结合WorkManager的历史兼容问题,低版本正常、Android12全设备(含原生模拟器)通知完全不展示的问题,按以下优先级排查修复即可:

  • 最高优先级:修复PendingIntent创建逻辑
    当targetSdkVersion ≥ 31时,所有PendingIntent必须显式声明可变性标志,否则系统会直接抛出IllegalArgumentException,若Worker中未做异常捕获,代码会在通知发送前直接中断,这是该场景下最常见的诱因。
    正确的创建代码如下:
    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)
    
    仅当PendingIntent需要被其他应用修改(比如通知内直接回复、快捷操作)时,才替换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" />
    
  • 快速排查技巧
    1. 给Worker的doWork()方法加全局try-catch,打印异常堆栈,绝大多数场景可以直接定位到具体报错点,无需盲目试错
    2. 优先在原生Android12模拟器上验证,排除国产ROM自定义通知拦截规则的干扰,原生环境验证通过后再适配厂商定制逻辑
    3. 若通知仅不弹出横幅、但能在通知抽屉找到,检查通知渠道的重要性设置,Android12不会自动抬升IMPORTANCE_LOW及以下级别渠道的通知展示优先级

内容的提问来源于stack exchange,提问作者Tomáš Staroň

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 00:16:12