`
wen742538485
  • 浏览: 237672 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android推送方式比较

阅读更多
转载自 http://blog.csdn.net/xyz_lmn/article/details/6945412
当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,比如《地震及时通》就需要及时获取服务器上最新的地震信息。要获取服务器上不定时更新的信息一般来说有两种方法,第一种是客户端使用Pull(拉)的方式,隔一段时间就去服务器上获取信息,看是否有更新的信息出现。第二种就是服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。
  虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push is better than pull。因为Pull方式更费客户端的网络流量,更主要的是费电量。
  在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。

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

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

1)C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统;

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

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

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

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

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

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

  前两个方案存在明显的不足,第三个方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMail,GTalk以及GoogleVoice都可以实现实时更新的。

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

wmqtt.jar 是IBM提供的MQTT协议的实现。你可以从如下站点下载它。你可以将该jar包加入你自己的Android应用程序中。

Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。

采用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请求。服务器架构如下:

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

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

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

相关推荐

    Android实现推送方式解决方案系列教程

    在探讨Android实现推送方式解决方案的过程中,我们聚焦于XMPP协议这一关键知识点,深入解析其在Android推送机制中的应用。XMPP(Extensible Messaging and Presence Protocol)作为一种基于XML的即时通讯协议,不仅...

    Android推送源码

    本知识点将深入探讨"Android推送源码",包括其工作原理、实现机制以及如何通过JPush Android SDK进行集成。 一、推送服务概述 推送服务是移动应用与用户保持联系的一种手段,它允许服务器端直接向客户端发送消息,...

    android推送解决方案

    1. 推送方式基础知识 推送功能最早是被用于 Email 中,用来提示我们新的信息。随着时代的发展和移动互联网的热潮,推送功能更加地普及,已经不再仅仅用在推送邮件了,更多地用在我们的 APP 中了。在移动互联网时代...

    android视频推送

    4. **Android推送实现**: - 使用开源库如libstreaming或SPydroid,它们提供了实现RTSP推流所需的组件和接口。 - 开发者需要配置推流参数,如服务器地址、端口、视频编码格式、分辨率等。 - 实现RTSP推送的关键...

    信鸽推送Android端(Android信鸽推送demo)

    XinGeDemo是信鸽提供的Android推送示例代码,其中包含了完整的集成和使用流程。通过阅读和运行这个示例,你可以快速了解如何在自己的应用中实现信鸽推送功能。主要文件可能包括MainActivity.java(用于展示推送消息...

    Android 消息推送源码

    在Android应用开发中,消息推送是一项关键功能,它能让用户即使在不打开应用的情况下也能收到新消息的通知。这里我们关注的焦点是“Android消息推送源码”,这通常涉及到后台服务、通知栏通知以及Intent的使用等方面...

    Android 极光推送别名与标签方式

    Android 极光推送 别名、标签、RegistrationID 说明 别名(alias) 为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。每个用户只能指定一个别名。 建议:对于同一个应用...

    Android 推送代码整合

    Android推送主要分为以下几种方式: 1. **云消息推送(如Firebase Cloud Messaging, FCM)**: 谷歌提供的官方推送服务。 2. **第三方推送服务(如个推等)**: 第三方服务商提供的推送解决方案。 3. **自建服务器推...

    android 极光推送

    在Android开发中,极光推送(JPush)是一款广泛使用的第三方推送服务,它为企业和开发者提供了稳定、高效、精准的即时消息推送能力。通过集成极光推送,开发者可以实现向多个用户或者特定用户发送消息,增强应用的...

    Android推送 利用REST API实现从客户端推送(百度云推送)

    本文将深入探讨如何利用REST API实现从客户端进行Android推送,特别关注百度云推送这一服务。首先,我们需要了解REST(Representational State Transfer)架构风格,它是一种通过HTTP协议进行数据交互的方式,简洁且...

    android消息推送

    在Android平台上,消息推送是...理解并熟练掌握消息推送的原理、实现方式以及优化策略,是Android开发者必备的技能之一。通过研究“YiIM_V4-master”这样的开源项目,开发者可以深入学习如何在实际项目中实现这一功能。

    Android推送方案.ppt

    Android推送方案.ppt

    android 本地推送

    在Android系统中,本地推送(Local Push)是一种应用程序在不依赖远程服务器的情况下,实现消息推送的技术。它允许应用在特定时间或满足特定条件时向用户显示通知,无需持续连接到互联网,因此对于节省数据流量和...

    Android-Push一个推送的模块集成了华为小米和极光推送

    在Android应用开发中,推送服务是必不可少的一部分,它能让应用在后台时也能向用户发送通知,提高用户活跃度。本文将详细介绍如何集成华为、小米和极光这三家主流的推送服务到Android应用中,以及涉及的相关知识点。...

    RabbitMQ实现Android消息推送.zip

    基于SpringBoot、RabbitMQ的Android消息推送平台...有的公司对所要推送的消息保密要求比较高,不希望被第三方看到,可以使用此种方式进行消息推送。如果所要推送的人群比较多,可以搭建RabbitMQ集群解决高并发问题。

    Android推送Activity跳转控制处理

    本文将深入探讨Android推送Activity跳转的控制处理,包括消息接收、解析、用户交互以及不同场景下的跳转策略。 首先,我们需要了解Android的推送服务。常见的推送服务有Google的Firebase Cloud Messaging (FCM) 和...

    Android推送通知指南

    在Android应用开发中,推送通知是与用户交互的重要手段,尤其对于即时通讯(IM)应用来说更是不可或缺。然而,Android平台的推送通知实现并不像iOS那样简单,因为它依赖于Google的Cloud to Device Messaging (C2DM)...

    android推送开源框架

    AndroidPN,全称为Android Push Notification,是一个专门为Android平台设计的开源推送框架。它允许开发者轻松地在应用程序中集成远程推送通知服务,以便实时地向用户发送消息,无需应用程序处于前台运行状态。...

    Android:最全面解析Android消息推送解决方案.docx

    Android 消息推送解决方案 在 Android 开发中,消息推送是非常常见的应用场景,如电商的活动宣传、资讯类产品进行新闻推送等等。今天,我们将全面介绍 Android 中实现消息推送的 7 种主流解决方案。 一、前言 ...

    android 推送demo

    下面我们将详细探讨Android推送服务的基本概念、工作原理以及如何在实践中应用。 **Android推送服务概述** Android推送服务允许应用在后台接收服务器发送的消息,即使应用没有运行,用户也能够收到通知。常见的...

Global site tag (gtag.js) - Google Analytics