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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安卓推送方案及比较 经常有朋友困扰于Android上面实现推送的技术,希望知道各种方案的优缺点、性能、开发难度等,于是特意写了这篇文章。 方案一: Google官方的服务: 但,通过对比研究发现C2DM机制存在以下缺点: 1)GCM要求Android系统必须是2.2以上的版本,所以对于不少2.2以前的系统没法推送 2)国内服务不稳定。而且不少国内的终端厂商纷纷把Google的服务去掉,替换上自己的。 3)需要用户绑定Google账号,但不少国内用户没有Google账号。 方案二: 利用MQTT协议,broker做代理服务器,但是随着用户的增多这个方案会有问题,因为broker的连接数有上限,到了一定程度后就无法连接了,这也就导致消息很难发送出去。 总之,连接数量有限制。 方案三: 基于XMPP协议,很多人都建议使用这个,谷歌官方的C2DM也是基于XMPP研发的,使用这个方案不会依赖android系统,也不依赖于谷歌服务器。 •XMPP协议比较费电费流量,对当前智能机的消耗太大 •在窄带网络和不稳定的(手机)网络都不是最优的选择。 方案四: 最近新出的一种是APNS,这个也不需要自己架设服务器(可以查看http://www.push-notification.mobi/),很简单,自己不用开发服务端。不过很少有人去用,不是很稳定 主要有以下特点: •快速集成:提供一种比C2DM更加快捷的使用方式,避免各种限制. •无需架设服务器:通过使用"云服务",减少额外服务器负担. •可以同时推送消息到网站页面,android 手机 •耗电少,占用流量少. 第三方服务: 目前也有不少第三方提供了推送服务,由于接入简单、服务比较专业可靠、还提供报表等,不少国内开发者和企业都采用这种方案。比如国外的parse、pubnub,国内的个推,都是这类。36kr前段时间有报道,新浪微博就是用的一家叫“个推”的第三方服务(有兴趣的朋友可以前往查看 http://www.igetuicom) 特点: •方便,易集成 •没有C2DM中的版本限制和必须用gmail绑定 •云服务,不用架设自己的服务器 •系统稳定、专业,能够承受高并发支持 •简单高效,并且省电

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值