You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何阻止Android系统显示FCM(Firebase Cloud Messaging)接收的消息?

解决Firebase后台消息自动生成系统通知的问题

听起来你遇到的是FCM(Firebase Cloud Messaging)的默认行为问题——当应用处于后台或关闭状态时,如果消息包含notification字段,Android系统会自动帮你生成通知,而不是传递到你的自定义处理逻辑里。要实现完全自定义消息处理且不显示系统通知,这里有几个可靠的方案:

方案1:只发送「数据消息」(推荐)

这是最直接有效的方式,只要你发送的消息只包含data字段,无论应用处于前台、后台还是关闭状态,消息都会直接传递到你实现的FirebaseMessagingServiceonMessageReceived方法里,系统不会生成任何默认通知,你可以完全自定义处理逻辑。

示例消息结构(发送时用这个格式):

{
  "to": "目标设备的FCM_TOKEN",
  "data": {
    "custom_title": "你的自定义标题",
    "custom_content": "你的自定义内容",
    "any_key": "any_value" // 自定义字段,按需添加
  }
}

之后你只需要在onMessageReceived里解析这些数据,做你想要的处理(比如本地保存、触发自定义逻辑等)即可。

方案2:如果必须保留notification字段(不推荐)

如果业务需求必须发送包含notification字段的消息,你可以通过配置click_action来拦截通知的点击行为,同时尽量减少系统通知的干扰,但无法完全阻止系统生成通知(除非你在发送时控制notification的显示条件)。

  1. 发送消息时添加click_action
{
  "to": "FCM_TOKEN",
  "notification": {
    "title": "通知标题",
    "body": "通知内容",
    "click_action": "OPEN_MY_CUSTOM_ACTIVITY" // 自定义的action名称
  },
  "data": {
    "custom_data": "需要传递的自定义数据"
  }
}
  1. 在AndroidManifest中注册对应的Activity拦截器
    给你想要处理通知点击的Activity添加intent-filter,匹配上面的click_action
<activity android:name=".YourCustomActivity">
    <intent-filter>
        <action android:name="OPEN_MY_CUSTOM_ACTIVITY" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

这样用户点击系统生成的通知时,会打开你指定的Activity,你可以在Activity的onCreateonNewIntent里解析intent中的数据,做后续处理。但要注意,这种方式系统还是会显示通知,只是能自定义点击后的行为。

关键配置检查

确保你的FirebaseMessagingService在Manifest中正确注册,避免无法接收消息:

<service
    android:name=".YourFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

另外,从Android 8.0(API 26)开始,后台服务有一定限制,但FirebaseMessagingService是系统特殊豁免的服务,只要配置正确就能正常接收数据消息。

注意:如果应用被用户强制停止,任何消息都无法被接收,这是Android系统的安全限制,无法绕过。

内容的提问来源于stack exchange,提问作者Ahmad Reza

火山引擎 最新活动