Android应用在后台或关闭时能否获取FCM推送数据负载?
解决FCM后台/关闭状态下获取数据负载的问题
当然可以搞定!不过得先搞清楚FCM的两种消息类型,因为它们在应用后台或者完全关闭时的处理逻辑差挺多的:
1. 先分清FCM的两种消息类型
FCM消息主要分两类,触发逻辑天差地别:
- 通知消息(Notification Message):由FCM SDK自动帮你弹出通知栏消息,当应用在后台/完全关闭时,
onMessageReceived()不会被调用,数据会附加到启动应用的Intent里,得在启动的Activity里取。 - 数据消息(Data Message):完全由咱们开发者说了算,不管应用是前台、后台还是彻底关闭,只要设备联网且FCM服务正常跑着,
onMessageReceived()都会被调用。
2. 后台/关闭状态下的具体处理方法
方法一:发送纯数据消息
如果你的需求是不管应用啥状态都要直接拿到数据负载,建议你直接发送纯数据消息,给你个JSON格式的例子:
{ "to": "你的设备Token", "data": { "title": "自定义标题", "content": "自定义内容", "order_id": "12345", "type": "payment_success" } }
这种情况下,哪怕应用完全关掉了,FCM也会唤醒你的应用进程,调用onMessageReceived(),你就能在这个方法里处理数据——比如存本地、触发自定义的业务逻辑啥的。
方法二:处理混合消息(通知+数据)
如果必须要发既有通知栏展示、又带数据的混合消息(同时包含notification和data字段),那当应用在后台/关闭时:
- 系统会自动弹出通知栏消息
- 用户点击通知启动应用时,数据负载会被放在启动Activity的Intent extras里,你可以在Activity的
onCreate()或者onNewIntent()里获取:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 提取数据负载 Intent intent = getIntent(); if (intent != null && intent.getExtras() != null) { for (String key : intent.getExtras().keySet()) { Object value = intent.getExtras().get(key); Log.d("FCM_DATA", "键: " + key + " 值: " + value); } } }
注意:如果应用只是在后台没关掉,点击通知会调用onNewIntent(),所以这个方法里也要写处理逻辑哦。
3. 几个要注意的点
- Android 12及以上的权限:得在Manifest里加
POST_NOTIFICATIONS权限,不然后台通知可能弹不出来,数据获取也会受影响。 - FCM服务注册:确保你的应用正确集成了FCM SDK,而且
FirebaseMessagingService的子类已经在Manifest里注册好了:
<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
- Doze模式的影响:如果设备进入Doze模式,FCM消息可能会延迟送达,但数据消息还是会被处理(只是慢一点),可以加个高优先级标记优化:
{ "to": "你的设备Token", "priority": "high", "data": { "order_id": "12345" } }
内容的提问来源于stack exchange,提问作者do87
相关产品推荐
相关产品推荐

