应用完全退出后无法接收FCM推送通知的问题求助
解决FCM推送在应用彻底关闭后无法接收的问题?
我之前也踩过这个坑,折腾了好一阵子才捋清楚原因,下面分享几个亲测有效的排查点和解决方案:
1. 先搞定安卓厂商的后台限制!
这是最常见的原因——国产安卓厂商(小米、华为、OPPO、vivo这些)都有自己的后台杀进程机制,应用从最近列表移除后,直接被系统“斩草除根”,FCM的推送服务自然没法运行。
- 操作步骤(不同厂商略有差异):
- 把你的应用加入后台保护白名单(小米叫“自启动管理”,华为是“受保护的应用”,OPPO叫“后台冻结”里设为允许)
- 关闭应用的“智能省电”“省电模式”,避免系统为了省电主动杀死进程
- 有些机型还要关闭“一键清理”时的自动排除,确保清理时不会把你的应用干掉
2. 检查FCM消息类型和服务配置
- 消息类型选对:
- 如果发的是带
notification标签的消息,应用彻底关闭后,系统可能不会触发你的自定义逻辑,建议改用纯data消息,然后在FirebaseMessagingService的onMessageReceived()方法里手动创建本地通知,这样不管应用状态如何,消息都会被你的服务接收并处理 - 要是发的是混合消息(既有notification又有data),后台状态下系统会接管通知,但彻底关闭后可能不会走到你的
onMessageReceived(),所以纯data更可靠
- 如果发的是带
- 服务配置要对:
- 确保
AndroidManifest.xml里正确注册了FirebaseMessagingService,别漏了intent-filter:<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> - 别在
FirebaseMessagingService里重写onDestroy(),也别在里面做会中断服务的操作
- 确保
3. 确认设备的Google服务正常
FCM依赖Google Play服务,要是设备上没装或者版本太低,推送肯定出问题:
- 检查设备上是否安装了Google Play服务,并更新到最新版本
- 可以用adb命令查看FCM服务状态,确认没有异常:
adb shell dumpsys activity services com.google.android.gms.measurement.api
4. 用合适的组件处理消息
安卓8.0及以上对后台服务限制很严,普通Service容易被杀死:
- 推荐用
WorkManager或者JobIntentService来处理消息接收后的逻辑,这些组件是系统调度的,即使应用被关闭,也能保证任务被执行 - 要是必须唤醒应用,可以临时启动一个前台服务(需要在通知栏显示一个通知),但这种方式会影响用户体验,谨慎使用
总的来说,90%的情况都是厂商后台限制导致的,先把白名单搞定,再调整消息类型和服务配置,基本就能解决问题了。
内容的提问来源于stack exchange,提问作者Savin Sharma




