Sei*_*idr 39 android android-networking google-cloud-messaging
在开发一个与GCM集成的小项目时,我偶然发现了一个奇怪的问题.
有时当我开始观看日志以查看是否收到消息时,在我改变网络状态(IE最初在WiFi上,如果我关闭WiFi并转移到移动数据,消息到达)之前,消息似乎没有通过精细).在我改变网络状态后,消息开始完全正常,一旦我将网络状态改回到之前的状态(在这种情况下,WiFi),消息将继续被接收,这同样适用.
该项目本身包括启动启动的能力(启动时启动GCMBaseIntentService),这也完全正常,我确信应用程序/服务正在运行,因为我在发生此问题时手动启动应用程序(其中还检查是否正在运行的服务,如果它不运行它,并检查它是否已注册).
有没有其他人遇到过这个问题,或者有任何指示我如何解决这个问题?我没有看到的消息的时间之间的日志中有很大帮助什么都没有收到,当他们(改变网络状态后).我已经浏览了GCM文档,并且看不到由于超时(在设备本身上)或任何可能影响此问题的配置选项而未收到消息的任何提及.
感谢所有帮助 - 我可以提供源如果需要的话,虽然它很难从Android的SDK提供的演示程序偏离.
the*_*ike 36
我也注意到了这一点.虽然我没有深入研究实际的代码,但这是我对为什么会发生这种情况的理解.
GCM(以及大多数推送消息传递服务)的工作原理是将长期存储的套接字保持为Google的推送通知服务器.通过在电话和服务器之间发送"心跳"消息来保持套接字打开.
有时,网络状态可能会发生变化,此套接字将被破坏(因为设备的IP地址会发生变化,例如从3g变为wifi).如果在重新建立套接字之前消息进入,则设备将不会立即收到消息.
重新连接仅在手机注意到套接字断开时才会发生,这只会在尝试发送心跳消息时发生.
再一次,只是我对它是如何工作的基本理解以及它为什么会发生,我可能是错的.
小智 20
导致GCM消息延迟的原因很多.如果在更改网络状态或打开/关闭飞行模式后消息开始到达 - 最可能的原因是网络关闭连接而不发送FIN/RST.
GCM维护一个长期连接 - 如果它知道连接断开,则重新连接.路由器/ AP/NAT应该发送FIN或RST来终止TCP连接 - 因此GCM和服务器将知道连接已经死亡.
然而,许多路由器和移动运营商都没有这样做,然后GCM需要依靠心跳,在Wifi上大约需要15分钟,更多的是在移动设备上.在电池寿命/网络使用和心跳频率之间进行权衡.
归档时间: |
|
查看次数: |
16214 次 |
最近记录: |