转 Andriod实现推送的解决方案

上实现消息推送的一般解决策略
第一种解决方案:C2DM云端推送功能
在手机平台上 , 提供了C2DM()服务 , 该服务提供了一个简单的、轻量级的机制 , 允许服务器可以通知移动应用程序直接与服务器进行通信 , 以便于从服务器获取应用程序更新和用户数据 。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息 。关于C2DM具体使用过程 , 大家可以去查阅相关的资料 , 在这里先让我们了解下大致方案情况 。
下面是C2DM操作过程示例图:
但是经过一番研究发现 , 这个服务存在很大的问题:
1)C2DM内置于的2.2系统上 , 无法兼容老的1.6到2.1系统;
2)C2DM需要依赖于官方提供的C2DM服务器 , 由于国内的网络环境 , 这个服务经常不可用 , 如果想要很好的使用 , 我们的App 必须也在国外 , 这个恐怕不是每个开发者都能够实现的;
3)不像在中 , 他们把硬件系统集成在一块了 。所以对于我们开发者来说 , 如果要在我们的应用程序中使用C2DM的推送功能 , 因为对于不同的这种硬件厂商平台 , 比如摩托罗拉、华为、中兴做一个手机 , 他们可能会把的这种服务去掉 , 尤其像在国内就很多这种 , 把这种原生的服务去掉 。买了一些像什么山寨机或者是华为这种国产机 , 可能的服务就没有了 。而像在国外出的那些可能会内置 。
有了上述几个方面的制约 , 导致我最终放弃了这个方案 , 不过我想利用另外一篇文章来详细的介绍C2DM的框架以及客户端和App 的相应设置方法 , 可以作为学习资源让我们有个参考的资料 。即然C2DM无法满足我们的要求 , 那么我们就需要自己来实现手机客户端与App 之间的通信协议 , 保证在App 想向指定的设备发送消息时 , 设备能够及时的收到 。
第二种解决方案:MQTT协议实现推送功能
第三种解决方案:RSMB实现推送功能
第四种解决方案:XMPP协议实现推送功能
事实上官方的C2DM服务器底层也是采用XMPP协议进行的封装 。
极光推送的解决策略
提出问题:这种功能必须涉及(客户端)和(服务器) , 所以到底如何和实现实时连接通讯?分析问题:这种功能实际上就是数据同步 , 同时要考虑手机本身、电量、网络流量等等限制因素 , 所以通常在移动端上有一下两个解决方案:
1.一种是定时去查询数据 , 通常是使用HTTP协议来访问web服务器 , 称(轮询);
2.还有一种是移动端和服务器建立长连接 , 使用XMPP长连接 , 称Push(推送) 。

转  Andriod实现推送的解决方案

文章插图
从耗费的电量、流量和数据延迟性各方面来说 , Push有明显的优势 。但是使用Push的缺点是:
对于客户端:实现和维护相对成本高 , 在移动无线网络下维护长连接 , 相对有一些技术上的开发难度 。
对于服务器:如何实现多核并发 , cpu作业调度 , 数量庞大的长连接并发维护等技术 , 仍存在开发难点 。
在讲述Push方案的原理前 , 我们先了解一下移动无线网络的特点 。
移动无线网络的特点:
因为 IP v4 的 IP 量有限 , 运营商分配给手机终端的 IP 是运营商内网的 IP , 手机要连接  , 就需要通过运营商的网关做一个网络地址转换( , NAT) 。简单的说运营商的网关需要维护一个外网 IP、端口到内网 IP、端口的对应关系 , 以确保内网的手机可以跟的服务器通讯原理图如下: