Firebase推送通知图标异常:Marshmallow及以上后台显示白色
看起来你遇到的是FCM通知里一个很常见的场景——应用前台时通知图标显示正常,但后台/完全关闭状态下图标就变成白色,这背后其实是前后台通知的处理逻辑差异在搞鬼!
问题根源
当你的应用处于后台或被关闭时,FCM的notification类型消息会直接由Android系统接管展示,根本不会触发你的onMessageReceived方法,所以你在sendNotification里设置的setSmallIcon和setColor完全不会生效。只有应用在前台时,onMessageReceived才会被调用,你的自定义通知代码才能起作用。
解决方案
要搞定这个问题,你需要从系统默认配置和通知发送端两个层面入手:
在Manifest中配置默认通知图标与颜色
给application节点添加两个meta-data标签,指定系统处理后台通知时使用的默认图标和颜色,这样系统接管通知时就会用这些配置:<application android:name="com.xxxx" android:allowTaskReparenting="true" android:hardwareAccelerated="true" android:icon="@drawable/ic_xxxx" android:label="@string/app_name" android:largeHeap="true" android:theme="@style/AppTheme"> <!-- FCM默认通知图标(填你那版白色透明的图标) --> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/xxxxxx" /> <!-- FCM默认通知颜色(对应你代码里设置的accent色) --> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/accent" /> <!-- 原有其他配置 --> </application>确保图标符合Android通知规范
你的通知图标必须是纯白色、透明背景的图片(矢量图或PNG均可),还要准备不同dpi尺寸的版本(mdpi 24x24、hdpi 36x36、xhdpi 48x48、xxhdpi 72x72、xxxhdpi 96x96),放在对应的drawable-xxx文件夹下。系统会自动给这个白色图标染上你设置的颜色,这样在通知栏里就能显示正确样式。检查通知发送端的配置
- 如果用Firebase控制台发通知:不要在"高级选项"里设置自定义图标(设置了会覆盖Manifest的默认配置),或者确保控制台填写的图标名称和你
drawable里的资源名完全一致。 - 如果用API发通知:在
notificationpayload里明确指定icon和color字段:{ "notification": { "title": "消息标题", "body": "消息内容", "icon": "xxxxxx", // 填drawable资源名,不要加@符号 "color": "#你的颜色十六进制值" }, "to": "目标设备Token" }
- 如果用Firebase控制台发通知:不要在"高级选项"里设置自定义图标(设置了会覆盖Manifest的默认配置),或者确保控制台填写的图标名称和你
额外提示
如果你的通知是纯data类型(只有data字段,没有notification字段),那无论应用处于前台还是后台,都会触发onMessageReceived,这时候你的自定义通知代码就会生效。但如果是notification类型消息,后台时就由系统处理,必须依赖Manifest或payload的配置。
这样设置后,不管应用是前台还是后台/关闭状态,通知图标都能正常显示啦!
内容的提问来源于stack exchange,提问作者Pratik Vyas

