Android 谷歌云消息(GCM)下游消息延迟

Android 谷歌云消息(GCM)下游消息延迟,android,push-notification,xmpp,google-cloud-messaging,Android,Push Notification,Xmpp,Google Cloud Messaging,我已经从下载并设置了Android gcm客户端和gcm演示服务器(http服务器)。我已经设法在我的Android gcm客户端应用程序中接收下游消息。我已经做了许多具有以下特征的测试: 服务器使用了浏览器API密钥或服务器API密钥 数据连接不是3G就是WiFi 发送的邮件包含/未包含其他数据 发送的邮件有/没有折叠密钥 发送的消息已将delayWhileIdle设置为false 已发送邮件的timeToLive设置为0或5分钟 服务器位于欧洲的两个不同位置 Android应用程序在欧洲不同

我已经从下载并设置了Android gcm客户端和gcm演示服务器(http服务器)。我已经设法在我的Android gcm客户端应用程序中接收下游消息。我已经做了许多具有以下特征的测试:

  • 服务器使用了浏览器API密钥或服务器API密钥
  • 数据连接不是3G就是WiFi
  • 发送的邮件包含/未包含其他数据
  • 发送的邮件有/没有折叠密钥
  • 发送的消息已将delayWhileIdle设置为false
  • 已发送邮件的timeToLive设置为0或5分钟
  • 服务器位于欧洲的两个不同位置
  • Android应用程序在欧洲不同地区的两台设备上运行

  • 在所有情况下,应用程序都会在发送消息的25-30秒后接收到这些消息。但是,我已经测试了其他使用GCM下游消息的Android应用程序,在大多数情况下,消息几乎立即到达(我认为问题出在保留消息的Android GCM客户端演示中,而不是GCM服务器中。 在gcm客户端演示的gcminentService.java文件中,可以看到受保护的函数void onHandleIntent(Intent-Intent)具有以下代码:

    [...]
    // If it's a regular GCM message, do some work.
    } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
    // This loop represents the service doing some work.
        for (int i = 0; i < 5; i++) {
        Log.i(TAG, "Working... " + (i + 1)
                + "/5 @ " + SystemClock.elapsedRealtime());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
        }
    }
    [...]
    
    […]
    //如果是常规GCM消息,请执行一些操作。
    }else if(GoogleCloudMessaging.MESSAGE\u TYPE\u MESSAGE.equals(messageType)){
    //此循环表示正在执行某些工作的服务。
    对于(int i=0;i<5;i++){
    Log.i(标记“正在工作…”+(i+1)
    +“/5@”+SystemClock.elapsedRealtime());
    试一试{
    睡眠(5000);
    }捕捉(中断异常e){
    }
    }
    [...]
    
    在发送通知消息之前,此代码会使android应用程序在每次迭代中休眠5秒(总共25秒)。您可以删除此代码,因为这是一个示例,您可以在显示通知之前将一些工作插入else if语句


    我已经实现了一个xmpp服务器,我在《你怎么知道“其他Android应用程序”的延迟》中收到了通知“通过测试。例如,在短信应用程序中,您可以以用户身份发送消息,以其他用户身份接收消息,并测量传递时间。您如何知道GCM参与了消息传递?通过监控应用程序从远程主机(GCM服务器)接收的数据包。”在5228端口。救了我的命,他们为什么要放这段代码???太没必要了…谢谢!