由于手机平台自己、电量、网络流量的限制,移动互联网应用在设计上跟传统 PC 上的应用很大不同,须要根据手机自己的特色,尽可能的节省电量和流量,同时又要尽量的保证数据能及时到达客户端。 服务器
为了解决数据同步的问题,在手机平台上,经常使用的方法有2种。一种是定时去服务器上查询数据,也叫Polling,还有一种手机跟服务器之间维护一个 TCP 长链接,当服务器有数据时,实时推送到客户端,也就是咱们说的 Push。 网络
从耗费的电量、流量和数据送达的及时性来讲,Push 都会有明显的优点,但 Push 的实现和维护成本相对较高。在移动无线网络下维护长链接,相对也有一些技术上的难度。本文试图给你们介绍一下咱们极光推送在 Android 平台上是如何维护长链接。 spa
由于 IP v4 的 IP 量有限,运营商分配给手机终端的 IP 是运营商内网的 IP,手机要链接 Internet,就须要经过运营商的网关作一个网络地址转换(Network Address Translation,NAT)。简单的说运营商的网关须要维护一个外网 IP、端口到内网 IP、端口的对应关系,以确保内网的手机能够跟 Internet 的服务器通信。 设计
图片源自 cisco.com. 图片
NAT 功能由图中的 GGSN 模块实现。 ci
大部分移动无线网络运营商都在链路一段时间没有数据通信时,会淘汰 NAT 表中的对应项,形成链路中断。 get
为了避免让 NAT 表失效,咱们须要定时的发心跳,以刷新 NAT 表项,避免被淘汰。 同步
Android 上定时运行任务经常使用的方法有2种,一种方法用 Timer,另外一种是AlarmManager。 io
Android 的 Timer 类能够用来计划须要循环执行的任务,Timer 的问题是它须要用 WakeLock 让 CPU 保持唤醒状态,这样会大量消耗手机电量,大大减短手机待机时间。这种方式不能知足咱们的需求。 互联网
AlarmManager 是 Android 系统封装的用于管理 RTC 的模块,RTC (Real Time Clock) 是一个独立的硬件时钟,能够在 CPU 休眠时正常运行,在预设的时间到达时,经过中断唤醒 CPU。
这意味着,若是咱们用 AlarmManager 来定时执行任务,CPU 能够正常的休眠,只有在须要运行任务时醒来一段很短的时间。