这可能是由Google Cloud Messaging 中不切实际的心跳间隔引起的。
GCM 的工作原理是维护从 Android 设备到 Google 服务器的空闲套接字连接。这很棒,因为它几乎不消耗电池电量(与轮询相反),并且它允许在消息到达时立即唤醒设备。
为确保连接保持活动状态,Android 将在移动连接上每 28 分钟发送一次心跳,在 WiFi 上每 15 分钟发送一次。如果心跳失败,则连接已终止,GCM 将重新建立它并尝试检索任何未决的推送通知。心跳间隔越高,消耗的电池越少,设备从睡眠中唤醒的次数就越少。
然而,这是有代价的:心跳间隔越长,识别断开的套接字连接所需的时间就越长。在部署 GCM 之前,谷歌没有在现实生活中对这些间隔进行足够彻底的测试。这些间隔的问题是由网络路由器和移动运营商引起的,他们在几分钟不活动后断开空闲套接字连接。
更多信息可在我的博客上找到:
http://eladnava.com/google-cloud-messaging-extremely-unreliable/
作为一种解决方法,请考虑 Pushy ( https://pushy.me ),它是 GCM/FCM 的直接替代品,它极大地提高了通知速度和可靠性(完全披露 - 我创立了 Pushy)。