如何让Java代码发送的Firebase消息与控制台发送的表现一致?
问题描述
- 通过Firebase控制台发送消息时,无论移动端应用是否处于打开状态,消息都会在手机上显示。
- 使用以下Java代码发送消息时,仅当应用处于打开状态时才会显示消息:
public void sendFirebaseMessage() { try { String registrationToken = "c4QGdbL_TTqZXaBC3F..."; Message message = Message.builder() .putData("score", "850") .putData("time", "11:06") .setToken(registrationToken) .build(); final FirebaseApp app = FirebaseApp.getInstance("my-app"); String response = FirebaseMessaging.getInstance(app).send(message); logger.info("successfully sent firebase message with response '{}' in FirebaseServiceImpl#sendFirebaseMessage", response); } catch (Exception e) { // 异常处理 } }
需要调整代码,让其发送的消息和控制台发送的表现一致。
问题原因
Firebase消息分为两种核心类型:
- 通知消息:由FCM(Firebase云消息服务)自动处理,无论应用是否活跃,系统都会直接在通知栏展示消息。控制台发送的默认就是这类消息。
- 数据消息:需要应用自行编写逻辑处理,只有当应用处于前台(打开状态)时才能接收到并触发处理,后台状态下不会触发系统通知。你当前的代码仅发送了数据消息,因此出现表现差异。
解决方案
要让代码发送的消息和控制台表现一致,需在构建Message时添加Notification配置,将消息设置为通知消息(或通知+数据消息)。
1. 发送纯通知消息
如果仅需展示通知,无需传递自定义数据,可按以下方式构建消息:
public void sendFirebaseMessage() { try { String registrationToken = "c4QGdbL_TTqZXaBC3F..."; // 构建通知内容 Notification notification = Notification.builder() .setTitle("通知标题") .setBody("通知内容") .build(); Message message = Message.builder() .setNotification(notification) .setToken(registrationToken) .build(); final FirebaseApp app = FirebaseApp.getInstance("my-app"); String response = FirebaseMessaging.getInstance(app).send(message); logger.info("successfully sent firebase message with response '{}' in FirebaseServiceImpl#sendFirebaseMessage", response); } catch (Exception e) { // 异常处理 } }
2. 发送通知+数据消息
如果既需要系统展示通知,又要传递自定义业务数据,可以同时配置Notification和Data:
public void sendFirebaseMessage() { try { String registrationToken = "c4QGdbL_TTqZXaBC3F..."; // 构建通知内容 Notification notification = Notification.builder() .setTitle("游戏得分通知") .setBody("你获得了850分!") .build(); Message message = Message.builder() .setNotification(notification) .putData("score", "850") .putData("time", "11:06") .setToken(registrationToken) .build(); final FirebaseApp app = FirebaseApp.getInstance("my-app"); String response = FirebaseMessaging.getInstance(app).send(message); logger.info("successfully sent firebase message with response '{}' in FirebaseServiceImpl#sendFirebaseMessage", response); } catch (Exception e) { // 异常处理 } }
额外说明
- 发送通知+数据消息时,应用在前台会收到包含通知和数据的完整消息;应用在后台时,系统会展示通知,用户点击通知后,应用会通过Intent获取到携带的数据。
- 确保移动端已正确配置Firebase SDK,默认情况下FCM SDK会自动处理通知消息的展示,无需额外编写展示逻辑。
内容的提问来源于stack exchange,提问作者quma
相关产品推荐
相关产品推荐

