Flutter Android端Firebase后台本地通知:如何隐藏原始推送?
Android后台Firebase原始推送重复显示的解决办法
问题根源
当Firebase推送消息包含notification字段时,Android系统会自动触发系统级通知——哪怕你已经在后台消息处理器里自定义了本地通知,这就导致了两条通知同时出现。
解决办法
方法一:修改服务器端消息格式
把消息里的notification字段换成data字段,只发送纯数据消息。这样系统不会自动弹出通知,所有通知展示逻辑完全由你的代码控制。
原消息示例:
{ "notification": { "title": "系统默认标题", "body": "系统默认内容" }, "to": "设备令牌" }
修改后:
{ "data": { "title": "自定义标题", "body": "自定义内容", // 其他业务字段 }, "to": "设备令牌" }
方法二:客户端拦截系统自动通知
如果没法改服务器消息,就在Android端自定义Firebase消息服务,拦截系统的自动通知逻辑:
- 在Android项目里新建一个消息服务类(以Java为例):
// 路径:android/app/src/main/java/你的包名/CustomFirebaseMsgService.java package com.your.app.package; import android.content.Intent; import com.google.firebase.messaging.FirebaseMessagingService; public class CustomFirebaseMsgService extends FirebaseMessagingService { @Override public void handleIntent(Intent intent) { // 移除触发系统通知的关键参数 intent.removeExtra("google.sent_time"); intent.removeExtra("google.ttl"); intent.removeExtra("google.delivered_priority"); // 调用父类方法继续处理消息(此时系统不会自动弹通知) super.handleIntent(intent); } }
- 在
AndroidManifest.xml里替换默认的Firebase消息服务:
<service android:name=".CustomFirebaseMsgService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
额外提醒
- 确保你的
_firebaseMessagingBackgroundHandler能正确解析data字段里的内容,不管消息格式是哪种都能生成自定义通知。 - 测试时要杀掉应用进程,模拟真正的后台状态,避免前台测试的干扰。
内容的提问来源于stack exchange,提问作者Praharsh Bhatt
相关产品推荐
相关产品推荐

