推送通知技术如何在 Android 上运行?

Posted

技术标签:

【中文标题】推送通知技术如何在 Android 上运行?【英文标题】:How does push notification technology work on Android? 【发布时间】:2012-07-16 16:34:28 【问题描述】:

Google 是如何实现他们的推送通知功能的?它是通过在后台运行的服务完成的轮询工作还是以其他方式工作?

【问题讨论】:

对我来说听起来像是一个真正的问题。我想知道答案,谷歌把我带到了这里。又一次质量问题结束了。 【参考方案1】:

从我在以色列举行的 android 开发者大会上听到的消息:

在云 Google 服务器上的 accept mode 中只是有一个 TCP 套接字在等待。 TCP 连接已由 Google Play 应用程序启动。这就是为什么必须在设备上安装 Google Play 才能使 Google Cloud Messaging (GCM)(以前的 Android Cloud to Device Messaging Service - C2DM)工作。

当这个 TCP 客户端套接字接收到一些消息时,该消息包含信息,例如它应该被寻址到的应用程序的包名称,当然还有数据本身。此数据被解析并打包到一个intent 中,该intent 被广播并最终被应用程序接收。

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

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

【讨论】:

但我认为它也适用于模拟器。我想到的是该设备会使用其当前路径(IP)保持服务器更新。当谷歌服务器需要发送通知时,它会采用其当前路径并将消息转发到该路径。我在某种程度上是对的吗? @Khawar Raza:当设备的 IP 由于某种原因发生更改时,设备会与服务器断开连接。当它发生时 - 新的连接会根据设备的新 IP 生成。 我明白了。这实际上会很有趣,我想知道这是不是真的。 所以还是轮询,但好的一面是轮询是由 Google Play 集中进行的。 最后,计算机中的所有通信都只是轮询。路由器正在轮询 Google 服务器是否已发送数据包。网卡正在轮询路由器是否已将数据包重定向到它。 CPU 正在轮询网卡是否引发了中断。关键在于如何有效地进行投票。【参考方案2】:

Android 与 Google 的服务器保持一个活动连接,但它不会使用太多的电力或数据,因为在有东西向您手机上的应用程序发送 Google Cloud Messaging (GCM) 消息之前,不会沿该连接发送任何流量。手机上只有一个连接,供所有应用使用:安装使用 GCM 的新应用不会增加任何额外负载。

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

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

取自:Source 另见here。

【讨论】:

只是关于 GCM 连接的评论。该单一连接是轮询连接。 对我来说至关重要的部分是第三方服务器,例如电子邮件服务器确实会向 Google GCM 服务器发送通知消息。这是 Google 免费提供的一项服务,任何此类第三方都必须使用其 GCN 协议与 Google 服务器建立通信通道。顺便说一句,该协议几乎只是一个 JSON 格式的 HTTP 响应。有关详细信息,请参阅developers.google.com/cloud-messaging。【参考方案3】:

您可以通过长轮询 tcp 连接自己在 android 上实现推送通知。 但这将涉及维护一个额外的插座 => 电池消耗。 或者您可以使用警报管理器定期打开连接。

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

【讨论】:

所以它确认客户端正在沿着 tcp 连接进行轮询,对吗?你知道它多久轮询一次数据吗?例如,它是每 5 秒一次吗?还是像心跳一样快?【参考方案4】:

自 2018 年 4 月 10 日起,Google 已弃用 GCM。 GCM 服务器和客户端 API 已弃用,最快将于 2019 年 4 月 11 日移除。将 GCM 应用迁移到 Firebase Cloud Messaging (FCM),它继承了可靠且可扩展的 GCM 基础架构以及许多新功能。

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

【讨论】:

【参考方案5】:

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

【讨论】:

我不知道。我刚刚阅读了 C2DM 是如何工作的。现在有些事情可以改变了。

以上是关于推送通知技术如何在 Android 上运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在后台的android应用程序图标上计算推送通知消息徽章

如何在锁定屏幕上显示 gcm 推送通知?

如何在移动设备上发送推送通知(Android Chrome)PWA

在 Android 上使用 GCM 推送通知

在 React Native 中更新推送通知令牌

推送内容更改通知