Android开发之推送

工信部将统一安卓推送标准
推送,目前几乎是APP的标配了。我们来看看推送这件事。

推送的实现方案

总结一下几种推送实现方式(历史解决方案),目前已经被废弃掉了,了解一下还是有必要的。

1.轮询

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

优点:实现简单
实现:用Timer和TimerTask定时器,以及HTTP相关的几个类就可以实现基本的功能,然后自己解析服务器返回信息。

2.SMS短信

在Android平台上,可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案的好处是,可以实现实时操作。但是问题是这个方案的成本相对比较高,很难找到免费的短消息发送网关。

优点:实现简单,实时性也好。
缺点:SMS服务的成本问题。

3.TCP/IP持久的长连接

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

优点:实时性好。
缺点:实现起来比较困难。比较费电。

总结:
Android操作系统允许在低内存情况下杀死系统服务,所以我们的推送通知服务很有可能就被操作系统Kill掉了。轮询方式和SMS方式这两个方案也存在明显的不足。至于持久连接方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMail,GTalk ,GoogleVoice以及我们熟悉的微信,QQ都可以实现实时更新的。

具体实现长连接解决方案

C2DM,GCM

Google提供了C2DM(Cloudto Device Messaging)服务(基于XMPP),GCM(Google Cloud Messaging)作为 Google 官方的推送支持的

优点:谷歌提供的
缺点:C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这两个个服务经常不可用,如果想要很好的使用,我们的app服务器必须也在国外。并且需要手机安装了Google Service ,条件比较苛刻。可能不是每个开发者或公司能实现的。

MQTT协议实现Android推送功能

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

客户端地址
https://github.com/tokudu/AndroidPushNotificationsDemo
服务器端地址
https://github.com/tokudu/PhpMQTTClient
wmqtt.jar
http://www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006

RSMB实现推送功能

Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。

Xmpp(可扩展通讯和表示协议)

简介:XMPP(Extensible Messaging and Presence Protocol)
百度文库介绍:http://wenku.baidu.com/view/563b1ebff121dd36a32d8225.html

xmpp协议起源于著名的Linux即时通讯服务服务器 jabber, 有时候我们会把xmpp协议也叫jabber协议,其实这是不规范的,xmpp是个协议,而jabber是个服务器,因为jabber开源,设计精良,安全,稳定,跨语言,跨平台,封装开发简便,越来越多人开始使用它,并且逐步完善,不久它便形成了一个强大的标准化体系,Google GTalk、Pidgin、PSI、Spark、Pandion、MSN、Yahoo、ICQ、QQ、WhatsApp Wechat..诸如此类一些软件在这个强大的标准体系下实现了互联。

那么XMPP到底是什么意思,用通俗的话讲它和基于xml格式的一些协议原理差不多,只不过是个针对服务器的软件协议罢了。

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

XMPP(Extensible Messaging and Presence Protocol),简单的来讲,它就是一个发送接收处理消息的协议,但是这个协议发送的消息,既不是二进制的东东也不是字符串,而是XML。正是因为使用了XML作为消息传递的中介,XMPP目前被IETF国际标准组织完成了标准化工作。

其中Gtalk 就是基于XMPP 协议的一个实现,其他的则不是。当前IM几乎作为每个上网者必然使用的工具,在国外的大型企业中有一些企业级的IM应用,但是其商业价值还没完全发挥出来。

设想既然XMPP协议是一个公开的协议,那么每个企业都可以利用它来开发适合本身企业工作,提高自身生产效率的IM;甚至,你还可以在网络游戏中集成这种通信软件,不但让你可以边游戏边聊天,也可以开发出适合游戏本身的IM应用,比如说一些游戏关键场景提醒功能,团队语音交流等等都可以基于IM来实现。

基于XMPP的几个案例

Openfire - Java XMPP服务器

Openfire是开源的实时协作服务器(RTC),它是基于公开协议XMPP(也成为Jabber)消息的。Openfire的核心功能可以概括为:连接管理、消息解析、消息路由、消息发送

Openfire(服务器端)
Openfire是一个即时通讯服务器,也称之为即时通讯平台。它是基于XMPP协议的,大家所熟悉的通讯软件QQ、MSN和Gtalk等等,其中Gtalk就是基于XMPP协议的实现。

下载地址:
http://www.igniterealtime.org/downloads/index.jsp

注意: 使用Openfire需要配置机器的域名。如果局域网内没有安装域服务器,则需要手工为机器配置域名,Windows平台打开C:\WINDOWS\system32\drivers\etc\hosts文件,增加一新行:127.0.0.1 www.rair.com (根据自己的需要可配置称别的名字,但最好符合带.的域名格式)

Spark(客户端) XMPP,自带有Android组件的处理

Spark从本质上来说就是一个运行在PC上的java程序,你可以看成是官方为我们实现好的运行在PC上的客户端,我们只需要下载使用即可

下载地址:
http://www.igniterealtime.org/downloads/index.jsp

ASmack( jar )

一套封装好了的用于实现XMPP协议传输的API,它是一个非常简单并且功能强大的类库,给用户发送消息只需要三行代码

下载地址:
http://www.igniterealtime.org/downloads/index.jsp
http://code.google.com/p/asmack/downloads/list (需科学上网)

常用API

XMPPConnection(xmpp连接核心类)
ConnectionConfiguration(连接配置类)
AccountManager(注册用户管理类)
XmppConnectionListener(连接监听类)
ChatManagerListener(聊天事监听事件)
MultiUserChat(多用户聊天)
MessageListener(消息监听事件)

androidpn

(Android Push Notification)是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。

服务器端实现原理
connection收到packet,使用tsc.push.server.xmpp.codec解码。router根据packet的namespace等信息,将packet路由到相应的handler,handler进行处理PersistentConnectionListener,PhoneStateChangeListener,ReconnectionThread。java三个类则负责监听手机的状态并进行断线重连

客服端实现原理
NotificationIQ,NotificationIQProvider,NotificationPacketListener三个类负责对收到的Notification格式的消息进行解析和处理。XmppManager是主控制器,NotificationService通过这个类,在后台维护androidpn连接。

开发者

作为我们开发者,我们主要还是用到第三方平台。

推送:
极光推送(部分免费)
友盟推送(免费)
百度推聊(免费)
个推推送(部分免费) - 新浪微博

即时通讯:
环信即时通讯
融云即时通讯
极光推送

第三方平台的配置和使用参照官方文档就妥妥的了。
n(≧▽≦)n

由泰尔实验室牵头的安卓统一推送研讨会正在进行中,我们一起关注安卓推送生态的变化吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1.基于HTTP协议的推送机制 基于HTTP协议的推送机制是一种请求-响应模式,由于HTTP协议是应用层的单工通信...
    雅然风懿阅读 3,957评论 1 5
  • 互联网推送服务原理:长连接+心跳机制(MQTT协议)Android推送技术研究Android实现推送方式解决方案a...
    合肥黑阅读 2,990评论 0 12
  • 关于XMPP最权威的讲解:http://www.jabbercn.org/RFC3920(这个才是最权威的,下面文...
    随风飘荡的小逗逼阅读 1,461评论 1 5
  • Android消息推送机制研究1.基于HTTP协议的推送机制基于HTTP协议的推送机制是一种请求-响应模式,由于H...
    GB_speak阅读 677评论 0 2
  • 这周总共写了7篇文章 周一,《如何做一个好父亲》,如果我问你这个问题,我不知道你的答案是什么?是提供孩子各种教育环...
    忠良162阅读 353评论 2 4