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

Android应用GCM重复通知求助:后台/关闭时收两次推送

解决Android GCM后台/关闭状态下重复通知问题

嘿,我之前也踩过GCM推送重复通知的坑,尤其是应用在后台或者完全关闭的时候,简直烦死人!咱们一步步来排查解决:

1. 检查并设置collapse_key参数

这是最常见的原因之一!GCM的collapse_key用于合并同一类型的重复消息,如果你的推送请求没设置这个参数,或者不同消息用了不同的key,GCM可能会下发多条重复通知。

解决方法:在服务器发送推送时,给同一用户的同类型通知设置相同的collapse_key。比如所有更新类通知都用"update_notification"作为key,这样GCM会自动合并重复的消息,不会多次推送。

示例服务器端代码(Java):

Sender sender = new Sender(YOUR_GCM_API_KEY);
Message message = new Message.Builder()
    .collapseKey("update_notification") // 统一的折叠key
    .addData("title", "您有新消息")
    .addData("content", "点击查看详情")
    .build();
// 设置重试次数为1,避免过度重试导致重复发送
Result result = sender.send(message, deviceRegistrationId, 1);

2. 避免客户端与系统重复创建通知

如果你的推送消息同时包含notification字段和data字段,GCM会自动在系统状态栏展示通知,而如果你的客户端代码又在onMessageReceived里手动创建了通知,就会出现两次通知。

解决方法:

  • 方案一:只使用data字段,完全由客户端代码处理通知的创建和展示;
  • 方案二:如果使用notification字段,就不要在客户端代码中重复创建通知,让系统自动处理。

示例客户端onMessageReceived处理(仅处理data字段):

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // 提取data字段内容
    Map<String, String> data = remoteMessage.getData();
    String title = data.get("title");
    String content = data.get("content");

    // 手动创建通知
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_notification)
        .setContentTitle(title)
        .setContentText(content)
        .setPriority(NotificationCompat.PRIORITY_HIGH);

    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
    notificationManager.notify(NOTIFICATION_ID, builder.build());
}

3. 清理重复的GCM注册令牌

如果应用多次注册GCM,导致服务器保存了同一个设备的多个有效令牌,推送时会给每个令牌都发送一次,自然会收到多次通知。

解决方法:

  • 客户端每次启动时,检查当前GCM令牌是否与服务器保存的一致,若有变化则更新服务器的令牌记录;
  • 服务器定期清理无效令牌(比如推送返回InvalidRegistration错误的令牌)。

4. 检查服务器推送逻辑的重复发送

有时候服务器的重试机制没处理好,比如网络波动时重复发送了同一条推送请求,也会导致重复通知。

解决方法:

  • 给每条推送消息添加唯一标识(比如UUID),服务器端记录已发送的标识,避免重复发送;
  • 合理设置重试条件,只有在确认GCM未收到请求时才重试(比如收到特定错误码时)。

5. 检查Manifest中的重复配置

如果在AndroidManifest.xml中重复注册了GCM相关的广播接收器或服务,可能会导致多次接收消息,进而触发多次通知。

解决方法:

  • 检查Manifest文件,确保只有一组GCM相关的receiver和service配置,没有重复条目。

先从上面前两点开始排查,这两个是最容易触发重复通知的原因,一般解决后就能搞定问题啦!

内容的提问来源于stack exchange,提问作者marwa ben ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:31:46