2012-07-16 64 views
156

Google如何实现其推送通知功能?它是通过在后台运行的服务进行轮询还是以不同的方式运行?推送通知技术如何在Android上运行?

+13

听起来像是一个真正的问题给我。我想知道它的答案,Google把我带到了这里。又一个质量问题关闭了。 – 2013-12-10 13:05:27

+1

我也想知道这一点,并计划写一个问题,但有这个问题,所以这绝对是一个很好的问题。 – PSIXO 2014-05-06 10:07:36

回答

126

从以色列的Android开发会议期间我听到什么:

有一个简单的TCP套接字云谷歌服务器上accept mode等待。 TCP连接已由Google Play应用程序启动。这就是为什么必须在设备上安装Google Play才能使Google Cloud Messaging (GCM)(以前的Android Cloud到设备消息传递服务 - C2DM)能够正常工作的原因。

当这个TCP客户端套接字收到一些消息时,该消息包含诸如它应该发往的应用程序的包名称等信息 - 数据本身。这些数据将被解析并打包到广播并最终由应用程序接收的intent中。

即使设备的无线电状态变为“空闲”模式,TCP套接字也保持打开状态。应用程序不必跑来接收意图。在http://developer.android.com/google/gcm/gcm.html

+1

但我认为它也适用于仿真器。 我想到的事情是设备使用当前路径(IP)更新服务器。当谷歌服务器需要发送通知时,它会将当前路径和转发消息发送到该路径。我在某种程度上是否正确? – 2012-07-16 17:02:22

+2

@Khawar Raza:当设备的IP由于某种原因而改变时,设备将从服务器断开连接。当它发生时 - 新的连接取而代之,取决于设备的新IP。 – 2012-07-16 17:06:37

+1

@Khawar Raza:即使没有谷歌游戏,模拟器也能正常工作。我想它启动内置的内置套接字,而不是谷歌播放 – 2012-07-16 17:11:29

0

是的,你是对的。谷歌有一项服务(GTalk服务),这项服务在一段时间内询问Google服务器。

+0

gtalkservice服务是否仍然存在并正在运行? – 2012-07-16 17:03:07

+0

我不知道。我刚刚阅读了C2DM如何工作。现在可以改变。 – Yury 2012-07-16 18:39:33

7

更多信息,您可以实现与长轮询tcp连接自己的android推送通知。 但是,这将涉及维持一个额外的插座=>电池耗尽。 或者您可以使用Alarm Manager定期打开连接。

Google可能会为所有C2DM推送通知打开一个套接字,因此其电池使用效率更高。

120

Android保持与Google服务器的一个活动连接,但不会消耗太多的电量或数据,因为只有在某些内容向您的手机上的应用发送GCM消息之前,才会发送流量。手机上只有一个连接,由所有应用程序使用:安装使用GCM的新应用程序不会增加任何额外负载。

GCM的第一步是第三方服务器(例如电子邮件服务器)向Google的GCM服务器发送请求。然后,该服务器通过该打开的连接将消息发送到您的设备。 Android系统会查看该消息以确定该应用的用途,然后启动该应用。该应用程序必须向Android注册才能使用GCM,并且必须具有相关权限。当应用程序启动时,它可能会立即使用消息中的数据创建通知。 GCM消息的大小非常有限,因此该应用可能会打开与第三方服务器的正常连接以获取更多信息(例如,下载新电子邮件的标头)。

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

接收来自:Source 另请参阅here

+1

只是关于GCM连接的评论。该单一连接是轮询连接。 – wmac 2015-08-13 02:09:10

+1

对我来说,至关重要的是第三方服务器,例如电子邮件服务器确实会向Google GCM服务器发送通知消息。这是Google免费提供的服务,任何此类第三方必须使用其GCN协议与Google服务器实施沟通渠道。顺便说一句,该协议几乎只是一个JSON格式的HTTP响应。有关详细信息,请参阅https://developers.google.com/cloud-messaging/。 – 2016-08-01 14:41:15