Oreo系统中移除后台应用后FCM通知无法送达问题求助
问题分析与解决方案
首先,你碰到的GCM : broadcast intent callback: result=CANCELLED错误,结合dumpsys里User 999的stopped=true状态,大概率和Android后台限制机制以及多用户/访客模式下的应用状态关联有关——哪怕访客用户没安装你的应用,这个异常状态也可能牵连主用户的应用接收FCM通知的能力。
下面是具体的排查和解决步骤:
1. 先搞定OEM厂商的后台管控
很多国产安卓厂商(小米、华为、OPPO等)都有自己的后台拦截逻辑,哪怕代码和官方示例完全一致,也可能被系统一刀切限制:
- 去设备「设置」→「电池」→「应用电池优化」,找到你的应用,设置为「不优化」;
- 检查「自启动权限」:有些设备会单独有「自启动管理」选项,一定要把你的应用加入允许列表;
- 关闭「应用后台冻结」「耗电保护」这类可能锁死应用后台的选项。
2. 确认Android 12+的通知权限
如果你的设备是Android 12(API 31)及以上版本,必须主动请求POST_NOTIFICATIONS权限,否则后台通知会被系统拦截:
- 先在Manifest里加权限:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> - 再在代码里动态请求:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { ActivityResultContracts.RequestPermission() // 这里发起权限请求的逻辑,比如用registerForActivityResult } }
官方快速启动应用应该已经包含了这部分处理,你要确认自己的项目没遗漏。
3. 重置多用户/访客模式的应用状态
虽然访客用户(User 999)没装你的应用,但stopped=true的标记可能触发系统的全局限制,试试这两步:
- 进入设备「设置」→「用户和账户」→「访客」,切换到访客模式后再切回主用户,强制重置应用状态;
- 彻底卸载应用,清理设备上的相关缓存,重新安装并主动启动一次,确保主用户下的应用状态完全正常。
4. 核对FCM配置的细节
哪怕你说代码完全一致,也再核对几个关键配置:
- 确认
google-services.json是对应你自己Firebase项目的,包名、SHA-1指纹必须完全匹配; - 检查Manifest里的
FirebaseMessagingService声明是否正确:<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> - 发送Payload时确保
priority是high(你已经设置了,但FCM控制台发送时也要选高优先级)。
5. 分场景测试通知接收
- 先正常启动应用,按Home键退到后台(不杀进程),发送通知看是否能接收——如果能,说明前台/后台逻辑没问题,问题只出在进程被杀后;
- 检查开发者选项里的「不保留活动」是否开启,如果开了就关掉,这个选项会导致应用退后台就销毁,干扰测试。
最后补充:User 999的stopped=true确实是大概率诱因,因为Android多用户系统会共享部分应用状态标记,重置访客用户的状态后,这个问题应该能解决。
内容的提问来源于stack exchange,提问作者anurag bhowmick
相关产品推荐
相关产品推荐

