anroidnpn 推送总结

自己写了一个应用,想着推送是这个应用的核心之一   花了三天的时间好好研究了androidpn

http://xiaodao.co

这篇博客中记录了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外,别的字段基本没有用到


客户端实现了服务器重启后自动重连的功能和消息回执功能

服务器端实现了离线消息推送功能,客户端上线后会接收到服务器发来的离线消息


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值