谷歌是如何实现他们的推送通知功能的?它是通过后台运行的服务进行轮询还是以不同的方式工作?


是的,你说得对。谷歌有一个服务(GTalk服务),这个服务在某些时间要求谷歌的服务器。


我在以色列的Android开发者大会上听到:

在云谷歌服务器上,只有一个TCP套接字以接受模式等待。日志含义谷歌Play应用程序已启动TCP连接。这就是为什么谷歌播放必须安装在设备上,使谷歌云消息(GCM)(以前的Android云到设备消息服务- C2DM)工作。

当这个TCP客户端套接字接收到一些消息时,该消息包含了诸如应用程序的包名等信息,当然还有数据本身。这些数据被解析并打包到一个意图中,该意图被广播并最终被应用程序接收。

即使设备的无线电状态变为“空闲”模式,TCP套接字也保持打开状态。应用程序不需要运行来接收意图。

更多信息请访问http://developer.android.com/google/gcm/gcm.html


你可以在android上使用长轮询tcp连接来实现推送通知。 但这将涉及维护一个额外的插座=>电池耗尽。 或者你也可以使用Alarm Manager定期打开一个连接。

谷歌可能为所有C2DM推送通知打开一个插座,因此它更省电。


Android与谷歌的服务器保持着一个活动连接,但它不会消耗太多电力或数据,因为在有东西向你手机上的应用程序发送谷歌云消息(GCM)之前,没有流量通过它发送。手机上只有一个连接,所有应用程序都使用:安装一个使用GCM的新应用程序不会增加任何额外的负载。

The first step in GCM is that a third-party server (such as an email server) sends a request to Google's GCM server. This server then sends the message to your device, through that open connection. The Android system looks at the message to determine which app it's for, and starts that app. The app must have registered with Android to use GCM, and it must have the relevant permission. When the app starts, it might create a notification straight away with the data from the message. GCM messages are very limited in size, so the app might instead open a normal connection to the third-party server to get more information (for example, downloading the headers of new emails).

使用推送通知的好处是,应用程序不需要定期运行来检查新数据,既省电又省数据。拥有像GCM这样的集中式机制的优势在于,设备只需要一个开放的网络连接,而Android GCM系统是唯一需要保持运行的系统,而不是每个应用程序都必须在后台运行以保持与自己服务器的网络连接。

这是从:来源 也可以看这里。


截至2018年4月10日,谷歌已弃用GCM。GCM服务器和客户端api已弃用,最早将于2019年4月11日移除。将GCM应用程序迁移到Firebase Cloud Messaging (FCM), FCM继承了可靠和可扩展的GCM基础设施,以及许多新功能。

https://firebase.google.com/docs/cloud-messaging/