You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:56:00