Firebase后台状态下onMessageReceived有时不触发问题求助
这种后台消息接收的问题我之前也碰到过几次,结合FCM的机制和Android系统的后台限制,给你梳理几个排查方向:
确认消息类型是否正确
FCM分两种核心消息类型:通知消息和数据消息。如果发送的是纯通知消息(payload仅包含notification字段),当App处于后台时,系统会直接接管并展示到通知栏,完全不会触发onMessageReceived。只有数据消息(仅含data字段)或混合消息(同时包含notification和data字段),后台时才会将消息传递给你的监听器。检查Firebase Functions里的消息构造代码,确保符合业务需求的消息类型。排查Android系统的后台限制
现在Android系统(尤其是8.0+)和国内厂商的定制系统,对后台应用的管控非常严格:- 检查应用是否被加入忽略电池优化白名单:进入系统设置→电池→电池优化,找到你的应用并设置为“不优化”;
- 关闭厂商的省电/后台清理策略:比如小米的“神隐模式”、华为的“后台启动管理”,允许你的应用后台活动;
- Android 12+需确保已申请
POST_NOTIFICATIONS权限,没有该权限的话后台通知会被系统直接拦截。
检查Firebase SDK配置与版本
- 尝试更新Firebase Messaging SDK到最新稳定版,旧版本可能存在已知的后台消息处理bug;
- 确认
AndroidManifest.xml中FirebaseMessagingService的注册是否正确,示例配置如下:<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> - 验证
google-services.json的包名、SHA-1指纹是否与当前项目完全匹配。
确认后台进程存活状态
如果App在后台被系统杀死,onMessageReceived自然无法触发。你可以通过adb shell dumpsys activity processes命令查看设备上的进程状态,确认黑屏时你的App进程是否仍在运行。如果进程频繁被杀死,可以考虑:- 使用前台服务(需要展示通知)来维持进程存活;
- 发送FCM高优先级消息,这类消息可以临时唤醒被杀死的App进程(注意不能滥用,否则会被系统限流)。
调整消息优先级
FCM消息的优先级直接决定了送达时机。低优先级消息在设备处于Doze模式时会被延迟,直到设备退出低功耗状态。在Firebase Functions发送消息时,设置priority: "high"(针对Android平台),确保紧急消息能及时触发监听器:// Firebase Functions中设置高优先级的示例 const message = { data: { /* 自定义数据内容 */ }, token: "目标设备推送token", android: { priority: "high" } };增加日志排查细节
虽然没有崩溃报错,但可以补充多维度日志定位问题:- 在
onMessageReceived方法中打印详细日志,确认消息是否被接收; - 在Firebase Functions端打印消息发送的请求和响应日志,确认消息是否成功提交到FCM服务器;
- 用Firebase Console的Cloud Messaging面板发送测试消息,对比自定义Functions发送的消息,排查是否是消息构造的问题。
- 在
内容的提问来源于stack exchange,提问作者MareCieco

