Android端FirebaseMessagingService的onMessageReceived未被调用问题排查
问题根因与修复方案
到底哪里配错了
- 你手动在MainActivity里
startService启动MyFirebaseMessagingService的操作是完全多余的,甚至直接搞坏了FCM的绑定逻辑。
这个服务本身是FCM SDK完全托管的组件,根本不需要你手动启动。你手动拉起来的服务实例,构造方法确实会跑(所以你能看到构造方法里打出来的init日志),但FCM的事件分发模块根本不会把消息接收、token刷新这类事件投递到这个手动启动的实例上——这就是为什么你能看到构造日志,但是onMessageReceived、onNewToken死活不触发的核心原因。 - 你在Manifest里给这个服务配的intent-filter完全乱了。
你在FCM要求的标准配置之外,额外加了android.intent.action.MAIN、android.intent.category.LAUNCHER、自己定义的.MyFirebaseMessagingServiceaction这些八竿子打不着的配置,直接打乱了FCM的事件路由,系统根本找不到正确的消息处理入口。 - 你写的curl测试请求还有个隐性bug:JSON结构里写了
// 或使用data载荷发送:的注释,JSON标准根本不支持注释,实际发请求的时候不删掉这行,FCM会直接返回400格式错误。
按步骤改就行
- 把MainActivity里手动启动服务的代码全删了,把这行直接去掉:
startService(new Intent(this, MyFirebaseMessagingService.class)); - 把Manifest里的服务配置改成标准格式,所有多余的intent-filter项全删掉,最后留的配置应该是这样:
<service android:name=".MyFirebaseMessagingService" android:stopWithTask="false" android:enabled="true" android:exported="true"> <!-- 只留FCM要求的这一个action就行,其他全删 --> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> - 把设备上装的当前应用完全卸载,清掉所有本地缓存和之前存的旧FCM token,重新安装启动应用。等应用跑起来,先看logcat里有没有打印
onNewToken的日志,拿到新的token再做推送测试。
测试的时候要注意的坑
- 如果你发的请求带了
notification字段,只有应用在前台的时候,消息才会走到onMessageReceived回调;应用在后台或者进程被杀的时候,系统会直接按照notification字段的内容弹通知,根本不会触发应用层的回调,这是FCM本身的逻辑,不是你代码错了。 - 如果你想不管应用在前台还是后台,收到推送都能跑你自己写的自定义业务代码,发请求的时候就只带
data字段的载荷,不要加notification字段。
内容的提问来源于stack exchange,提问作者LinusG.
相关产品推荐
相关产品推荐

