APP下载

基于Android平台的消息推送研究与实现

2014-05-16倪红军

实验室研究与探索 2014年5期
关键词:轮询服务器端应用程序

倪红军

(南京师范大学泰州学院信息工程学院,江苏泰州 225300)

基于Android平台的消息推送研究与实现

倪红军

(南京师范大学泰州学院信息工程学院,江苏泰州 225300)

针对Android平台的智能终端在获取推送消息时存在的与服务器端数据同步、费电、耗流量和推送成本高等问题,通过对传统Pull和Push方式的简单轮询、短信服务、持久连接和长轮询等四种技术的分析和对Android平台目前采用的C2DM、MQTT、XMPP等方案的研究,发现了具体实现时可能出现的向下兼容性不好、硬件成本高和性能不稳定等不足。探讨了一种基于AlarmManager机制在移动终端与服务器之间维持TCP长连接来实现实时推送的方案。最后结合国内采用该方案的极光推送JPush平台设计了一个由服务器端和Android客户端组成的校园快讯系统。

消息推送;长连接;AlarmManager;Android

0 引言

随着信息技术的高速发展,移动互联网络已经成为人们有效获取信息的一个绝佳平台。特别是Apple推出iPhone、Google推出 Android、Microsoft推出 WP7后,基于这三种系统的智能终端设备正逐渐代替传统的PC机成为访问互联网的主要工具。但无论是智能终端设备用户还是传统PC机用户要获取Internet上的各类新闻、商品资讯等信息,一般还是使用浏览器在网上搜索,然后在一大堆信息中检索出自己感兴趣的内容。这种传统获取信息的方式不仅费时、低效,同时也越来越不能满足信息量爆增时代的用户需求。对于因特网提供(如商品资讯发布商家)希望能够将信息及时或定时地发送给预定用户,用户也希望随时、随地即时地获取因特网内容提供者的信息(如商家的最新商品资讯),这样,消息推送就应运而生。

所谓推送技术就是一种基于C/S(客户端/服务器)机制,由服务器主动将信息发往客户端的技术。其优点在于信息发送的主动性和及时性,可随时将信息推送到用户面前(客户端)[1]。本文详细阐述移动互联网中四种推送技术的原理,通过对它们优缺点和使用场合的分析,探讨Android平台下实现消息推送功能的一些解决方案,并结合国内第三方免费消息推送平台——JPush(极光推送)设计一个基于 Android平台的快讯系统。

1 传统的推送技术与实现原理

应用开发者在开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,比如火车票查询系统,就需要及时获取服务器上最新的火车票信息。要获取服务器上不定时更新的信息,通常采用两种方式:①Pull(拉)的方式,即客户端每隔一段时间访问服务器,看是否有更新的信息;②Push(推送)的方式,即在服务器端有新信息后,就自动将最新的信息Push到客户端[2-4]。目前,移动互联网中采用Pull和Push方式的具体技术主要包括下面4种。

1.1 简单轮询

简单轮询技术实现时要求客户端应用程序定时与服务器进行连接,并查询是否有新的消息到达。它的实质是一种Pull方式,采用此方式进行应用开发时,需要选择一个合适的轮询间隔时间,如果间隔时间太长,可能会导致某些消息延迟;如果间隔时间太短,则会大量消耗网络带宽和电池电量[5]。而对于Android平台的移动终端的网络流量和电池电量在使用时都是受限制的,所以此方式一般适用于对实时性要求不高的场合,而不适用于Android平台的消息推送。

1.2 短信服务(SMS)

SMS技术是通过发送二进制短信到移动客户端,来达到通知用户的目的。客户端通过拦截该类短信,分析短信PDU的数据来了解服务器的意图,然后进行相应的操作处理。它是一种典型的Push方式,Push短信是通过Wap Push来承载,内容包括头部和数据两部分,头部中包含有目的端口和源端口[6-7]。在Android平台的客户端具体实现时,可以由下面三个步骤完成:

(1)客户端静态注册一个广播接收器。即使应用不在运行,广播接收器也可以拦截短信;

(2)当Push短信下发时,Android系统发起Intent激活广播接收器;

(3)广播接收器拦截短信内容后,对短信内容进行解析,了解服务器的数据发生何种变化,然后由Android客户端应用程序进行相应处理。

SMS技术可以实现完全的实时操作,对Android平台的移动终端而言,实现上述三个步骤是比较容易的,而且电量和数据流量的消耗都不算大,但是该技术的成本相对比较高,实现时需要向移动公司缴纳相应的费用[8],所以此方式在对实时要求比较高而且不考虑成本的场合,可以用于Android平台的消息推送。

1.3 持久连接

持久连接实现时要求客户端和服务器端之间建立长久连接,只要服务器端有消息要发送,直接Push就可完成。这种方式可以实现Push消息的及时性和实时性,但是需要与服务器端长期保持连接,不仅消耗移动终端的电量,而且更容易消耗服务器资源。

1.4 长轮询

长轮询也称为持久轮询,是客户端发起请求后服务器端首先将该请求挂起(不返回响应),直到超时、异常或需要处理响应(Push消息需要发送)时,再返回响应;客户端收到响应后再次请求(即轮询)服务器端,并处理响应[9-10]。这种方式解决了简单轮询的实时性差的问题,也解决了持久连接消耗服务器资源的问题,但还是会消耗移动终端的电量,每次收到数据之后需要重新发送连接,如果传输的数据量比较少,那么建立连接的时间就会成为主要开销,有效利用率低。

2 基于Android平台的消息推送方案分析

2.1 三种常见推送方案

由于Android操作系统在内存占有率较高的情况下会自动Kill系统服务,所以运行着移动终端推送服务很有可能会被系统Kill掉。这样,就是在不考虑服务器资源消耗和电量消耗的情况下,持久连接和长轮询方式在某种程度下也不能满足应用需要,而简单轮询和SMS也存在着明显的不足。为了弥补这些不足也出现了一些专门针对Android平台消息推送的方案:

(1)Google官方的 C2DM 云端推送[11]。在Android平台上,Google提供了C2DM(Cloud to Device Messaging)服务,它是一个用来帮助开发者从服务器向Android应用程序发送信息的服务,该服务提供了一个简单的、轻量级的机制,允许服务器可以通知Android应用程序直接与服务器进行通信,以便从服务器获取Android应用程序更新和最新用户数据。?但是这个服务存在三个主要缺陷:①C2DM内置于Android 2.2版本以上系统,无法兼容以前版本;②C2DM需要依赖于Google官方提供的C2DM服务器,对国内网络用户来说,由于网络环境的影响,可能不能达到预期效果;③由于该服务并没有与硬件系统集成,国内硬件厂商在生产Android平台移动终端时,可能会把Google原生的C2DM服务去掉,这样也会导致推送功能不能实现。

(2)使用IBM的MQTT协议实现推送。MQTT是一种轻量级的、基于代理的“发布/订阅”模式的消息传输协议[12]。该协议简洁、小巧、可扩展性强、省流量、省电,目前已经应用到企业领域。但是技术还不够成熟、实现较复杂、部署硬件成本较高,不太适合小型企业Android平台移动终端的消息推送服务。

(3)使用IETF标准化的XMPP协议实现推送。XMPP的前身是 Jabber,它是基于可扩展标记语言(XML)的协议,用于即时消息和在线探测[13-14]。该协议成熟、强大、可扩展性强,目前主要应用于许多聊天系统中,且有开源的Java版的开发实例androidpn。但是协议复杂、冗余、费流量、费电,部署成本高。笔者部署androidpn时,经过测试也发现了一些问题:①时间过长时,就再也不收不到推送信息;②消息一旦从服务器推送出去,不管有没有推送到客户端,就不再管理;③性能也不够稳定。

对上述三种推送方案的分析,比较客观地反映出它们的优缺点,在实际应用开发中,都将影响使用。

2.2 一种改进的推送方案

因为Android平台的移动终端硬件、电量、网络流量的限制,移动互联网应用在设计上跟传统 PC上的应用有很大不同,需要根据移动终端硬件的自身特点,尽量节省电量和流量,同时又要尽可能地保证数据能及时到达客户端。为了解决数据同步的问题,在移动终端上通常采用两种方法。一种是移动终端定时去服务器上查询数据,也就是Pull;另一种是移动终端与服务器之间维护一个TCP长连接,当服务器有数据时,实时推送到移动终端,即Push。根据前面的分析,已经很明显看出Pull方式实时性较差,不太适合推送,而长连接Push方式在这个方面有很大的优势,但是,由于长连接Push在维持连接时耗电,所以改进方案就是从节电方面考虑。要维持长连接,必须依靠循环定时执行任务来实现,而Android系统中定时运行任务的方法有两种,一种方法用 Timer,另一种是AlarmManager[15-16]。Timer类需要用 WakeLock 让 CPU保持唤醒状态,这样会大量消耗手机电量,大大缩短移动终端待机时间,不能满足应用需求。AlarmManager是Android系统封装的用于管理RTC的模块,RTC(Real Time Clock)是一个独立的硬件时钟,可以在CPU休眠时正常运行,在预设的时间到达时,通过中断唤醒CPU。这样当AlarmManager定时执行任务时,CPU可以正常休眠,可以大大节约电量消耗。现在国内的第三方商用平台——极光推送就是采用的这种方式,该平台只要注册后就可以直接免费使用,完全能够达到推送效果。

3 基于Android平台快讯系统的实现

Push是个基础服务,不管是以开源方案为基础搭建,还是完全自主研发,投入都是比较大的,需要有网络服务方面的专业团队。投入很大的开发成本后,随着客户端用户量不断增大,其后期扩容、维护的工作量,也都是不断上升的,难度也越来越大。所以,大多数应用开发者,不是去自己搭建Push这个基础服务,而是考虑去使用第三方提供的专业的服务。下面就以国内免费的极光推送为例介绍Android平台的快讯系统实现过程。快讯系统实现包括服务器端和Android客户端两个部分。

3.1 服务器端的实现

服务器端的主要功能就是通过Jpush第三方平台向客户端发送推送消息。为了实现这个功能,需要有使用该平台的开发者帐号应用标识(AppKey),实现步骤如下:

(1)创建开发者帐号。登录极光推送注册页面(https://www.jpush.cn/accounts/signup/),出现注册页面,分别在对应的文本框中输入相关信息后,出现如图1所示登录页面。

图1 登录界面

(2)创建应用。登录后,点击“创建应用”按钮,出现如图2所示的创建应用程序页面,在应用程序名称和Android包名的文本框中分别输入“泰院快讯”和cn.edu.nnutc.message,开发者在输入包名时要保证与应用开发过程中的源程序完全一致。然后点击“创建我的应用”按钮,就可以生成一个应用标识(AppKey),开发者开发应用时,AndroidManifest.xml配置文件中的包名和AppKey与这儿要完全一致。

(3)下载应用Example。应用创建成功后,即进入“应用详情”页面,此时有一个“下载 Android Example”按钮,点击该按钮后,即可获得一个压缩文件包,解压后,将该Android Example项目导入Eclipse,并修改 AndroidManifest.xml配置文件中的包名和AppKey。其他信息的修改与正常的Android应用开发一样,这儿不再赘述。笔者在开发快讯系统时,并没有使用Android Example示例项目,而是根据实际应用功能需求设计并实现快讯系统。

图2 创建应用页面

3.2 快讯系统的实现

(1)导入SDK开发包到应用程序项目,下载Jpush Android SDK 并解压,将 jpush-sdk-release1.x.y.jar文件复制开发的应用程序项目libs目录下;

(2)配置 AndroidManifest.xml,根据 SDK 压缩包里的AndroidManifest.xml样例文件配置应用程序项目的AndroidManifest.xml文件,即复制样例文件中备注为"Required"的部分到应用程序项目的配置文件中,将备注为替换包名的部分替换为应用程序的包名,将AppKey替换为在4.2中创建应用时获得的Key值;

(3)添加代码,Jpush SDK提供了 cn.jpush.android.api.JpushInterface 类,在 MainActivity.java 类的onCreate()方法中使用JPushInterface.init(Context)语句 初 始 Jpush SDK,然 后 使 用CustomPushNotificationBuilder类定制通知栏样式,代码如下:

(4)使用BroadcastReceiver接收JPush平台推送的消息,新建一个继承 BroadcastReceiver的MyBroadCastReceiver.java文件,Jpush平台推送的消息Bundle由客户端的BroadcastReceiver监听接收后,再传递给显示界面NoticeActivity.java,效果如图3所示。其关键代码如下:

图3 推送消息显示界面

4 结语

本文通过对传统的消息推送方式原理分析和常见的Android平台消息推送方案研究,发现了它们在消息推送实现时存在数据不同步、费电和耗流量等问题,并根据问题产生的原因,提出了使用AlarmManager机制维持Android终端与服务器之间维持TCP长连接的一个消息推送方案,设计并实现了一种基于第三方平台Jpush的校园快讯系统。详细阐述了校园快讯系统服务器端和Android客户端的实现过程,经过系统的运行和测试,在TCP长连接的维持下,保证了数据推送的同步,节省了Android客户端的流量和电量,达到了预期效果。

[1] 沈洪洲,宗乾进,袁勤俭.应用Google云消息框架C2DM实现商务信息推送服务[J].现代图书情报技术,2012,28(6):78-83.

SHEN Hong-zhou,ZONG Qian-jin,YUAN Qin-jian.Implementation of Commerce Information Push Service Using Google C2DM[J].New Technology of Library and Information Service ,2012,28(6):78-83.

[2] 华 春,胡 明.Push和Pull两种调度机制的仿真分析与研究[J].光通信技术,2008,32(10):57-59.

HUA Chun,HU Ming.Analysis and simulation to push scheme and pull scheme[J].Optical Communication Technology,2008,32(10):57-59.

[3] SMILJANIC A.Rate and Delay Guarantees Provided by Clos Packet Switches With Load Balancing[J] .IEEE/ACM Transactions on NetWorking,2008,16(1):170-181.

[4] Thompson T.The Android Mobile Phone Platform[J].The World of Software Development,2008,33(9):40-47.

[5] 张长学,张 伟,董智明.移动推送技术面面观[J].移动通信,2011,35(5):21-27.

ZHANG Chang-xue,ZHANG Wei,DONG Zhi-ming. Aspects of mobile Push Technology[J].Mobile Communications,2011,35(5):21-27.

[6] 梁 鹏,欧阳秀平,董 越,等.PUSH技术在WAP2.0中的应用[J].电信网技术,2003(12):56-60.

LIANG Peng,OU YangXiu-ping,DONG Yue,etal. Push Technology In the Application of WAP2.0[J].Telecommunication NetWork Technology,2003(12):56-60.

[7] 张思全,张占松.WAP2.0 PUSH技术在无线网络中的应用[J].电子质量,2003(1):124-127.

ZHANG Si-quan,ZHANG Zhan-song.Wap2.0 And Push Application In Wireless NetWork[J].Electronics Quality,2003(1):124-127.

[8] 周 虹,张 蓓,姜爱蓉,等.馆藏书目信息自助短信推送服务的设计与实现[J].现代图书情报技术,2011(7-8):127-131.

ZHOU Hong,ZHANG Bei,JIANG Ai-rong,et al.Design and Implementation of Library Bibliography Information Self SMS Push Service[J].New Technology of Library and Information Service ,2011,(7-8):127-131.

[9] 余 勇.基于ASP.NET及COMET技术的WEB即时通信系统的设计与实现[J].电脑与电信,2010(9):36-40.

YU Yong.Design and Practice of the Web Instant Messaging System Based on ASP.NET and Comet Technology[J].Computer &Telecommunication,2010(9):36-40.

[10] 戚永军,翟智平,耿娟平.基于Comment的Web即时通讯系统设计与实现[J].计算机科学,2012,39(10):72-75.

QI Yong-jun, ZHAIZhi-ping,GENG Juan-ping. Design and Implementation on Web Instant Messaging System Based on Comet[J].Computer Science.2012,39(10:72-75.

[11]Google.AndroidCloudtoDeviceMessagingFramework[EM/OL].[2012-04-09].https://developers.google.com/android/C2DM.

[12] Android 推送方案探讨[EM/OL].http://wenku.baidu.com/view/ea7e06d17f1922791688e86b.html.

[13] 张 京,刘甫迎.基于 Android云计算消息框架(C2DM)的FoxNews_MID手持移动系统的研究[J].计算机科学,2011,38(10A):461-463.

ZHANG Jing,LIU Fu-ying.Study and Implementation of FoxNews-MID Based on Android C2DMK[J].Computer Science,2011,38(10A):461-463.

[14] 刘甫迎,刘 焱.Android移动编程实用教程[M].北京:电子工业出版社,2011.

[15] Android广播事件处理闹钟实例[EM/OL].http://wenku.baidu.com/view/3c2f7f916bec0975f465e277.html.

[16] 深入学习 android 之 AlarmManager.[EM/OL].http://jinguo.iteye.com/blog/799778.

Research and Implementation of Message Push Based on Android

NI Hong-jun
(School of Information Engineering,Taizhou College,Nanjing Normal University,Taizhou 225300,China)

When the terminal for Android Gets Push messages and has data synchronization with the server,it leads to high costs of electricity,consumption flow and high cost of push .To resolve these problems,this paper analyzes four kinds of technology of the traditional Pull and Push,i.e.,in the way of simple polling,SMS services,persistent connections and long polling.,and Rresearch on Android platform currently used in the scheme of C2DM,MQTT,and XMPP.It is fFound that at the concrete implementation down has bad compatibility and high cost of hardware,and performance is not stable,etc.The paper Ddiscusses a scheme of real-time message push for by using AlarmManager mechanism to maintain TCP long connection between the terminal and the server maintenance TCP long connection.Finally,combining JPush platform to design a alert system of campus is designed to composed theof Sserver and the Android Clientclients.

message push;long connection;AlarmManager;Android

TN 929.53

A

1006-7167(2014)05-0096-05

2013-08-12

Google中国大学合作部2012年Android创新(开发)重点资助项目(SOW12-11/64005799)

倪红军(1975-),男,江苏靖江人,硕士,讲师,主要研究方向为管理信息系统,Android应用开发。

Tel.:13901433220;E-mail:tznkf@163.com

猜你喜欢

轮询服务器端应用程序
Linux环境下基于Socket的数据传输软件设计
删除Win10中自带的应用程序
基于等概率的ASON业务授权设计∗
谷歌禁止加密货币应用程序
浅析异步通信层的架构在ASP.NET 程序中的应用
基于Qt的安全即时通讯软件服务器端设计
依托站点状态的两级轮询控制系统时延特性分析
利用时间轮询方式操作DDR3实现多模式下数据重排
网页防篡改中分布式文件同步复制系统
数据链轮询多网优化设计方法研究*