Oreo(API 26)应用后台/关闭状态下无法接收通知求助
嘿,我之前也踩过这个一模一样的坑!API 26+引入通知渠道后,后台或者应用被杀死状态下收不到通知的问题,多半是消息类型、渠道配置或者厂商限制这几个地方出了问题,咱们一步步来排查解决:
先搞清楚你发的是哪种推送消息(核心!)
Android O及以上版本,后台/杀死状态下,普通通知消息和数据消息的处理逻辑完全不同:
- 如果是普通通知消息(payload里带
notification字段):系统会自动帮你展示通知,但前提是你的通知渠道配置完全合规,而且没被用户禁用。 - 如果是数据消息(payload只有
data字段):后台/杀死状态下系统不会自动弹通知,必须你自己在FirebaseMessagingService的onMessageReceived方法里手动构建并弹出通知,但这个方法只有当消息的priority设为high(Android端)或者content-available: true(兼容iOS)时,才会在后台触发。
检查通知渠道的细节(别以为配置了就没问题)
你说已经按文档配置了渠道,但可能有这些小疏漏:
- 确保创建通知时指定了正确的渠道ID,而且渠道的重要性(importance)不能太低,至少要设为
NotificationManager.IMPORTANCE_DEFAULT或更高,不然后台通知很可能被系统过滤掉。
给你个靠谱的示例代码:// 创建通知渠道 val channel = NotificationChannel(CHANNEL_ID, "我的通知渠道", NotificationManager.IMPORTANCE_DEFAULT).apply { description = "接收应用推送通知" } // 注册渠道到系统 val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(channel) - 别忘了检查用户是不是在系统设置里禁用了你的应用通知渠道,甚至整个应用的通知权限。可以引导用户去「设置 -> 应用和通知 -> 你的应用 -> 通知」里确认一下。
数据消息的后台处理要点
如果你的推送是数据消息,那必须做好这几点:
- 在自定义的
FirebaseMessagingService的onMessageReceived方法里,手动构建通知并调用NotificationManager显示。 - 服务器端发送消息时,一定要设置高优先级:
- 用FCM的话,payload要加
"priority": "high",示例如下:{ "to": "目标设备的令牌", "data": { "title": "新消息提醒", "content": "这是一条测试数据消息" }, "priority": "high" }
- 用FCM的话,payload要加
- 注意!部分国产ROM(小米、华为、OPPO这些)会在应用被杀死后限制后台服务启动,这时候你只能引导用户把应用加入「自启动白名单」或者「电池优化豁免列表」,这个是厂商的系统限制,没办法通过代码彻底解决,只能做友好提示。
检查Manifest和权限配置
- API 33及以上版本,必须在Manifest里声明
POST_NOTIFICATIONS权限:<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> - 确认
FirebaseMessagingService的Manifest声明正确,别漏了intent-filter:<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
测试小技巧
- 用FCM控制台测试时,选「高级选项」,分别测试「通知消息」和「数据消息」两种类型,别混在一起测。
- 测试杀死状态时,别用Android Studio的「停止运行」按钮,手动在最近任务栏划掉应用再发推送,因为前者是强制终止进程,和用户手动杀死的状态不一样。
内容的提问来源于stack exchange,提问作者Vinu Polly
相关产品推荐
相关产品推荐

