在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近由于项目需要,利用十几天的时间对Android的推送通知服务进行了初步的研究。

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

C2DM操作过程图:

但是经过一番研究发现,这个服务存在很大的问题:

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

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

有了上述两个使用上的制约,导致我最终放弃了这个方案.

下面我来介绍几种常见的方案:

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

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

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

不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。  

安卓开发者如何自己搭建服务器?

androidpn目前它是开源的,对于其简单的推送功能它还是能够实现的。我们可以修改其源代码来适应我们的应用程序。

   事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。

  这是androidpn的项目主页:http://sourceforge.net/projects/androidpn/

  androidpn实现意图如下图所示:

  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协议我们还可以进一步的对协议进行扩展,实现更为完善的功能。 采用这个方案,我们目前只能发送文字消息,不过对于推送来说一般足够了,因为我们不能指望通过推送得到所有的数据,一般情况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知以后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。 XMPP协议书相对来说还是比较简单的,值得我们进一步研究。

  但是在经过一段时间的测试,我发现关于androidpn也存在一些不足之处:

  1. 比如时间过长时,就再也收不到推送的信息了。

  2. 性能上也不够稳定。

   3. 如果将消息从服务器上推送出去,就不再管理了,不管消息是否成功到达客户端手机上。

  等等,总之,androidpn也有很多的缺点。如果我们要使用androidpn,则还需要做大量的工作。

 利用现成的推送平台

最后一种简单的解决方案是使用第三方的推送平台,对于我们开发者来说也比较轻松。

第三方平台有商用的也有免费的,我们可以根据实现情况使用。关于国内的第三方平台,我感觉目前比较不错的就是快推,它是国内仅有的免费富媒体推送平台,有两种推送形式:通知栏和窗口。其他富媒体推送目前都是收费的,对于我这种IT屌丝阶层伤不起。关于详细情况,大家可以查看它的主页,这里不再详细描述:http://www.tiantianfl.net/

快推通知栏显示:你好,张三

快推窗口显示:你好,张三

安卓推送、android文本推送、安卓富媒体推送解决方案相关推荐

  1. 小米杀不死的消息推送-- Android、java后端同时接入小米推送

    作者简介 微信公众号(高质量文章推送):陈博易 前言 小米手机选择小米推送的原因:App进程被杀死的情况下,小米手机上的小米推送服务并不会被杀死(除非用户手动在设置中关闭了该推送的权限),所以我选择给 ...

  2. Android与ios消息推送哪个好,科普下安卓和苹果的推送区别

    看到很多人说苹果推送比安卓好太多,安卓关掉app就没法收到推送消息,作为从业者,来给大家科普下安卓和苹果的推送区别. 首先上苹果推送的整体流程图 简单描述一下,开发者先接入苹果推送服务,有消息需要推送 ...

  3. 安卓开发--关于锁屏状态下如何实现消息推送

    安卓开发–关于锁屏状态下如何实现消息推送 1. 新建一个AlarmHandlerActivity并设置在锁屏状态下弹窗! onCreate方法中添加标志: /* * 分别是锁屏状态下显示,解锁,保持屏 ...

  4. MIUI 10Android 9 内侧,这次大规模推送!小米9基于安卓10的MIUI 10内测版来了

    原标题:这次大规模推送!小米9基于安卓10的MIUI 10内测版来了 相比苹果iPhone的iOS系统总能第一时间更新,安卓系统由于开源手机厂商和机型众多,系统更新一直是一个很大的痛点,尤其是国产手机 ...

  5. 黑莓keyone android8,6月28日推送 黑莓KEYone将升级安卓8.0

    根据CrackBerry报道,黑莓此前承诺过要为旗下的KEYone和Motion两款新机发布安卓8.1系统的更新,但是至今这一更新尚未到来.但近日黑莓的合作商Rogers发布了一则手机系统更新的时间表 ...

  6. android o测试版,一加手机可升级!谷歌已正式推送Android O测试版系统

    原标题:一加手机可升级!谷歌已正式推送Android O测试版系统 科客点评:怎么和iOS比起来,安卓新系统没什么人玩呢? 谷歌6月9日公布了第三个开发者预览版,同时也是用户测试版本的Android ...

  7. android版本10好不好,一加正式推送Android 10系统 流畅性怎么样

    近日,一加正式推送Android 10系统,不知道流畅性如何呢? 一加官方推特正式宣布Android 10系统已进行阶段性推送,从今天开始一加7和一加7 Pro手机用户将会陆续收到氧OS系统的更新,国 ...

  8. 如何实现RTMP推送Android Camera2数据

    Camera2简介 在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2), 之前使用的AP ...

  9. miui android 9q,小米 9 MIUI Android Q Beta 优先体验版正式推送:轻松升级

    7 月 11 日,小米 MIUI 官微宣布,小米 9 MIUI Android Q Beta 优先体验版现已推送!已获得测试资格的小伙伴已经可以升级体验. 换言之已经获得资格的小米 9 用户现在就可以 ...

  10. 一加6点击五下出来Android10,一加6T现已推送Android 10.0公测版更新

    IT之家10月10日消息 据一加社区官方消息,一加6T Android 10.0公测版现已推送,详情如下. ▲图源IT之家网友投稿 [更新日志] 系统更新至Android 10版本 全新的UI设计,轻 ...

最新文章

  1. 简单介绍一下R中的几种统计分布及常用模型
  2. soso街景开发——在移动应用(网站)中的应用
  3. python接管已经打开ie浏览器_Python selenium:使用已经打开并使用登录凭据登录的浏览器...
  4. 带有下标的赋值维度不匹配_KDD 2019|?结构感知的神经网络对人才-组织匹配的影响...
  5. 五大板块(5)——字符串
  6. 视频光端机选型及常见品牌
  7. 程序员们的三高:高并发、高性能、高可用
  8. Android 系统(258)---获取SIM卡手机号
  9. SQL注入攻击和防御
  10. stm32 读取sd卡图片显示_全面测试雷克沙1667x 性能,你懂什么叫超高速SD卡吗
  11. python代理池搭建
  12. BackgroundWorker类的使用例程
  13. 数学建模真题训练——2003B题 CUMCM 露天矿生产的车辆安排(原创)
  14. Ubuntu输入法使用回车键后字符间距异常的问题
  15. T600显卡和GTX1650 哪个好
  16. Nginx静态资源站点——Nginx虚拟主机
  17. 颠覆平庸:在技术上持续精进
  18. Java线程池几个参数的理解
  19. configure : error : no acceptable C compiler found in $PATH 解决办法
  20. 不要这样学习C语言,这是个坑!

热门文章

  1. 医学图像的 有损压缩 以及可接受的 压缩比
  2. char类型和字符串
  3. 百度有啊转型生活平台 启用新标与框计算对接
  4. Sentinel控制台 1.8.0实时监控空白
  5. Linux服务器搭建FTP服务
  6. 2022年最新广东道路运输安全员真题题库及答案
  7. 计算机专业选择加州的哪些大学留学,学计算机科学专业,必选硅谷附近的加州大学!...
  8. [Linux]history命令用法详解
  9. google统计产品
  10. 02_LATTICE入门篇之新建项目