FCM通知接收时onMessageReceived未触发(API19正常/23、24异常)
嘿,针对你遇到的FCM onMessageReceived 在API23/24完全不触发的问题(API19反而正常),我整理了几个关键排查方向,你可以一步步来:
FCM分两种核心消息类型,不同类型在API23+的处理逻辑有差异,这很可能是问题根源:
- 通知消息:带
notification字段的消息,App后台时系统会直接弹通知,不会走onMessageReceived;只有前台时才会触发这个方法。 - 数据消息:只带
data字段的消息,不管前台后台都应该走onMessageReceived——但你说连数据消息都不触发,那得先确认服务器的消息格式对不对。
划重点:如果是混合消息(同时有
notification和data),API23+后台时系统只会弹通知,data会附加到App启动的Intent里,不会触发onMessageReceived,只有前台时才会走这个方法。
先确保你发送的是纯数据消息,比如正确的JSON格式应该是这样:
{ "to": "你的设备令牌", "data": { "title": "测试数据消息", "body": "自定义内容", "custom_key": "custom_value" } }
如果服务器发的是混合消息,那后台时肯定不会触发onMessageReceived,得改成纯数据消息,然后在onMessageReceived里自己处理通知展示。
API23+对组件配置的要求更严格,确保你的FirebaseMessagingService子类配置正确:
<service android:name=".你的Service类路径" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
- 别加
android:enabled="false",不然服务会被禁用 - 检查有没有其他第三方库也注册了
com.google.firebase.MESSAGING_EVENT的服务,可能会覆盖你的实现(可以在Logcat搜FirebaseMessaging看服务注册日志)
API23/24对应Android6.0/7.0,确保你用的Firebase Messaging SDK版本是兼容的,建议用稳定的新版本,比如:
implementation 'com.google.firebase:firebase-messaging:23.0.0'
(如果是AndroidX项目,别混着用support库,全换成AndroidX依赖)
API23+引入了Doze模式和App Standby,虽然FCM消息理论上能绕过,但还是建议:
- 把你的App加入电池优化白名单(设置→电池→电池优化→找到App,设为“不优化”)
- 检查有没有第三方安全应用限制了App的后台运行权限
在onMessageReceived开头加个日志,方便确认是否真的没触发:
@Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.d("FCM_TEST", "收到消息啦!数据内容:" + remoteMessage.getData()); // 你的其他处理逻辑 }
然后在API23/24的设备上,用Logcat过滤FCM_TEST,看有没有日志输出。另外也检查下onNewToken是否能正常获取令牌,确保服务器用的是正确的设备令牌。
直接用Firebase控制台发送一条纯数据消息(选择“数据消息”选项),如果控制台发送能触发onMessageReceived,那问题肯定在你服务器的消息格式上;如果控制台也不行,那就是App端的配置或者SDK问题。
内容的提问来源于stack exchange,提问作者Anil M

