3

我成功地在 asp.net 中成功设置了 android gcm 和相关的服务器端工作。但我的问题是,它只显示服务器发送的最后一条通知。

我希望显示的所有通知都来自相同的collapse_key 或我在 gcm 代码或服务器端代码中更改的内容,以显示发送到特定设备的所有消息。

我的服务器端代码如下

public void SendCommandToPhone(String sCommand)
{
    String DeviceID = "";
    DeviceID = "APA91bF9SSDEp-UPU8UwvctGt5ogfrSw0UdilTWlCujqItHcr-eiPJ31ZDI-IeqTbLr92ZOPF31bXtB1_5gNEPHAq82N4ji0stm4cy9U0Yuk0Awhjl9PS02okuc9rRhJobkgOt-ofm5Br0KR-Y";
    WebRequest tRequest;
    tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send");
    tRequest.Method = "post";
    //tRequest.ContentType = "application/json";
    tRequest.ContentType = "application/x-www-form-urlencoded";
    tRequest.Headers.Add(string.Format("Authorization: key={0}", "AIzaSyBgCKDhyHnRmmu8jCfmupHVJA8cVkIa-XEZS"));
    String collaspeKey = Guid.NewGuid().ToString("n");
    String postData = string.Format("registration_id={0}&data.message={1}&collapse_key={2}", DeviceID, "YourMessage", collaspeKey);
    Byte[] byteArray = Encoding.UTF8.GetBytes(postData);
    tRequest.ContentLength = byteArray.Length;
    Stream dataStream = tRequest.GetRequestStream();
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();
    WebResponse tResponse = tRequest.GetResponse();
    dataStream = tResponse.GetResponseStream();
    StreamReader tReader = new StreamReader(dataStream);
    String sResponseFromServer = tReader.ReadToEnd();
    tReader.Close();
    dataStream.Close();
    tResponse.Close();
}

在 android 应用程序端代码如下 onMessage(Context arg0, Intent arg1)

NotificationManager notificationManager = (NotificationManager) arg0
            .getSystemService(Context.NOTIFICATION_SERVICE);
    Notification note = new Notification(R.drawable.ic_launcher,
            "meaNexus Notification", System.currentTimeMillis());

    Intent notificationIntent = new Intent(arg0, Main.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
            | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(arg0, 0,
            notificationIntent, 0);
    note.setLatestEventInfo(arg0, String.valueOf(R.string.app_name), message, pendingIntent);
    note.number = count++;
    note.defaults |= Notification.DEFAULT_SOUND;
    note.defaults |= Notification.DEFAULT_VIBRATE;
    note.defaults |= Notification.DEFAULT_LIGHTS;
    note.flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(0, note);
4

2 回答 2

10

来自官方文档

折叠键

一个任意字符串,用于在设备离线时折叠一组类似消息,以便仅将最后一条消息发送到客户端。这是为了避免在手机重新联机时向手机发送太多消息。请注意,由于无法保证消息发送的顺序,因此“最后一个”消息实际上可能不是应用程序服务器发送的最后一条消息。

因此,如果您希望设备接收所有消息,您可以为每条消息使用不同的折叠键。

EDIT1:通知问题

以下是您的通知代码:

notificationManager.notify(0, note);

根据notifiy()方法的java doc。它发布要在状态栏中显示的通知。如果您的应用程序已经发布了具有相同 id 的通知并且尚未取消,它将被更新的信息替换。

所以在notificationManager.notify()方法调用中使用不同的ID在bar中发布notification多个notification..

于 2013-01-03T07:41:50.923 回答
0

当我尝试在我的应用程序中实现 GCM 时,我遇到了同样的问题。

我将 C# 用于我的第三方应用程序。起初,我对每个通知都使用了相同的 collapse_key。这就是为什么我只收到最后一个。

因此,当您调用通过 GCM 服务器向您的设备发送通知的函数时,请尝试使用不同的 collapse_key。例如尝试使用当前时间。

于 2013-01-03T09:16:13.633 回答