谷歌是如何实现他们的推送通知功能的?它是通过在后台运行的服务完成的轮询工作还是以不同的方式工作?
5 回答
从我在以色列举行的 Android 开发者大会上听到的消息:
在云 Google 服务器上只有一个 TCP 套接字以接受模式等待。TCP 连接已由 Google Play 应用程序启动。这就是为什么必须在设备上安装 Google Play 才能使Google Cloud Messaging (GCM)(以前的 Android Cloud to Device Messaging Service - C2DM)工作。
当这个 TCP 客户端套接字接收到一些消息时,该消息包含信息,例如它应该被寻址到的应用程序的包名称,当然还有数据本身。这些数据被解析并打包到一个意图中,该意图被广播并最终由应用程序接收。
即使设备的无线电状态变为“空闲”模式,TCP 套接字仍保持打开状态。应用程序不必运行即可接收意图。
Android 与 Google 的服务器保持一个活动连接,但它不会使用太多电力或数据,因为在某些东西向您手机上的应用程序发送 Google Cloud Messaging (GCM) 消息之前,不会沿着它发送任何流量。手机上只有一个连接,所有应用程序都使用:安装使用 GCM 的新应用程序不会增加任何额外负载。
GCM 的第一步是第三方服务器(例如电子邮件服务器)向 Google 的 GCM 服务器发送请求。然后,此服务器通过该开放连接将消息发送到您的设备。Android 系统查看消息以确定它是针对哪个应用程序,然后启动该应用程序。该应用必须已在 Android 上注册才能使用 GCM,并且必须具有相关权限。当应用程序启动时,它可能会立即使用消息中的数据创建一个通知。GCM 消息的大小非常有限,因此应用程序可能会打开与第三方服务器的正常连接以获取更多信息(例如,下载新电子邮件的标题)。
使用推送通知的优点是应用程序不必定期运行以检查新数据,从而节省电力和数据。拥有像 GCM 这样的中心化机制的好处是设备只需要一个开放的网络连接,而 Android GCM 系统是唯一需要保持运行的东西,而不是每个应用程序都必须在后台保持运行以保持自己的网络连接到自己的服务器。
您可以通过长轮询 tcp 连接自己在 android 上实现推送通知。但这将涉及维护一个额外的插座 => 电池消耗。或者,您可以使用警报管理器定期打开连接。
Google 可能会为所有 C2DM 推送通知打开一个套接字,因此它的电池效率更高。
自 2018 年 4 月 10 日起,Google 已弃用 GCM。GCM 服务器和客户端 API 已弃用,最早将于 2019 年 4 月 11 日被删除。将 GCM 应用迁移到 Firebase Cloud Messaging (FCM),它继承了可靠且可扩展的 GCM 基础架构以及许多新功能。
你是对的。谷歌有一项服务(GTalk Service),该服务在某些时间段内询问谷歌服务器。