重复Android GCM消息

时间:2016-04-21 12:05:02

标签: android google-cloud-messaging

我正在开发聊天应用程序并尝试使用Google云消息传递 遵循本教程:

  

http://hmkcode.com/android-google-cloud-messaging-tutorial/

它工作正常,但通知不止一次, 即:如果我发送“你好”,将有六个通知说“你好”!! 最少是2个通知。

onHandleIntent方法:

protected void onHandleIntent(Intent intent) {
    Bundle extras = intent.getExtras();

GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);

String messageType = gcm.getMessageType(intent);

mes = extras.getString("content");

if(mes==null)
    return;

db=new AppDatabase(this);

boolean isforeground = isForeground("packageName");

MessageData data = new MessageData();
data.setTitle(extras.getString("title"));
data.setContent(extras.getString("content"));

data.setSend_user_name(extras.getString("send_user_name"));


SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
String currentDateandTime = sdf.format(new Date());

data.setDate(currentDateandTime);


if (isforeground) {

    String activity_group_id = Integer
            .toString(MessageActivity.group_id);

    if (extras.getString("group_id").equals(activity_group_id)) {

        MessageHandler.messageView.addMsg(data);
    } else {
        showToast(data);
    }

} else {
    showToast(data);
}

Log.i("GCM",
        "Received : (" + messageType + ")  "
                + extras.getString("title"));

GcmBroadcastReceiver.completeWakefulIntent(intent);

}

这里是isForeground方法的代码

public boolean isForeground(String myPackage) {
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> runningTaskInfo = manager
            .getRunningTasks(1);
    ComponentName componentInfo = runningTaskInfo.get(0).topActivity;

    return componentInfo.getClassName().equals(myPackage);
}

2 个答案:

答案 0 :(得分:1)

请查看以下官方GCM主题,其中定义了Google方面存在的一些错误。

https://groups.google.com/forum/#!topic/android-gcm/EHZUTEJMeyw

现在作为一个解决方案,您可以做的是,连同来自服务器的GCM响应,传递一些随机唯一ID并仅在ID是唯一时处理GCM消息,因为此ID也将是重复的ID,即GCM消息是重复的。

答案 1 :(得分:0)

没有资格发表评论,因此必须在答案中发布。您尝试使用GCM服务器而不是让自己的服务器完成工作是很好的。但是如果你有时间,请查看用于android的socket.io库。你也需要了解node.js。只是建议制作更好的应用程序。