App重启或关闭后无法接收Firebase推送,求排查指导
Firebase推送在App关闭/重启后无法接收的问题排查与原理说明
FCM推送核心原理
FCM推送分为两种核心消息类型,不同类型的处理逻辑直接影响App关闭后的接收效果:
- 通知消息:携带
notification字段的消息,由FCM系统SDK自动处理。App前台时触发onMessageReceived,后台/未启动时系统直接弹出通知。但如果App被强制关闭(从最近任务划掉),部分厂商ROM会限制FCM唤醒App,导致无法接收。 - 数据消息:仅携带
data字段的消息,所有逻辑由开发者自行处理。无论App处于前台、后台还是关闭状态,只要设备联网且FCM服务正常,都会触发onMessageReceived,但需要服务器端严格按照数据消息格式发送。
逐步排查步骤
1. 确认消息发送格式是否正确
如果你的推送仅在前台/后台生效,首先检查服务器发送的消息类型:
- 若使用通知消息:App关闭后依赖系统处理推送,但国产ROM的后台限制会导致失效。建议改为数据消息,或同时携带
notification和data字段(后台时系统显示通知,前台时进入onMessageReceived)。 - 测试验证:用Firebase控制台发送测试消息时,选择「仅发送数据消息」,若此时App关闭后能收到并触发
onMessageReceived,则说明是消息格式问题。
2. 检查Manifest配置与依赖
- 你的服务配置中
android:exported="false"是正确的,但需确认:- 已添加FCM核心依赖:
implementation 'com.google.firebase:firebase-messaging:23.0.0' // 版本号以实际使用为准 - 项目级
build.gradle中已引入Google服务插件:dependencies { classpath 'com.google.gms:google-services:4.3.15' } - 没有重复注册FirebaseMessagingService的情况,确保类路径
br.com.melhordosgames.apk.services.FirebaseMessagingService完全正确。
- 已添加FCM核心依赖:
3. 处理厂商系统的后台限制
国产Android厂商(小米、华为、OPPO、vivo等)的后台管理机制会冻结被关闭的App,导致FCM无法唤醒服务,必须手动开启权限:
- 小米:设置→应用设置→你的App→权限管理→自启动(允许);电池与性能→应用省电策略→选择「无限制」
- 华为:设置→应用和服务→应用管理→你的App→权限→自启动(允许);电池优化→找到你的App→设置为「不允许」
- OPPO/vivo:设置→应用管理→你的App→权限→自启动(允许);电池管理→后台高耗电(允许)
4. 验证服务唤醒与通知渠道
- 确保在
onMessageReceived中创建通知时,使用NotificationManagerCompat,并且为Android 8.0+设备正确创建通知渠道:private void createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel("your_channel_id", "Your Channel Name", NotificationManager.IMPORTANCE_DEFAULT); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } - 重写
onNewToken方法,验证服务是否能正常初始化(日志打印token,确认服务被正确注册):@Override public void onNewToken(String token) { Log.d("FCM_TOKEN", "Refreshed token: " + token); }
5. 测试场景注意事项
- 手机重启后,FCM服务需要重新绑定,建议等待1-2分钟再发送测试消息,避免因服务未初始化导致的接收失败。
- 确保设备上的Google Play服务已更新到最新版本,FCM依赖该服务运行。
内容的提问来源于stack exchange,提问作者Jasar Orion
相关产品推荐
相关产品推荐

