我最近了解到iPhone应用程序能够接收几乎即时的应用程序通知的功能。 iPhone和向应用程序发送二进制消息的消息包,从服务器应用程序发送到电话应用程序的响应时间为0.5到5秒之间,可迅速弹出警报。这是作为数据而不是SMS发送的,是非常小的数据包,作为数据计划的一部分收取,而不作为传入消息。

我想知道,使用Android是否有类似的功能,或者是否有可能使用Android API实现与此相似的功能。为了澄清起见,我将类似定义为:


不是SMS消息,而是一些数据驱动的解决方案
尽可能实时
可扩展,即移动应用程序的服务器部分,我可以在几秒钟内通知成千上万个应用程序实例

我很高兴该应用程序可以基于请求,HTTP请求/响应样式,但是理想情况下我不想进行轮询只是为了检查通知而已;就像滴水般耗尽数据计划。

评论

gmail和gchat的通知通常在该阈值之内。应该有一种方法可以在您自己的应用程序中复制它。

是的,有一个使推送消息非常简单的android库...只需在您的应用程序中包含Jigy的Droid Notifications库,然后从那里开始只有大约10行代码...希望对您有所帮助
请访问Pushy(pushy.me),以获得实时的推送通知网关,该网关在后台使用MQTT来提高可靠性。全面披露-我创立了Pushy。

#1 楼

Firebase Cloud Messaging FCM常见问题解答是GCM的新版本。它继承了GCM的核心基础架构,可在Android,iOS和Chrome上可靠地传递消息。但是,他们将继续支持GCM,因为今天许多开发人员正在使用GCM SDK处理通知,并且客户端应用升级需要时间。

从2012年6月26日开始,Google Cloud Messaging是首选将消息发送到在设备上运行的应用程序的功能。

评论


Google通过code.google.com/android/c2dm提供了详细的文档,以将其实现到Java中的Android应用中,但缺少与C2DM的服务器端通信的示例代码。我在这里为此写了一个教程:blog.boxedice.com/2010/10/07/…

– davidmytton
2010-10-7 11:12

有没有一种方法可以向使用Android 2.2的用户提供推送通知,但是可以在没有推送通知的情况下使同一应用在旧版本上运行呢?

– OneWorld
2010-12-09 12:59

@OneWorld:是的,就像其他任何Android向后兼容技术一样,当C2DM不可用时,使用反射来选择替代策略,有关更多信息,请参见:developer.android.com/resources/articles/…

– Lie Ryan
2010-12-22 7:39



developer.android.com/videos/index.html#v=PLM4LajwDVc关于推送通知的Google I / O 2010演示

–vokilam
2011年2月2日在8:56



C2DM已于2012年6月26日正式弃用,请使用[Android的Google云消息传递](developer.android.com/guide/google/gcm/index.html代替

– Mithun Sreedharan
2012年7月9日在10:13



#2 楼

XMPP是一个很好的解决方案。我已将其用于支持推送的实时Android应用程序。 XMPP功能强大,高度可扩展且易于集成和使用。

有大量免费的XMPP服务器(尽管出于礼貌,您不应该滥用它们),并且有一些开源服务器可以在自己的机器上运行。 OpenFire是一个很好的选择。

您想要的库不是如上所述的Smack,而是aSmack。但是请注意,这是一个构建环境-您将必须构建该库。

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


Android客户端必须通过定期唤醒来保持持久的TCP连接,以向XMPP服务器发送心跳。
这显然在功耗方面带来了成本。以下是此费用的估算值:



使用1400mAh电池(由Nexus One和HTC Desire提供)
连接到一个3G网络,大约使用5mA
每5分钟发生一次唤醒,心跳,睡眠周期,需要三秒钟
完成并使用300mA
,因此每小时的电池使用成本为:

36秒300mA = 3mAh发送心跳
3600秒5mA = 5mAh闲置时间
4:95 + 3 = 7:95mAh组合


1400mAh电池在空闲状态下可持续使用约11.6天,在运行该应用程序时可持续7.3天,这意味着电池寿命减少了约37%。
但是,电池寿命减少了37%代表绝对最坏情况
实际上,鉴于设备很少完全处于空闲状态。



评论


但实际上,应用程序执行此操作后,电话将持续3个小时,因为当电话唤醒或显示开关打开或网络状态更改时,会运行数百个意图。

–先生
2014-02-17 5:33



#3 楼

最近,我开始使用Android的MQTT http://mqtt.org来完成您所要求的工作(即,不是SMS,而是数据驱动,几乎立即的消息传递,可伸缩,不轮询等)。 >
我有一篇博客文章,其中包含有关此方面的背景信息,以防有帮助http://dalelane.co.uk/blog/?p=938

(注意:MQTT是IBM技术,我应该指出我为IBM工作。)

评论


mqtt如何做到这一点?在某处必须进行某些轮询?即使是苹果也必须进行投票,但我认为他们一次只能进行一次连接,因此不会浪费太多电池...

– Janusz
2010-3-5在12:59

它通过打开TCP / IP连接并使其保持打开状态来实现。尽管确实需要偶尔在连接上发送一条小的ping消息以保持连接状态,但它不会轮询。

–dalelane
2011年2月1日于23:08

如果通过Google发送推送消息使您感到不舒服,那么绝对可以使用MQTT。此外,我们与客户签订了保密协议,禁止使用云服务进行数据交换。

–VH-NZZ
16-2-4在10:18

#4 楼

看看Xtify平台。看起来这就是他们在做什么,

#5 楼

Google正在贬值C2DM,但我认为他们的配额和免费版本取代了他们推出的GCM(Google Cloud Messaging)!它确实需要Android 2.2+! http://developer.android.com/guide/google/gcm/index.html

#6 楼

如果您可以依靠那里的Google图书馆来满足您的目标市场,那么您可能希望使用GTalk功能(在现有用户名上注册资源-在它们与BroadcastReceiver一起接收时拦截消息)。

如果不是这样,我希望您做不到,那么您将捆绑自己的XMPP版本。这很痛苦,但是如果XMPP作为一个独立的库单独捆绑在一起,可能会变得更容易。我相信它是建立在XMPP之上的。

评论


我认为文章统计信息说,只要gtalk库在设备上,背piggy功能将始终可用。您是否有一些示例资源,说明如何实际执行此操作?

– Janusz
2010-3-5 13:05

从1.0(iirc)开始,GTalk已从SDK中删除。

–雪花先生
2010-3-22在21:45

#7 楼

我一直在研究,jamessh推荐的PubSubHubBub不是一个选择。 PubSubHubBub用于服务器到服务器的通信



“我在NAT后面。我可以订阅集线器吗?集线器无法连接到我。”

/ Anonymous


不,PSHB是服务器到服务器
协议。如果您不支持NAT,那么您实际上不是服务器。尽管我们已经针对可选的PSHB
扩展提出了一些想法,以便为此类客户进行悬挂获取(“ long
民意调查”)和/或消息框民意调查
,但这不在核心
规格。核心规范仅是服务器到服务器。

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

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


我得出的结论是,最简单的方法是使用Comet HTTP push。这既是一个简单且易于理解的解决方案,但也可以在Web应用程序中重复使用。

#8 楼

有一个新的开放源代码工作,即使用Meteor彗星服务器作为后端,为Android上的推送通知开发Java库。您可以在Deacon项目博客中查看。我们需要开发人员,所以请大声疾呼!

#9 楼

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


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




#10 楼

我在哪里找不到它,但我相信gmail利用开放的TCP连接来进行电子邮件推送。

评论


Android应用程序的开发人员在joelapenna.com/blog/2009/07/android-foursquare-and-push上有一篇博客文章,似乎支持此内容。

–dalelane
09-10-5 22:38

这些在我看来,他们也在投票。移动设备与服务器建立连接,并通知服务器正在等待更新。实际的推送是由服务器启动的,这对于移动设备而言非常困难,并且大多数时间都涉及网络提供商的支持(SMS / WAP推送)...

–雪花先生
2010-3-22在21:27

“ C2DM允许第三方开发人员使用与Google应用相同的服务。”从Android Cloud到设备消息传递

–钴锂
2010年7月17日在2:45

#11 楼

由于GTalk已从SDK中删除,因此制作“标准”推送消息系统可能是一个好主意。这样,只需运行一项服务,只需打开一个额外的tcp连接即可。应用程序应使用Intents与此服务进行对话,并应首先请求允许从该服务发送和接收通知的权限。然后,服务应通知用户新的应用程序要发送和接收消息。然后,用户将授予或拒绝权限,因此他将保持控制。然后,应用程序将向该服务注册一个动作+类别,以便该服务知道如何传递推送的消息。

好主意吗?

#12 楼

您为什么不采用XMPP实现。现在有很多可用的公共服务器,包括gtalk,jabber,citadel等。对于Android,也有一个名为SMACK的SDK。我们不能说是推送通知,但是使用XMPP可以使客户端和服务器之间的连接保持打开状态,从而允许双向通信。意味着Android客户端和服务器都可以相互通信。目前,这将满足Android中Push的需求。我已经实现了一个示例代码,它确实很好用

评论


是否愿意提供指向您的示例代码的链接?是否进行过有关电池寿命的测试?

– Alex
2010年5月6日10:37

我已经对电池寿命进行了测试-在最坏的情况下,每六分钟需要发送一次心跳将使电池寿命减少30%(即,设备仅醒来才能发送心跳)。在最佳情况下(用户使用设备进行浏览,通话等),对电池寿命的影响可以忽略不计。

–肉
2011年4月17日在19:29

#13 楼

我最近开发了http://pushdroid.org,它是一个应安装在手机上的应用程序,就像google在2.2中实现它一样,这是从1.5开始的,并且可以通过意图广播。

#14 楼

GCM的问题在于,此过程涉及很多配置:


您必须向Android应用添加很多样板
您需要配置一个外部服务器以与GCM服务器通信
您将必须编写测试

如果您喜欢简单的东西(例如我),则应尝试UrbanAirship。这是(IMHO)在您的应用中无需进行大量配置即可使用GCM的最简单方法。它还为您提供了一个漂亮的GUI,以测试您的GCM消息是否正确传递。


您可以在此处找到文档和入门指南
您可以找到示例应用程序在这里


注意:我不以任何方式与UrbanAirship结盟

#15 楼

https://github.com/Guti/Google-Cloud-Messaging--Titanium-/blob/master/src/com/google/android/gcm/GCMRegistrar.java

它真的很好并且可以工作推送解决方案。

请尝试

#16 楼

他们有自己的侦听器,您必须通过在代码中使用其库类来使用它们。您不必费心去推动。您必须将消息发送到服务器,服务器会将消息推送到设备。他们使用OAuth。关于协议,有两种使用CCS和XMPP的方法。 CCS仅将XMPP用作经过身份验证的传输层,因此您可以使用大多数XMPP库来管理连接。要将通知发送到设备,您可以在android应用中编写要发送的代码以及服务器代码。消息发送仅由您的代码完成。 Google服务器在GCM情况下会妥善处理。您可以在此链接上查看详细信息

http://developer.android.com/google/gcm/server.html

此外,还有安全问题

google cloud邮件安全https://groups.google.com/forum/#!topic/android-gcm/M-EevBitbhQ

如果您的应用未运行,则设备也可以接收通知,因为您必须为广播侦听器编写代码。在后台,它将监听服务器,并且每当有消息包出现时,它将接收该消息作为通知。 Android提供了您无需理会的服务。您只需使用库类来使用这些资源,这些类将使您的工作更加轻松,并且如果您的应用未运行,则让它们编写代码,它也将收到通知。显然,会有一些听众鞭打该应用程序进行接收。选中此链接中的“接收消息”部分

http://developer.android.com/google/gcm/client.html

它也将接受用户的要求。对于GCM,它将成功。请选中“发送消息”

http://developer.android.com/google/gcm/client.html