如何阻止Android系统显示FCM(Firebase Cloud Messaging)接收的消息?
听起来你遇到的是FCM(Firebase Cloud Messaging)的默认行为问题——当应用处于后台或关闭状态时,如果消息包含notification字段,Android系统会自动帮你生成通知,而不是传递到你的自定义处理逻辑里。要实现完全自定义消息处理且不显示系统通知,这里有几个可靠的方案:
方案1:只发送「数据消息」(推荐)
这是最直接有效的方式,只要你发送的消息只包含data字段,无论应用处于前台、后台还是关闭状态,消息都会直接传递到你实现的FirebaseMessagingService的onMessageReceived方法里,系统不会生成任何默认通知,你可以完全自定义处理逻辑。
示例消息结构(发送时用这个格式):
{ "to": "目标设备的FCM_TOKEN", "data": { "custom_title": "你的自定义标题", "custom_content": "你的自定义内容", "any_key": "any_value" // 自定义字段,按需添加 } }
之后你只需要在onMessageReceived里解析这些数据,做你想要的处理(比如本地保存、触发自定义逻辑等)即可。
方案2:如果必须保留notification字段(不推荐)
如果业务需求必须发送包含notification字段的消息,你可以通过配置click_action来拦截通知的点击行为,同时尽量减少系统通知的干扰,但无法完全阻止系统生成通知(除非你在发送时控制notification的显示条件)。
- 发送消息时添加
click_action:
{ "to": "FCM_TOKEN", "notification": { "title": "通知标题", "body": "通知内容", "click_action": "OPEN_MY_CUSTOM_ACTIVITY" // 自定义的action名称 }, "data": { "custom_data": "需要传递的自定义数据" } }
- 在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的onCreate或onNewIntent里解析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




