android - Google Cloud Messaging - 有时直到网络状态发生变化才会收到消息

标签 android google-cloud-messaging android-networking

在做一个与 GCM 集成的小项目时,我偶然发现了一个奇怪的问题。

有时当我开始查看日志以查看是否收到消息时,直到我更改网络状态(即最初在 WiFi 上,如果我关闭 WiFi 并移动到移动数据,则消息似乎不会通过,消息到达很好)。更改网络状态后,消息开始正常到达,一旦我将网络状态更改回之前的状态(在本例中为 WiFi),消息将继续接收。

项目本身包括启动时启动的能力(启动时启动 GCMBaseIntentService),它再次完美运行,我确信应用程序/服务正在运行,因为我在此问题时手动启动了应用程序发生(它还会检查服务是否正在运行,如果不是,它会运行它并检查它是否已注册)。

有没有其他人遇到过这个问题,或者有任何关于我如何解决这个问题的指示?在未收到消息的时间和收到消息的时间(更改网络状态之后)之间,我在日志中没有看到任何帮助。我浏览了 GCM 文档,没有看到任何提及由于超时(在设备本身上)或任何可能影响此的配置选项而未收到消息的内容。

感谢任何帮助 - 如果需要,我可以提供源代码,尽管它几乎不会偏离 android-sdk 中提供的演示应用程序。

最佳答案

我也注意到了这一点。虽然我还没有深入研究实际的代码,但这是我对为什么会发生这种情况的理解。

GCM(以及大多数推送消息服务)的工作原理是为 Google 的推送通知服务器保持一个长期有效的套接字。通过在电话和服务器之间发送“心跳”消息,套接字保持打开状态。

偶尔,网络状态可能会改变,这个socket会坏掉(因为设备的IP地址改变了,比如从3g变成wifi)。如果消息在套接字重新建立之前进来,那么设备将不会立即得到消息。

仅当手机注意到套接字损坏时才会重新连接,而这只发生在它尝试发送心跳消息时。

再说一遍,这只是我对它如何工作以及为什么会发生的基本理解,我可能是错的。

关于android - Google Cloud Messaging - 有时直到网络状态发生变化才会收到消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13835676/

相关文章:

Android 检查互联网连接

java - 接收时 UDP 服务器中的 "An existing connection was forcibly closed by the remote host"

android - android 9 上的 ad.loadclass 崩溃

android - 多个应用程序,单一代码库

android - 我应该生成特定于应用程序还是特定于用户的 android GCM 注册 ID?

android - 在Android上同时连接到MOBILE时如何检查Wi-Fi连接(SSID)

android - 用户输入年、月、日、时、分与系统年、月、日、时、分的区别

android - Google Cloud Messaging 注册 ID 过期

google-cloud-messaging - 无法获取 GCM(android 和 ios)的配置文件

android - android 热点上的网络服务器 - 它的 IP 是多少?