Android Oreo中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

