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

FCM群组通知异常:新通知覆盖旧通知问题排查与实现咨询

问题分析与解决方案

为什么通知会被覆盖?

你遇到的通知被覆盖问题和Channel ID完全无关,核心原因是你调用notificationManager.notify(0, mBuilder.build())时,始终使用了固定的通知ID 0。Android系统会用这个ID来区分不同的通知——如果两次通知使用同一个ID,新通知就会直接替换旧的那条,这就是你只能看到最新一条的原因。

如何实现群组通知+动态数量显示?

要实现多条通知堆叠、并显示未读数量的群组效果,需要做这几个关键调整:


1. 给每个通知分配唯一ID

首先,你需要为每条新消息生成一个唯一的通知ID,这样系统才会把它们当作不同的通知来展示。常见的实现方式有两种:

  • 如果你的消息本身有唯一标识(比如Firestore文档ID),可以把这个标识转换成整数作为ID;
  • 或者直接使用System.currentTimeMillis(),利用时间戳的唯一性来生成ID:
// 替换原来的固定ID 0,生成唯一ID
int notificationId = (int) System.currentTimeMillis();
notificationManager.notify(notificationId, mBuilder.build());

2. 构建群组汇总通知

群组通知需要一个「汇总通知」来展示未读消息的数量,其他单条消息作为子通知归到这个组里。你需要额外创建一个汇总通知,并设置setGroupSummary(true):

private void updateGroupSummary(int unreadCount) {
    Intent groupIntent = new Intent(this, ChatListActivity.class); // 跳转到聊天列表页
    PendingIntent groupPendingIntent = PendingIntent.getActivity(this, 100, groupIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder summaryBuilder = new NotificationCompat.Builder(this, "191919")
            .setSmallIcon(R.drawable.ic_launcher_custom_background)
            .setContentTitle("你有" + unreadCount + "条新消息")
            .setContentText("点击查看所有未读消息")
            .setContentIntent(groupPendingIntent)
            .setGroup(GROUP_KEY)
            .setGroupSummary(true) // 标记为汇总通知
            .setAutoCancel(true);

    NotificationManagerCompat.from(this).notify(100, summaryBuilder.build());
}

3. 动态维护未读消息数量

要实现收到第3条时显示“3条新消息”,你需要维护一个未读消息的计数器:

  • 可以在FirebaseMessagingService里用一个静态变量临时计数(但进程被杀后会重置);
  • 更可靠的方式是把未读数量存在Firestore或SharedPreferences里:
    • 收到新通知时,先读取当前未读数,加1;
    • 当用户点击通知进入聊天页面时,把对应会话的未读数清零,并更新汇总通知。

比如在notifyThis方法里添加计数逻辑:

public void notifyThis(String title, String message, String var1, String var2, String var3) {
    // 1. 读取并更新未读数量(这里用SharedPreferences示例)
    SharedPreferences prefs = getSharedPreferences("notification_prefs", MODE_PRIVATE);
    int unreadCount = prefs.getInt("unread_total", 0) + 1;
    prefs.edit().putInt("unread_total", unreadCount).apply();

    // 2. 创建单条消息通知(使用唯一ID)
    Intent intent = new Intent(this, ChatActivity.class);
    intent.putExtra("ChatID",var1);
    intent.putExtra("ReceiverID",var2);
    intent.putExtra("itemID",var3);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, "191919")
            .setSmallIcon(R.drawable.ic_launcher_custom_background)
            .setContentTitle(title)
            .setContentText(message)
            .setContentIntent(pendingIntent)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setGroup(GROUP_KEY) // 归到群组
            .setAutoCancel(true);

    int notificationId = (int) System.currentTimeMillis();
    NotificationManagerCompat.from(this).notify(notificationId, mBuilder.build());

    // 3. 更新汇总通知
    updateGroupSummary(unreadCount);
}

4. 点击通知后重置计数

当用户点击进入聊天页面时,记得重置对应会话的未读数,并更新汇总通知:
比如在ChatActivity的onCreate里:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);

    // 获取ChatID,重置未读数量
    String chatId = getIntent().getStringExtra("ChatID");
    SharedPreferences prefs = getSharedPreferences("notification_prefs", MODE_PRIVATE);
    int currentTotal = prefs.getInt("unread_total", 0);
    // 这里可以根据实际逻辑,减去当前会话的未读数,或者直接清零(如果是进入所有聊天)
    prefs.edit().putInt("unread_total", currentTotal - 1).apply();

    // 更新汇总通知
    new MyFirebaseMessagingService().updateGroupSummary(prefs.getInt("unread_total", 0));
}

额外注意事项

  • 如果你希望同一个聊天会话的通知合并成一条(而不是多条),可以用ChatID作为通知ID,这样新消息会替换同一会话的旧通知,但不同会话的通知会分开显示;
  • 对于Android 10及以上版本,确保你的通知渠道设置正确,IMPORTANCE_DEFAULT可以正常显示通知;
  • PendingIntent记得使用FLAG_UPDATE_CURRENT,确保跳转时能传递最新的Extra参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:52:47