Android中的消息推送

时间: 2023-07-11 admin 互联网

Android中的消息推送

Android中的消息推送

转载于Android中的消息推送

         前段时间做了一个应用,需要用到服务器端向Android或者是Iphone终端主动发送命令。随后客户端做出相应的反应。当时没有找到最佳的方案,一直搁置着。今天看到网上有关于Android推送的介绍,先学习一下,以便以后用到了不至于不知道。

什么是推送呢?  

  所谓的消息推送就是从服务器端向移动终端发送连接,传输一定的信息。举个例子,大家有用过百度新闻客户端的应该知道,我们会每隔一段时间收到一条或者多条通知,这就是从百度新闻服务器端传来的推送消息。

Google Android中内置的推送框架

  说道消息推送,不得不提起google的android系统中自带的推送框架,就是C2DM。全称就是Cloud to Device Messaging。从字面可以看出来就是向终端发送消息用的。但是这种机制在Android2.2以及以后的Android版本系统中才有,而且必须依赖Google服务器。由于这两个致命的约束,很少中国人会使用C2DM。但是其原理还是值得研究的。

消息推送的替代方案

  既然Google这么不靠谱,那么要想实现消息的推送就得我们自己想办法寻找替代方案了。参考网上资料找到了以下方案

  1). 通过SMS进行服务器端和客户端的交流通信。

  这种方法依赖于运营商,资费明显成本过高,不到万不得已绝不用这种方案。

  2). 循环主动定时获取

  这种方法需要客户端来做一个定时或者周期性的访问服务器端接口,以获得最新的消息。显然这种方法有两个弊端,一个是客户端对电池的消耗显而易见,另一个是消息的获取不够及时,如果是地震消息(大家笑了吧)。

  3).长连接方式

  这种方案和Google的C2DM的方案是一样的,同时大名鼎鼎的苹果用的也是这样的机制。这种机制的弊端也是显而易见的:我们需要开一个服务来保持和服务器端的持久连接。But ANdroid系统的特点我也不说了。当系统可用资源较低,系统会强制关闭我们的服务或者是应用,这样的话我们的连接中断就悲剧了。

最佳方案

  虽然三条方案都有弊端,相比之下第三种还是最可行的,But我们必须做点优化。那么下面我们就来谈谈两种牛X的协议--MQTT&XMPP。

  MQTT不说了,可以上网搜搜。看到XMPP立刻想到了XML对吧。其实XMPP中文叫可扩展通讯和表示协议。百度百科是这样介绍的

  【MPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程 序。而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。】

  补充: XMPP传输的是与即时通讯相关的指令。在以前这些命令要么用2进制的形式发送(比如QQ),要么用纯文本指令加空格加参数加换行苻的方式发送(比如MSN)。而XMPP传输的即时通讯指令的逻辑与以往相仿,只是协议的形式变成了XML格式的纯文本。这不但使得解析容易了,人也容易阅读了,方便了开发和查错。而XMPP的核心部分就是一个在网络上分片断发送XML的流协议。这个流协议是XMPP的即时通讯指令的传递基础,也是一个非常重要的可以被进一步利用的网络基础协议。所以可以说,XMPP用TCP传的是XML流。

基于XMPP的开源框架

  说到这里估计大家都想问,有没有现成的可用的基于XMPP的开源框架。答案是有的,而且很简单,很容易上手使用--AndroidPN

  源码中这样介绍的

  This is an open source project to provide push notification support for Android -- a xmpp based notification server and a client tool kit.

  那么我们就来看看怎么吧这个环境搭建起来吧

  首先我们需要下载客户端和服务器端代码

  我们说过这是一个开源的框架,地址在/ 

  将服务器端代码解压,在bin目录下的run.bat打开就行了我们就可以看到启动了Tomcat容器,这样我们的服务器端就搭建好了,简单吧。

  将客户端代码解压,你会发现是一个android工程文件。那么直接导入Eclipse,打开raw下的配置文件androidpn

  将androidpn.properties,修改如下

  apiKey=1234567890

  xmppHost=10.0.2.2

  xmppPort=5222

  如果你是模拟器就设置如上,若是手机就改一下xmppHost为具体的服务器地址IP。

推送消息到客户端

  当客户端跑起来我们的Client端程序后,我们可以打开服务器端

点击Notifacations标签,就可以发通知给指定客户端或者所有客户端了