首先感谢 Android推送通知指南这篇文章的作者来源:Linux社区 作者:joshua_yu,本来对这边文章进行了整理和实践。
关于推送是什么,工作流程是怎么样的,不是本篇文章所包含,在windowsphone7 和 ios平台都有比较好的应用程序推送的API,android系统为了使系统不依赖google服务器,没有提供这项服务。
在开发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平台上实现视频推送,尤其是基于RTSP(Real-Time Streaming Protocol)的技术,是移动应用开发中的一个重要领域。RTSP是一种应用层协议,主要用于控制多媒体数据的传输,常用于实时流媒体服务,如在线直播...
通过阅读和运行这个示例,你可以快速了解如何在自己的应用中实现信鸽推送功能。主要文件可能包括MainActivity.java(用于展示推送消息的处理)、XGPushReceiver.java(接收推送消息的广播接收器)以及相关配置文件。...
- **MQTT消息推送.doc**: 这份文档详细介绍了MQTT协议在Android上的应用,包括配置、连接、订阅、发布和断线处理等步骤,是学习和实践MQTT消息推送的基础教程。 - **rsmb.zip**: RSMB(Really Small Message Broker...
在Android系统中,本地推送(Local Push)是一种应用程序在不依赖远程服务器的情况下,实现消息推送的技术。它允许应用在特定时间或满足特定条件时向用户显示通知,无需持续连接到互联网,因此对于节省数据流量和...
"android极光推送Demo"是展示如何集成并使用极光推送服务的一个实例项目,旨在帮助开发者快速理解和实现推送功能。 1. **极光推送简介** 极光推送是由杭州极光科技有限公司提供的一个高效、稳定、便捷的消息推送...
在Android平台上,实现录屏直播并推送音视频到服务器,通常涉及到多个技术栈的整合,包括屏幕捕获、音视频编码、网络传输等。这里主要介绍如何使用RTMP(Real-Time Messaging Protocol)协议来实现这一功能,以及...
百度推送是一款免费的云推送服务,它能够帮助开发者高效、稳定地实现消息推送,适用于各种类型的Android应用。 首先,我们需要了解百度推送的基本概念。百度推送主要由两部分组成:服务器端和客户端SDK。服务器端...
本资源"android实现消息推送源码.rar"提供了一个实现这一功能的源代码示例,这对于开发者来说是学习和理解消息推送机制的宝贵资料。 消息推送在Android中的实现通常涉及以下几个关键知识点: 1. **GCM(Google ...
**使用GCM实现Android消息推送** 谷歌云消息(Google Cloud Messaging,简称GCM)是谷歌为开发者提供的一种跨平台消息推送服务,允许开发者向Android、iOS甚至Web应用发送消息。在Android开发中,GCM是实现后台消息...
本压缩包“Android消息推送.zip”提供了一个完整的示例,涵盖了从Qt到Android原生消息推送的实现过程,帮助开发者了解并掌握这一技术。 1. **Android消息推送原理** - Android的消息推送通常基于Google的Firebase ...
在Android应用开发中,消息推送是一项至关重要的技术,它能够实时地将服务器端的信息传递到用户的设备上,增强用户体验并促进用户与应用的互动。郭霖老师的“见证Android消息推送时刻”课程,深入讲解了这一领域的...
这个"可用的Android消息推送Demo"将帮助你理解和实践上述所有概念。通过阅读和调试源代码,你可以更好地了解如何在实际项目中集成和定制消息推送功能。无论是对初学者还是有经验的开发者来说,这个Demo都是一个宝贵...
在Android应用开发中,消息推送是一项...总的来说,这个"Android消息推送Demo"提供了学习和实践Android推送通知的一个基础平台,通过对官方Demo的改进,开发者可以更好地理解和掌握如何在自己的应用中实现FCM推送功能。
在Android开发中,Firebase Cloud Messaging(FCM)是Google提供的一种免费的服务,用于实现设备间或者服务器与设备间的消息推送。FCM可以帮助开发者实现实时数据传输,提高用户体验,例如通知用户新消息、更新或者...
"基于Netty框架的Android内网推送demo" 这个标题表明了我们要探讨的是一个使用Netty框架构建的Android应用程序,它的主要功能是实现内网环境下的消息推送服务。Netty是一个高性能、异步事件驱动的网络应用框架,常...
4. **统计分析**: 实现推送效果跟踪,收集用户反馈,持续优化推送内容和策略。 在提供的压缩包文件"0804(加上注释)"中,可能包含了详细的代码示例、配置文件和解释说明,这将有助于开发者更直观地理解和实施...
针对这些问题,开发者可以考虑使用**MQTT协议**来实现推送通知。MQTT是一个轻量级的发布/订阅协议,适合手机客户端的消息推送。IBM提供了名为wmqtt.jar的MQTT库,可以集成到Android应用中。同时,Really Small ...
在Android开发中,实现即时通讯(Instant Messaging, IM)功能是一项常见的需求,而基于百度云推送服务可以有效地解决这个问题。本文将围绕“Android之基于百度云推送IM”这一主题,详细解析其关键技术、核心类与...
本项目"**NIO加线程池实现Android消息推送**"旨在通过Java NIO和线程池技术构建一个高效的推送系统,尤其适用于服务器需要处理大量并发连接的情况。 首先,我们来理解NIO(Non-blocking Input/Output)的概念。NIO...
在Android平台上,信息推送服务是应用开发者不可或缺的功能之一,它使得应用可以在后台高效地与服务器进行通信,即使用户没有...这份资源对于学习和实践Android推送服务,尤其是基于XMPP的实现,具有很高的参考价值。