自己写了一个应用,想着推送是这个应用的核心之一 花了三天的时间好好研究了androidpn
这篇博客中记录了androidpn的详细配置,服务器端按照这篇博客配置好后,只需修改 resources/jdbc.properties 中的数据的用户名和密码
(ps:mysql中的数据库需要自己建,库中的表不需要自己建,程序会自动建)
客户端androidpn-client 只要修改res/raw/androidpn.properties中的服务器地址
把服务器运行起来后,http://localhost:8080/Androidpn/ 如果页面正常,说明服务器已经运行起来了
此时运行客户端,客户端运行起来后,在http://localhost:8080/Androidpn/session.do中可以看到用户已经连接
上服务器了。
客户端:
// Start the service
ServiceManager serviceManager = new ServiceManager(this));
serviceManager.setNotificationIcon(R.drawable.icon);
serviceManager.startService();
客户端通过上面三句来启动后台service
在ServiceManager的构造函数中读取配置文件中的信息即resources/res/raw/androidpn.properties
初始化。
serviceManager.startService();
运行起来NotificationService这个服务类 在这个服务类中注册了消息监听和连接监听
这个类中定义了
private XmppManager xmppManager;
XmppManager是最重要的类
这个类中又定义了三个内部线程类
ConnectTask、RegisterTask、LoginTask
private void submitLoginTask() {
Log.d(LOGTAG, "submitLoginTask()...");
submitRegisterTask();
addTask(new LoginTask());
}
XmppManager类中通过submitLoginTask登陆服务器
在该函数中又调用了submitRegisterTask();使客户端首先在服务器端进行注册
private void submitRegisterTask() {
Log.d(LOGTAG, "submitRegisterTask()...");
submitConnectTask();
addTask(new RegisterTask());
}
在提交注册函数submitRegisterTask中又调用了连接服务器的函数
private void submitConnectTask() {
Log.d(LOGTAG, "submitConnectTask()...");
addTask(new ConnectTask());
}
所以客户端是这样运行的,首先客户端启一个线程进行对服务器进行连接,连接成功之后,
又启一个线程进行注册,注册成功以后又启动一个线程进行登录。
//判断是否连接上服务器
private boolean isConnected() {
return connection != null && connection.isConnected();
}
//是否已经通过服务器的验证
private boolean isAuthenticated() {
return connection != null && connection.isConnected()
&& connection.isAuthenticated();
}
//是否已经在服务器中注册
private boolean isRegistered() {
return sharedPrefs.contains(Constants.XMPP_USERNAME)
&& sharedPrefs.contains(Constants.XMPP_PASSWORD);
}
判断是否注册是通过判断SharePrefs中是否设置了Constants.XMPP_USERNAME 和Constants.XMPP_PASSWORD
所以如果想跳过注册这步可以在这步之前该键值
NotificationPacketListener,NotificationReceiver类接收服务器端发来的消息,并把消息传递给
Notifier的notify(..)函数发出消息通知,并由NotificationDetailsActivity.class显示
服务器端:
推送消息的是由 src/org/androidpn/server/console/controller/NotificationController.java中的send函数实现的
客户端向服务器发来的消息,服务器是由src/org/androidpn/server/xmpp/net/XmppIoHandler.java 中的messageReceived函数首先接收到并进行分发处理的
客户端登陆服务器进行验证 最终是由src/org/androidpn/server/xmpp/handler/IQAuthHandler.java 中的handleIQ函数进行处理的,客户端发来的密码是通过加密的,
服务器端根据客户端的用户名到数据库中取到对应用户的密码,并根据同样的规则进行加密和客户端加密后的密码进行比对
客户端注册服务器 最终是由/src/org/androidpn/server/xmpp/handler/IQRegisterHandler.java 中的handleIQ函数进行处理的。
客户端除了用到apn_user表username和password外,别的字段基本没有用到
客户端实现了服务器重启后自动重连的功能和消息回执功能
服务器端实现了离线消息推送功能,客户端上线后会接收到服务器发来的离线消息