Android 推送框架 androidpn
androidpn (Android Push Notication)是一个基于 XMPP 协议的 java 开源
Android push notication 实现。它包含了完整的客户端和服务器端。
项目首页
1、Androidpn
的配置和使用方法
Androidpn 的配置和使用方法:
先下载 android-pn 的服务端和客户端,地址为:http://source...roidpn/les/
解压服务端,在 bin 目录下双击 run.bat 运行。访问:http://127.0....7070/index.do,
你会看到如下页面:
注意的是你的电脑必须配置了 java 的环境变量!!
修改 androidpn.properties 文件中的 xmppHost 为 xmppHost=192.118.18.19(本
机 IP 地址)然后运行项目:
这里已经看到了连接的模拟器了。接下来向客户端发送消息:
然后在客户端收到服务器发送过来的消息:
看到推送消息恭喜你此时配置成功!!
2、如何使用 androidpn 实现 android 手机消息推送(简单的源码分析)
Server 部分的主要包结构如下:
其中 org.androidpn.server.dao,org.androidpn.server.model 和
org.androidpn.server.service 为使用 hibernate 链接数据库并实现简单的用户登录认
证,开发中可以用我们自己的认证模块替换。剩下的包就是推送的主体实现。
接下来逐个包来看:
1.util 包中的类用来加载 resources 中的配置文件,在配置文件中可指定监听端口和 ssl
证书目录等属性。
2.org.androidpn.server.xmpp 包里面定义了一些异常类型,主要是包含有入口类
XmppServer,这个类用来启动和停止 server 程序。
3.org.androidpn.server.xmpp.auth 包里面是认证的一些类,我们自己的认证模块可以
在这里与 androidpn 进行结合。
4.org.androidpn.server.xmpp.codec 是 XMPP 协议的 XML 文件解析包,server 收到
和发送的消息都要通过这个包来进行 xmpp 协议编码和解码。
5.org.androidpn.server.xmpp.handler 包主要是对消息的处理,我们可以针对不同的
消息类型定义自己的 handler,
6.org.androidpn.server.xmpp.net 包负责维护与 client 之间的持久连接,并实现了一
些传输方式供发送 xmpp 消息时使用。
7.org.androidpn.server.xmpp.presence 里面只包含 PresenceManager 类,用来维
护 client 的在线状态。
8.org.androidpn.server.xmpp.push 包里面的 NoticationManager 类包含有向
client 发送消息的接口。
9.org.androidpn.server.xmpp.router 包负责将收到的信息包发送到相应的 handler 进
行处理,是一个路由包。
10.org.androidpn.server.xmpp.session 包定义了用来表示持久链接的 session,每个
session 包含一条连接的状态信息。
11.org.androidpn.server.xmpp.ssl 是对连接进行 ssl 认证的工具包。
server 发送消息的整个流程主要是:
1. NoticationManager 的 push 接口被调用。
2.使用 SessionManager 在当前 session 集合中查找相应的 client 链接。
3.定义自己的 XMPP 消息格式并组装。
4.通过相应 session,向 client 发送消息。
在这个流程中我们需要修改的是步骤 3,也就是需要定义和组装自己的 xmpp 消息,以便
于将适当的信息传到客户端并便于客户端解析。一个简单的消息组装例子如下:
?
0
1
0
2
0
3
0
4
0
5
0
6
0
7
0
8
0
9
1
0
1
1
1
2
1
3
<font style="color:rgb(51,51,51)">private IQ createMessageIQ(String title, String
message, String userId,
String json) {
Element notication = DocumentHelper.createElement(QName.get(
"message", INQURIE_NAMESPACE));
notication.addElement("title").setText(title);
notication.addElement("text").setText(message);
notication.addElement("userId").setText(userId);
notication.addElement("json").setText(json);
IQ iq = new IQ();
iq.setType(IQ.Type.set);
iq.setChildElement(notication);
return iq;
}</font>
要注意的是在创建 element 的时候,传入的 namespace 要和 client 解析使用的
namespace 相匹配。
server 端接收和处理消息的流程是:
1.connection 收到 packet,使用 tsc.push.server.xmpp.codec 解码。
2.router 根据 packet 的 namespace 等信息,将 packet 路由到相应的 handler。
3.handler 进行处理。
相应的 router 和 handler 类在 androidpn 中都有例子可以参考,这里就不贴代码了。开
发中只要根据 client 发送消息的格式,定义自己的 router 和 handler 类,然后在
PacketRouter 中注册 router,在 IQRouter 中注册 handler 即可。
Client 部分的主要包结构如下:
Client 这边包含有消息的收发,解析以及持久连接的发起,重连等功能呢,十分强大,我
们开发时完全不用管底层的连接,也不用担心断线,可以专注于业务部分的开发。
同时,代码结构也很简单。去除 android 的 Service 和 BroadCast 类以及一些工具类和
常量类不谈:
1.NoticationIQ,NoticationIQProvider,NoticationPacketListener 三个类负责对
收到的 Notication 格式的消息进行解析和处理,
2.XmppManager 是主控制器,NoticationService 通过这个类,在后台维护
androidpn 连接。
3.PersistentConnectionListener,PhoneStateChangeListener,ReconnectionTh
read.java 三个类则负责监听手机的状态并进行断线重连。
我们自定义消息时需要定义 3 个类:在***IQ 中定义消息的实体,在***IQProvider 中将
消息转化为***IQ 实体,在***PacketListener 中对实体进行处理,具体的实现可参考
NoticationIQ,NoticationIQProvider,NoticationPacketListener 三个类。在定义
这些类之后,还需要在 XmppManager 中将这 3 个类中注册到 connection 中,代码如
下:
?
01
02
03
04
05
06
07
08
09
10
11
12
13
span style="white-space:pre"> </span>connection.connect();
Log.i(LOGTAG, "XMPP connected successfully");
// packet provider
ProviderManager.getInstance().addIQProvider("message",
Constants.NOTIFICATION_NAMESPACE,
new NoticationIQProvider());
<span style="white-space:pre"> </span>// packet lter
PacketFilter packetFilter = new PacketTypeFilter(
NoticationIQ.class);
// packet listener
PacketListener packetListener = xmppManager
.getNoticationPacketListener();
connection.addPacketListener(packetListener, packetFilter);
需要注意的是,注册***IQProvider 时,传入的 namespace 需要和服务端组装消息时使
用的 namespace 一致,才能正确的收到。
AndroidPn 客户端源码详细
一、Androidpn 开源项目
Androidpn 开源项目托管地址:http://sourceforge.net/projects/androidpn/
Androidpn 开 源 项 目 自 身 描 述 : This is an open source project to provide push
notification support for Android, a xmpp based notification server and a client tool kit.
二、源码分析
在程序的入口 DemoAppActivity 中设置通知的 icon 并开启消息接收服务,代码
如下:
Number:1-1
ServiceManager serviceManager = new ServiceManager(this);
serviceManager.setNotificationIcon(R.drawable.notification);
serviceManager.startService();
在 上 面 的 代 码 中 可 以 看 到 程 序 对 ServiceManager 进 行 了 初 始 化 操 作 , 在
ServiceManager 类的构造函数中我们可以看到程序对传递过来的 context 进行了
判断,如果这个 context 是一个 Activity 实例,紧接着会获取对应的包名和类名。
之后再去加载 res/raw/androidpn.properties 配置文件中的参数信息,并将读取到
的信息和之前从 context 中获取的包名和类名一起存入首选项中。
Number:2-1
public ServiceManager(Context context) {
this.context = context;
if (context instanceof Activity) {
Activity callbackActivity = (Activity) context;
callbackActivityPackageName = callbackActivity.getPackageName();
callbackActivityClassName = callbackActivity.getClass().getName();
}
props = loadProperties();
apiKey = props.getProperty("apiKey", "");
xmppHost = props.getProperty("xmppHost", "127.0.0.1");
xmppPort = props.getProperty("xmppPort", "5222");
sharedPrefs =
context.getSharedPreferences(Constants.SHARED_PREFERENCE_NAME,
Context.MODE_PRIVATE);
Editor editor = sharedPrefs.edit();