这是我希望在项目中采用的方案,因为目前它是开源的,对于其简单的推送功能它还是能够实现的。我们可以修改其源代码来适应我们的应用程序。
事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。关于XMPP协议我在上篇博文中已经介绍,大家可以参考下文章:http://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378956.html
androidpn是一个基于XMPP协议的java开源Android push notification实现,我会在以后的博文中详细介绍androidpn。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。
这是androidpn的项目主页:http://sourceforge.net/projects/androidpn/
androidpn实现意图如下图所示:
下面是推送消息通知的页面,可以给所用的用户推送,也可以给单个的用户推送信息,用户必须是在线的状态才能接受到推送的消息。
下面是客户端的项目分布:
原理就是,android项目启动。启动一个后台的service,这个service中有一个线程池,参加与服务器的交互,在线程池中,添加了判断客户端是否在服务器端注册过,注册过的话,这个客户端能否正确的登陆到服务器端,登陆失败要重新注册的。客户端使用了smack的包,这个包有一个心跳包,负责保持和服务器端的长连接,在smack包的源码中,30s的发送一个空消息给服务器端来保持长连接。