`

Android数据推送实现方案

阅读更多

转自:http://blog.csdn.net/joshua_yu/article/details/6563587

 

在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。

在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能。

Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。

但是经过一番研究发现,这个服务存在很大的问题:

1)C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统;

2)C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用,我们的App Server必须也在国外,这个恐怕不是每个开发者都能够实现的;

有了上述两个使用上的制约,导致我最终放弃了这个方案,不过我想利用另外一篇文章来详细的介绍C2DM的框架以及客户端和App Server的相应设置方法,可以作为学习与参考之用。

即然C2DM无法满足我们的要求,那么我们就需要自己来实现Android手机客户端与App Server之间的通信协议,保证在App Server想向指定的Android设备发送消息时,Android设备能够及时的收到。下面我来介绍几种常见的方案:

1)轮询:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。

2)SMS:在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,你很难找到免费的短消息发送网关,关于这个方案的实现,可以参考如下链接:https://labs.ericsson.com/apis/mobile-java-push/

3)持久连接:这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过这个方案也存在不足,就是我们很难在手机上实现一个可靠的服务。Android操作系统允许在低内存情况下杀死系统服务,所以你的通知服务很可能被操作系统Kill掉了。

前两个方案存在明显的不足,第三个方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMail,GTalk以及GoogleVoice都可以实现实时更新的。

 

Ø  采用MQTT协议实现Android推送

MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。

我们可以从这里下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现

架构如下所示:

 

wmqtt.jar 是IBM提供的MQTT协议的实现。你可以从如下站点下载它。你可以将该jar包加入你自己的Android应用程序中。

Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。

SAM是一个针对MQTT写的PHP库。你可以从这个下载它.

send_mqtt.php是一个通过POST接收消息并且通过SAM将消息发送给RSMB的PHP脚本。

实例代码:

 

可以从GitHub上下载实例应用。运行该应用以后,通过手机浏览器访问http://tokudu.com/demo/android-push/,在第一个输入框输入设备ID,在第二个输入框输入想要发送的消息内容,按下“Send Push Message”按钮,你就应该可以看到手机上收到了通知了。你也可以从这个GitHub地址上下载android-push源代码,它包含了send_mqtt.php脚本。

 

 

Ø  采用XMPP协议实现Android推送

这是我在项目中采用的方案。事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。

XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。

androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。它的实现示意图如下:

 

androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,可以直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。

androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与openfire是不同的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。服务器架构如下:

 

最上层包含四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。

服务器端界面如下,分别对应了上述的几个功能模块:

 

 

 

 

 

 

      发送以后,我们可以在手机端看到接收的消息:

 

      这个解决方案的最大优势就是简单,我们不需要象C2DM那样依赖操作系统版本,也不会担心某一天Google服务器不可用。利用XMPP协议我们还可以进一步的对协议进行扩展,实现更为完善的功能。

采用这个方案,我们目前只能发送文字消息,不过对于推送来说一般足够了,因为我们不能指望通过推送得到所有的数据,一般情况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知以后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。

分享到:
评论

相关推荐

    Android:最全面解析Android消息推送解决方案.docx

    今天,我们将全面介绍 Android 中实现消息推送的 7 种主流解决方案。 一、前言 随着运营需求的增强,消息推送在 Android 开发中应用的场景是十分常见的。作为开发者,不要有需求就接,应该多思考、多理解用户 / ...

    Android推送实现方案探讨

    GCM作为一个轻量级的消息传递框架,能够帮助开发者实现Android应用程序的数据推送。然而,GCM在国内的使用受到一些限制: - 需要Android系统版本为2.2及以上; - 在中国地区服务稳定性不高; - 用户需要绑定...

    Android实现推送方式解决方案系列教程

    在探讨Android实现推送方式解决方案的过程中,我们聚焦于XMPP协议这一关键知识点,深入解析其在Android推送机制中的应用。XMPP(Extensible Messaging and Presence Protocol)作为一种基于XML的即时通讯协议,不仅...

    android推送解决方案

    "Android 推送解决方案" Android 推送解决方案是指在 Android 平台上实现推送功能的各种方法和技术。推送功能是在移动互联网时代中的一种常见的技术,主要应用于各类移动应用程序中,以便实时地将服务器端的最新...

    android视频推送

    在Android平台上实现视频推送,尤其是基于RTSP(Real-Time Streaming Protocol)的技术,是移动应用开发中的一个重要领域。RTSP是一种应用层协议,主要用于控制多媒体数据的传输,常用于实时流媒体服务,如在线直播...

    Android消息推送的完美解决方案

    然而,由于Android系统的开放性和碎片化,实现高效、稳定的推送服务并非易事。本文将探讨几种常见的Android消息推送解决方案,以及它们的优缺点。 首先,消息推送分为Pull(拉)和Push(推)两种方式。Pull方式是...

    基于XMPP协议的Android消息推送设计与实现.pdf

    基于XMPP协议的Android消息推送设计与实现 本文主要介绍了基于XMPP协议的...本文基于XMPP协议的Android消息推送设计与实现,提供了一种高效、可靠和安全的消息推送解决方案,能够满足不同行业和领域的消息推送需求。

    Android消息推送

    下面我们将详细探讨Android消息推送的实现机制、常见方案以及离线消息的处理策略。 首先,Android消息推送通常依赖于云服务,如Google的Firebase Cloud Messaging (FCM,前身为GCM) 或自建的服务。FCM是Google提供...

    openfire+asmock实现android消息推送

    【标题】"openfire+asmock实现android消息推送"揭示了如何在Android平台上利用Openfire服务器和Mocking框架AsMock来构建一个实时的消息推送系统。Openfire是一款开源的即时通讯服务器,它基于XMPP(Extensible ...

    Android 推送代码整合

    ### Android推送代码整合详解 ...总之,Android推送代码整合是一个涉及多个方面的过程,不仅需要技术上的实现,还需要考虑到用户体验、隐私保护等多个方面。希望本文能够帮助你更好地理解和掌握这一重要功能。

    基于Web和Android的APP信息统一推送系统的设计与实现.pdf

    《基于Web和Android的APP信息统一推送系统的设计与实现》 在移动互联网时代,APP已经成为人们日常生活的重要组成部分,而信息推送作为APP与用户互动的关键环节,其效率和用户体验直接影响着APP的受欢迎程度。然而,...

    android推送开源框架

    AndroidPN,全称为Android Push ...总之,AndroidPN为Android开发者提供了一套强大而灵活的推送解决方案,简化了远程通知的实现,使得开发者能够专注于应用的核心功能,同时确保用户能够及时收到重要更新和消息。

    Android推送通知指南

    然而,Android平台的推送通知实现并不像iOS那样简单,因为它依赖于Google的Cloud to Device Messaging (C2DM)服务,该服务自Android 2.2版本开始内置,但不支持更早的版本,且在国内的可用性受限,这给开发者带来了...

    Android DevCamp幻灯片分享:Android消息推送实现 | 友盟 徐仙明

    对于Android开发者而言,在选择消息推送方案时应综合考虑项目的规模、预算、安全需求等因素。GCM在理想环境下是优秀的解决方案,但在国内使用时需谨慎考虑其局限性。自建服务器或选择第三方服务商是较为灵活的选择,...

    Android之基于百度云推送IM

    总结,基于百度云推送的Android即时通讯解决方案提供了丰富的功能和易用的API,可以帮助开发者快速实现消息推送功能,提升用户体验。理解并熟练运用上述关键技术和知识点,是成功集成和优化推送服务的基础。

    Android-fpush-基于Nettyprotobuf实现的即时消息推送服务

    本项目"Android-fpush-基于Nettyprotobuf实现的即时消息推送服务"就是这样一个解决方案,它利用了Netty框架和Protocol Buffers(protobuf)技术来高效、稳定地实现这一功能。 Netty是一个高性能、异步事件驱动的...

    NIO加线程池实现Android消息推送

    总之,"NIO加线程池实现Android消息推送"是一个高效、可扩展的推送方案,利用了Java NIO的非阻塞特性以及线程池的并发处理能力,为Android应用提供了一种可靠的实时通信方式。通过持续优化和调整参数,可以进一步...

    Android 信息推送,史上最完美BUG! android 推送客户端

    本压缩包文件提供的内容是基于XMPP(Extensible Messaging and Presence Protocol)的Android信息推送客户端解决方案,针对原有代码中的BUG进行了修复,并允许开发者根据自己的业务需求进行定制。 XMPP是一种基于...

    android xmpp的消息推送

    总的来说,基于XMPP的Android消息推送提供了灵活、可扩展的实时通讯方案。开发者需要熟悉XMPP协议,选择合适的客户端和服务器库,并实现客户端与服务器之间的通信逻辑。通过这样的方式,可以构建出高效、可靠的推送...

    android Mqtt推送 源码

    在移动应用开发中,实时通信功能是不可或缺的一部分,而 MQTT(Message Queuing Telemetry Transport)协议因其轻量级、低功耗和高效性,成为了许多开发者选择的实时推送方案。在Android平台上实现MQTT推送,能够...

Global site tag (gtag.js) - Google Analytics