`
yzyspy
  • 浏览: 80935 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android实现推送实践

 
阅读更多

首先感谢 Android推送通知指南这篇文章的作者来源:Linux社区  作者:joshua_yu,本来对这边文章进行了整理和实践。

 

 

关于推送是什么,工作流程是怎么样的,不是本篇文章所包含,在windowsphone7 和 ios平台都有比较好的应用程序推送的API,android系统为了使系统不依赖google服务器,没有提供这项服务。

 

 

 

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

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

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

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

1C2DM内置于Android2.2系统上,无法兼容老的1.62.1系统;

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

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

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

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

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

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

前两个方案存在明显的不足,第三个方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMailGTalk以及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将消息发送给RSMBPHP脚本。

实例代码:


可以从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请求。服务器架构如下:

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

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



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

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

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

分享到:
评论
1 楼 zymsuper 2012-05-08  
xmpp 的连接方式是 长连接吗?如果是,那和你之前写的第三种持久连接有啥区别?

相关推荐

    PushService:Android消息推送实践(WebSocketMQTTSocket)

    PushService Android消息推送实现(多种方案) 1. WebSocket 基于OkHttp( 提供的WebSocket接口实现推送 2. MQTT 基于mqtt( 实现推送 3. Socket 基于 java.net.Socket 长连接实现推送 项目地址:

    Android 推送原理(Android Push Notification)详解

    由于最近项目中涉及到了Android推送,所以看了一些关于android推送方面的东西,总结到后面我们知道android推送的实现可以归结为3种: 1、POLL,拉。大致思路为向服务器定时的发送请求,然后自己让服务器返回信息。 ...

    ionic项目中使用极光推送-android.zip

    这部分内容包含了多个精心设计的Android项目案例,从需求分析、设计思路到实现过程,都有详细的讲解和代码示例。学习者可以通过实际操作,深入了解Android开发的整个流程,提升自己的实战能力。 此外,我们还提供了...

    人工智能-项目实践-毕业设计-基于Android的天气APP实现

    多知天气 开源框架 Butterknife注解式框架 http://jakewharton.github.io/butterknife/ Glide图片加载框架 https://github.com/bumptech/glide Okhttp网络请求框架 http://square.github.io/okhttp/ ...极光推送服务 h

    ACG:Android项目:模拟市面上各种基本框架做成的动漫资讯推送软件

    模拟市面上各种基本框架做成的动漫资讯推送软件###说明这个项目由主框架ActionBar的Tab页面+Fragment构成3大板块:动漫资讯,动漫美图,用户设置其中动漫资讯中用到了PullTpRefresh的ListView组件可动态从服务器中...

    Android项目源码NBA资讯和赛事信息的平台带服务端.zip

    无广告、推送信息,不后台常驻,空间占用小。但是因为某些原因作者关闭了web服务器,因此项目无法直接演示了,不过有服务端,如果可以搞定的话可以自己搭建服务端做演示。javaapk.com之前也介绍过很多网站客户端,...

    Android-Advance:Android进阶精简版

    20.推送机制实现原理详解 21. APPApp.svelte经验总结 22. Android Crash日志收集原理与实践 23. 函数式编程思想及其在Android中的应用 24. 依赖注入及其在Android中的应用 25.Android世界的Swift:Kotlin在Android中...

    BeeHive,一次iOS模块化解耦实践

    }1178次浏览 评价:好中差  android人机界面指南Android手机开发(一)Android手机开发(二)Android手机开发(三)Android手机开发(四)iPhone消息推送机制实现探讨手机软件测试用例设计实践手机客户端UI...

    Android项目源码机智云智能硬件物联网项目源码.rar

    机智云为智能硬件厂家提供成熟稳定、专业安全的SaaS服务,实现定向远程升级、规则引擎、消息推送、设备自动化操作、设备联动、企业API、用户自定义统计分析、2G/3G/4G产品支持和多种数据输出接口等功能。全面提升...

    视错觉升级版:多个视错觉效果实现

    }840次浏览 评价:好中差  android人机界面指南Android手机开发(一)Android手机开发(二)Android手机开发(三)Android手机开发(四)iPhone消息推送机制实现探讨手机软件测试用例设计实践手机客户端UI...

    react-native-push-notification:React本机本地和远程通知

    React本机推送通知 React适用于iOS和Android的本机本地和远程通知 :party_popper: 版本7.x上线了! :party_popper: 在CHANGELOG中查看更改和迁移:支持项目维护该项目需要时间。 为了分配时间,您可以给我买一杯咖啡...

    iOS8WebKit框架概览(下)

    }1044次浏览 评价:好中差  android人机界面指南Android手机开发(一)Android手机开发(二)Android手机开发(三)Android手机开发(四)iPhone消息推送机制实现探讨手机软件测试用例设计实践手机客户端UI...

    安卓第二天笔记--数据保存

    }932次浏览 评价:好中差  android人机界面指南Android手机开发(一)Android手机开发(二)Android手机开发(三)Android手机开发(四)iPhone消息推送机制实现探讨手机软件测试用例设计实践手机客户端UI...

    MultiDex工作原理分析和优化方案

    }1185次浏览 评价:好中差  android人机界面指南Android手机开发(一)Android手机开发(二)Android手机开发(三)Android手机开发(四)iPhone消息推送机制实现探讨手机软件测试用例设计实践手机客户端UI...

    微信公众平台应用开发:方法、技巧与案例.(机械工业.柳峰)

    第二部分(第3~4章)首先讲解了如何启用开发模式,然后详细讲解了公众平台的消息接口(包括请求校验、请求消息、事件推送和响应消息)。 第三部分(第5~6章)重点介绍了公众平台的自定义菜单接口和高级接口,并...

    RPC_Framework:基于TCP协议的远程过程调用框架客户端实现

    客户端实现了与服务端的短连接请求,长连接请求,服务端的推送消息; 客户端提供跨平台的支持,目前已经经过windows,linux,android,ios的测试; 服务端采用master-worker(one loop per thread)的高性能模型,...

    Git权威指南PDF完整版

    30.5.2 通配符版本库,管理员通过推送创建/ 434 30.5.3 直接在服务器端创建/ 435 30.6 对 Gitolite 的改进/ 435 30.7 Gitolite 功能拓展/ 436 30.7.1 版本库镜像/ 436 30.7.2 Gitweb 和 Git daemon 支持/ 438 30.7.3...

Global site tag (gtag.js) - Google Analytics