安卓支持近实时推送通知吗?

358

我最近了解到iPhone应用程序可以接收几乎即时的通知到应用程序通知到应用程序

这是通过推送通知提供的,这是一种定制协议,它保持与iPhone的始终连接,并将二进制数据包发送给应用程序,应用程序极快地弹出警报,从服务器应用程序发送到手机应用程序响应时间为0.5-5秒。这是作为数据而不是SMS发送的,以非常非常小的数据包的形式收取,计入数据计划而不是作为传入消息。

我想知道使用Android是否有类似的功能,或者是否可能使用Android API实现接近此功能。澄清一下,我定义类似为:

  • 不是SMS消息,而是一些数据驱动的解决方案
  • 尽可能实时
  • 可扩展,即作为移动应用程序的服务器部分,我可以在几秒钟内通知数千个应用程序实例
我希望应用程序可以采用基于拉取的HTTP请求/响应方式,但理想情况下,我不想频繁轮询以检查通知;此外,这样做会消耗数据计划。

3
Gmail和Gchat的通知通常在这个阈值之内。你自己的应用程序应该有一种方法来复制这个功能。 - Dana the Sane
是的,有一个安卓库可以使推送消息变得非常简单...只需在您的应用程序中包含Jigy's Droid Notifications库,然后从那里只需要大约10行代码...希望这可以帮助您 :) - Corey Harden
请查看Pushy(https://pushy.me/),这是一个实时推送通知网关,底层使用MQTT以提高可靠性。完全透明披露 - 我是Pushy的创始人。 - Elad Nava
16个回答

221

Firebase Cloud Messaging FCM FAQ是GCM的新版本。它继承了GCM的核心基础设施,可在Android、iOS和Chrome上可靠地传递消息。然而,他们将继续支持GCM,因为许多开发者今天仍在使用GCM SDK处理通知,并且客户端应用程序升级需要时间。

截至2012年6月26日,Google Cloud Messaging是向在设备上运行的应用程序发送消息的首选方式。

以前(现已弃用),该服务被称为Cloud To Device Messaging


14
Google提供了详细的文档,以便在Java中将其实现到您的Android应用程序中,网址为http://code.google.com/android/c2dm/,但他们用于与C2DM服务器端交互的示例代码有所不足。我已经在这里为此方面撰写了一篇教程:http://blog.boxedice.com/2010/10/07/android-push-notifications-tutorial/。 - davidmytton
2
有没有一种方法可以为使用 Android 2.2 的用户提供推送通知,但是使得相同的应用可在旧版发行中运行,只是没有推送通知? - OneWorld
3
@OneWorld:是的,就像其他 Android 向后兼容技术一样,当 C2DM 不可用时,使用反射来选择备用策略。更多信息请参见:http://developer.android.com/resources/articles/backward-compatibility.html。 - Lie Ryan
6
C2DM已于2012年6月26日正式弃用,请使用Google Cloud Messaging for Android - Mithun Sreedharan
1
但是在Android GCM(推送通知)中,如果应用程序停止运行,则设备将无法接收通知。是否有任何解决方案?如果没有,如何实现实时通知? - Salmaan
显示剩余4条评论

51

XMPP是一个不错的解决方案。我已经在一个启用推送、实时的Android应用程序中使用了它。XMPP功能强大、高度可扩展且易于集成和使用。

有很多免费的XMPP服务器(虽然出于礼貌你不应该滥用它们),还有开源服务器可以在自己的计算机上运行。OpenFire是一个很好的选择。

你需要的库不是Smack,而是aSmack。但请注意,这是一个构建环境 - 你将不得不构建库。

这是我对XMPP解决方案电池寿命影响的计算:

Android客户端必须通过定期唤醒以向XMPP服务器发送心跳来保持持久的TCP连接。
这显然会在功耗方面产生成本。下面提供了这个成本的估算:
  • 使用1400mAh电池(如Nexus One和HTC Desire中提供的)
  • 空闲设备,连接到3G网络,大约使用5mA
  • 唤醒、心跳、睡眠循环每5分钟发生一次,需要3秒钟才能完成,并且使用300mA
  • 因此,每小时电池使用成本为:
    • 36秒300mA = 3mAh发送心跳
    • 3600秒5mA = 5mAh空闲
    • 4.95 + 3 = 7.95mAh组合
  • 使用1400mAh电池时,空闲状态下持续时间约为11.6天,运行应用程序时持续时间约为7.3天,这表示电池寿命减少了约37%。
  • 但是,在实践中,电池寿命减少37%代表了最坏的情况,因为设备很少完全空闲。

3
然而在实际使用中,当应用程序这样做时,手机电池只能持续3个小时,因为当手机唤醒、屏幕开启或网络状态改变时会触发数百个意图。 - Monstieur

34

我最近开始尝试使用MQTT http://mqtt.org来解决你所提出的问题(即不使用短信,而是使用数据驱动、几乎立即传递消息、可扩展、非轮询等方式)。

我在博客中提供了相关背景信息,如果有帮助的话可以查看http://dalelane.co.uk/blog/?p=938

(注:MQTT是IBM技术,我应该指出我是IBM的员工。)


1
MQTT 是如何实现的?肯定有一些轮询涉及其中吧?即使是苹果也必须进行轮询,但我认为他们只在一次连接时进行,因此不会消耗太多电池... - Janusz
3
它通过建立并保持TCP/IP连接来实现。它不进行轮询,但必须偶尔向连接发送小的ping消息以保持连接活跃。 - dalelane
1
如果通过 Google 发送推送消息让您感到不安,那么 MQTT 绝对是一种可行的方式。此外,我们与客户签署了保密协议,禁止使用云服务进行数据交换。 - VH-NZZ

14

看一下Xtify平台。看起来他们正在做这个。


12

8

有一个新的开源项目致力于开发一个使用Meteor彗星服务器作为后端,用于Android推送通知的Java库。您可以在Deacon 项目博客中查看。我们需要开发人员,所以请传播这个消息!


8

谷歌最近(2016年5月18日)宣布Firebase现在是其面向移动开发者的统一平台,包括近实时推送通知。它也是多平台的:

该公司现在为所有Firebase用户提供免费和无限的通知,支持iOS、Android和Web。

来源


8
如果您可以依赖Google库为您的目标市场提供支持,那么您可能想要利用GTalk功能(在现有用户名上注册资源,然后使用BroadcastReceiver拦截消息)。
如果不能,我预计您无法做到这一点,那么您需要捆绑自己的XMPP版本。这很痛苦,但如果将XMPP作为独立库单独捆绑,则可能会更容易。
您还可以考虑PubSubHubub,但我不知道它的网络使用情况。我相信它是建立在XMPP之上的。

我认为这篇文章表明只要设备上有gtalk库,piggy back功能就会一直可用。您是否有一些示例资源来实际操作呢? - Janusz
自1.0版本(如果我没记错的话),SDK中已经移除了GTalk。 - MrSnowflake

8

我一直在研究这个问题,但是Jamesh推荐的PubSubHubBub不是一个选项。PubSubHubBub旨在用于服务器之间的通信。

"我在NAT后面。我能订阅Hub吗?Hub无法连接到我。"

/匿名

不行,PSHB是一种服务器对服务器的协议。如果你在NAT后面,你并不是真正的服务器。虽然我们已经考虑过为这些客户端提供可选的PSHB扩展来进行挂起获取(“长轮询”)和/或消息框轮询,但这不在核心规范中。核心规范仅限于服务器对服务器。

/Brad Fitzpatrick,加利福尼亚州旧金山

来源:http://moderator.appspot.com/#15/e=43e1a&t=426ac&f=b0c2d(无法直接链接)

我得出的结论是,使用Comet HTTP推送最简单。这既是一个简单而且被广泛理解的解决方案,同时也可以被用于Web应用程序。


6

为什么不选择XMPP实现呢?现在有很多公共服务器可用,包括gtalk、jabber、citadel等。对于Android,也有一个名为SMACK的SDK可用。虽然这不能称为推送通知,但使用XMPP可以保持客户端和服务器之间的连接,从而允许双向通信。这意味着Android客户端和服务器都可以相互通信。目前,这将满足Android中的推送需求。我已经实现了一个示例代码,它真的非常好用。


能否提供您示例代码的链接?对电池寿命进行了任何测试吗? - Alex
我已经对电池寿命进行了测试 - 每六分钟发送一次心跳信号在最坏的情况下会使电池寿命减少30%(即设备只唤醒以发送心跳信号)。在最好的情况下(用户正在使用设备进行浏览、通话等),对电池寿命的影响可以忽略不计。 - flesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接