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

Android Oreo中GCM推送通知图标在应用关闭/后台时显示白块问题

解决GCM后台/关闭状态下通知图标显示白方块的问题

我之前也碰到过几乎一模一样的GCM通知图标坑,结合你的代码和配置来看,核心问题出在后台通知的系统处理逻辑和资源归属上,咱们一步步来解决:

关键认知:后台/关闭状态下的通知不走你的代码!

当应用在后台或完全关闭时,GCM推送的notification类型消息是由Android系统直接接管展示的,根本不会触发你PushNotification模块里的onMessageReceived方法!这就是为什么前台(应用运行时)图标正常,后台却出问题——前台是你自己构建通知并指定图标,后台是系统用默认配置找图标。

具体解决步骤

1. 把通知图标移到主App模块

系统处理后台通知时,会优先从主App模块的资源池中查找默认图标,而不是依赖子模块(PushNotification)的资源。哪怕你在PushNotification的Manifest里配置了default_notification_icon,合并后的Manifest可能因为资源引用路径问题,系统找不到子模块里的图标。

解决办法:

  • 把ic_cake_variant图标(包括所有dpi尺寸的版本)复制一份到主App模块的res/drawable-*目录下
  • 确保图标是严格符合Google要求的:单色纯白、透明底,各个dpi尺寸齐全(mdpi:24x24, hdpi:36x36, xhdpi:48x48, xxhdpi:72x72, xxxhdpi:96x96)

2. 把默认通知配置移到主App的Manifest

虽然模块Manifest会合并,但有时候子模块的meta-data可能不会被正确识别,直接把配置放到主App的AndroidManifest.xml里更稳妥:

<application>
    ...
    <meta-data 
        android:name="com.google.firebase.messaging.default_notification_channel_id" 
        android:value="@string/notification_channel_id" />
    <meta-data 
        android:name="com.google.firebase.messaging.default_notification_icon" 
        android:resource="@drawable/ic_cake_variant" />
</application>

3. 验证合并后的Manifest

打包后,打开主App的build/outputs/apk/debug/AndroidManifest.xml(这是合并后的最终Manifest),确认上述两个meta-data存在,并且default_notification_icon指向的资源ID是正确的。如果没有,说明合并过程有问题,需要检查模块依赖配置。

4. (可选)升级到FCM

GCM已经被FCM完全取代,旧版本的GCM可能存在一些兼容性问题。你可以尝试升级到最新的FCM依赖:

implementation 'com.google.firebase:firebase-messaging:23.0.0'

不过升级前记得做好迁移准备,比如替换GCM相关的类为FCM对应类,但这个步骤不是必须的,先解决前面的资源问题应该就能搞定。

额外验证点

  • 确认你的推送消息是notification类型(从你提供的消息体看确实是),这种消息后台由系统处理;如果是data类型消息,无论前后台都会走到onMessageReceived,这时候图标会正常。
  • 测试时完全关闭应用(从最近任务栏划掉),再发送推送,看图标是否正常显示。

内容的提问来源于stack exchange,提问作者TooManyEduardos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:40:10