转载 这种功能实际上就是数据同步,同时要考虑手机本身、电量、网络流量等等限制因素,所以通常在移动端上有一下两个解决方案:

  1.一种是定时去server查询数据,通常是使用HTTP协议来访问web服务器,称Polling(轮询);
  2.还有一种是移动端和服务器建立长连接,使用XMPP长连接,称Push(推送)。

  从耗费的电量、流量和数据延迟性各方面来说,Push有明显的优势。但是使用Push的缺点是:
  对于客户端:实现和维护相对成本高,在移动无线网络下维护长连接,相对有一些技术上的开发难度。
  对于服务器:如何实现多核并发,cpu作业调度,数量庞大的长连接并发维护等技术,仍存在开发难点。

  在讲述Push方案的原理前,我们先了解一下移动无线网络的特点。
  移动无线网络的特点:
  因为 IP v4 的 IP 量有限,运营商分配给手机终端的 IP 是运营商内网的 IP,手机要连接 Internet,就需要通过运营商的网关做一个网络地址转换(Network Address Translation,NAT)。简单的说运营商的网关需要维护一个外网 IP、端口到内网 IP、端口的对应关系,以确保内网的手机可以跟 Internet 的服务器通讯
  GGSN(Gateway GPRS Support Node 网关GPRS支持结点)模块就实现了NAT功能。
因为大部分移动无线网络运营商都是为了减少网关的NAT映射表的负荷,所以如果发现链路中有一段时间没有数据通讯时,会删除其对应表,造成链路中断。(关于NAT的作用及其原理可以查看我的另一篇博文:关于使用UDP(TCP)跨局域网,NAT穿透的心得)

Push在Android平台上长连接的实现:
既然我们知道我们移动端要和Internet进行通信,必须通过运营商的网关,所以,为了不让NAT映射表失效,我们需要定时向Internet发送数据,因为只是为了不然NAT映射表失效,所以只需发送长度为0的数据即可。

这时候就要用到定时器,在android系统上,定时器通常有一下两种:
1.java.util.Timer
2.android.app.AlarmManager

分析:
Timer:可以按照计划或者时间周期来执行相关的任务。但是Timer需要用WakeLock来让CPU保持唤醒状态,才能保证任务的执行,这样子会消耗大量流量;当CPU处于休眠的时候,就不能唤醒执行任务,所以应用于移动端明显是不合适。

AlarmManager:AlarmManager类是属于android系统封装好来管理RTC模块的管理类。这里就涉及到RTC模块,要更好地了解两者的区别,就要明白两者真正的区别。
RTC(Real- Time Clock)实时闹钟在一个嵌入式系统中,通常采用RTC 
来提供可靠的系统时间,包括时分秒和年月日等;而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768KHz 
晶体和电阻电容等。(如果对这方面感兴趣,可以自己查阅相关资料,这里就说个大概)
好了,回来正题。所以,AlarmManager又称全局定时闹钟。这意味着,当我用使用AlarmManager来定时执行任务,CPU可以正常地休眠,只有在执行任务是,才唤醒CPU,这个过程是很短时间的。
下面简单来说明其使用:
1.类似于Timer功能:
//获得闹钟管理器
AlarmManager 
am = (AlarmManager)getSystemService(ALARM_SERVICE);
//设置任务执行计划
am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 5*1000, 
sender);//从firstTime才开始执行,每隔5秒再执行

2.实现全局定时功能:
//获得闹钟管理器
AlarmManager 
am = (AlarmManager)getSystemService(ALARM_SERVICE);
//设置任务执行计划
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 
5*1000, sender);//从firstTime才开始执行,每隔5秒再执行

总结:在android客户端使用Push推送时,应该使用AlarmManager来实现心跳功能,使其真正实现长连接。

最新文章

  1. paramiko模块的安装
  2. Unix 初步(一)
  3. 非在线方式搭建Android开发环境
  4. Windows Server 2012 R2 设置 smtp 服务器
  5. delphi中通过CreateOleObject操控Word
  6. 1.tomcat部署项目的几种方式和weblogic部署方式及一点通讯
  7. 高级UIKit-10(UDPSocket)
  8. linux虚拟文件系统2
  9. .NET入行之工作后
  10. (4.1)Spring MVC执行原理和基于Java的配置过程
  11. java语法基础(总结)
  12. Git 几个常用操作
  13. form表单内容JSON格式转化
  14. Fiddler中显示IP方法
  15. Spring Boot 2(一):Spring Boot 2.0新特性
  16. weblogic stage更改不马上生效
  17. jsencrypt加密
  18. Oracle rdbms Brush password
  19. Matlab绘图——对称曲线绘制(转)
  20. 创建Maven项目后,发现目录里面只有src/main/resources

热门文章

  1. NOIP 2013 积木大赛
  2. query 2019徐州网络赛(树状数组)
  3. django跨域问题解决
  4. django ORM CRUD
  5. 洛谷 p1516 青蛙的约会 题解
  6. spark基础知识二
  7. nodejs网络编程
  8. PostgreSQL中的Toast Pointer
  9. 关于Linux TCP "SACK PANIC" 远程拒绝服务漏洞的修复
  10. CSS3rem自适应