服务器推送技术,目前应用广泛的大部分都是对xmpp协议的在此封装。 没接触过xmpp?在linux用一些im客户端,默认都会让你添加支持xmpp协议的账户,比如icq、msn等等,另外,不都说qq也是基于xmpp的么,包括android下gmail、gtalk等等也都是基于xmpp协议的。 下面对android下服务器推送技术的一个封装androidpn进行简单的分析,以后还会对xmpp协议的android封装smack进行分析学习。 androidpn也是构建与xmpp协议之上,好在它把服务端与客户端都进行了封装,很容易使用与扩展,提高了很多开发人员的效率,这也是选择它最好的理由。

客户端简易流程

step1:配置客户端 位于工程->res->raw->androidpn.properties文件

apiKey=1234567890 #keyxmppHost=192.168.1.1 #ipxmppPort=5222 #端口

step2:

//创建新的服务ServiceManager serviceManager = new ServiceManager(this);//设置通知栏图标serviceManager.setNotificationIcon(R.drawable.notification);//启动服务serviceManager.startService();

详细分析

初始化ServiceManager:

this.context = context;//这里获取调用者activity得包名类名if (context instanceof Activity) {    Log.i(LOGTAG, "Callback Activity...");    Activity callbackActivity = (Activity) context;    callbackActivityPackageName = callbackActivity.getPackageName();    callbackActivityClassName = callbackActivity.getClass().getName();}//loadProperties()读取raw中androidpn.properties文件的内容,并返回Properties对象props = loadProperties();apiKey = props.getProperty("apiKey", "");xmppHost = props.getProperty("xmppHost", "127.0.0.1");xmppPort = props.getProperty("xmppPort", "5222");//将上面获取的Properties存入SharedPreferences方便以后直接调用sharedPrefs = context.getSharedPreferences(        Constants.SHARED_PREFERENCE_NAME, Context.MODE_PRIVATE);Editor editor = sharedPrefs.edit();.........editor.commit();

启动服务startService()

//用一个线程开启服务Thread serviceThread = new Thread(new Runnable() {    @Override    public void run() {        Intent intent = NotificationService.getIntent();        context.startService(intent);    }});serviceThread.start();

NotificationService类分析,它是Service的子类,着重分析一下这个Service

public NotificationService() {    /*NotificationReceiver为BroadcastReceiver的子类 *用于接收推送广播并用NotificationManager通知用户 *也就是系统通知栏的通知 */    notificationReceiver = new NotificationRece    /*ConnectivityReceiver接收手机网络状态的广播 *来管理xmppManager与服务器的连接与断开 */    connectivityReceiver = new ConnectivityReceiver(this);    /*集成于android.telephony.PhoneStateListener, *同上,用于监听数据链接的状态 */    phoneStateListener = new PhoneStateChangeListener(this);    //线程池    executorService = Executors.newSingleThreadExecutor();    /*TaskSubmitter类包含了向上面的线程池提交一个Task任务 *的方法 */    taskSubmitter = new TaskSubmitter(this);    /*任务计数器 *用以维护当前工作的Task */    taskTracker = new TaskTracker(this);}

一切声明好以后,就开始执行服务了

private void start() {    Log.d(LOGTAG, "start()...");    //注册通知广播接收者    registerNotificationReceiver();    //注册手机网络连接状态接收者    registerConnectivityReceiver();    // Intent intent = getIntent();    // startService(intent);    //开始与服务器进行xmpp长链接    //关于XmppManager后面会有分析    xmppManager.connect();}

XmppManager 管理Xmpp链接:

public XmppManager(NotificationService notificationService) {    context = notificationService;    //获取Task提交管理器,这里用于维护并行任务    taskSubmitter = notificationService.getTaskSubmitter();    //Task的计数器    taskTracker = notificationService.getTaskTracker();    //下面都是获取配置信息    sharedPrefs = notificationService.getSharedPreferences();    xmppHost = sharedPrefs.getString(Constants.XMPP_HOST, "localhost");    xmppPort = sharedPrefs.getInt(Constants.XMPP_PORT, 5222);    username = sharedPrefs.getString(Constants.XMPP_USERNAME, "");    password = sharedPrefs.getString(Constants.XMPP_PASSWORD, "");    /*设置xmpp链接状态的监听器,查看代码发现Xmpp链接状态有5种 * 1 connectionClosed * 2 connectionClosedOnError * 3 reconnectingIn * 4 reconnectionFailed * 5 reconnectionSuccessful */    connectionListener = new PersistentConnectionListener(this);    /* 服务器推送监听器 * 服务器如果有消息推送,NotificationPacketListener会 * 自己解析好,并通过XmppManager发送广播 */    notificationPacketListener = new NotificationPacketListener(this);    //当xmpp因异常重新连接服务器时,这期间发生异常的话,会在这个handler中处理    handler = new Handler();    //任务队列    taskList = new ArrayList<runnable>();    /* 当xmppManager因异常与服务器断开链接时 * ReconnectionThread会在一定的时间内尝试重新连接 * 也就是说,当PersistentConnectionListener监听器监听到异常断开连接 * 会调用ReconnectionThread中重新连接的方法以进行连接尝试 reconnection = new ReconnectionThread(this); } 

androidpn与服务器连接流程

这里涉及很多smack包的操作,下篇会分析android下xmpp协议的封装smack。

Runable 1: ConnectTask 与服务器建立链接

Runable 1.5: RegisterTask 如果没有配置androidpn客户端的账户信息,它会自动生成一个随机账户并注册到服务器

Runalbe 2: LoginTask 读取本地的账户信息,并登录,开始等待服务器推送消息


更多相关文章

  1. Android 拦截TextView中超链接点击事件
  2. android上设置ftp服务器
  3. Android - 服务器json数据交互.
  4. Android多服务器同时打包多个apk
  5. android超链接
  6. android中将静态库链接进动态库成功的例子
  7. Android 客户端选择响应最快的一个服务器
  8. Android开发学习——android与服务器端数据交互

随机推荐

  1. Eclipse 无法查看 Android(安卓)源代码
  2. android eclipse的环境配置
  3. 安卓ADT项目及升级AS(Android(安卓)Studi
  4. Android(安卓)命令窗口中adb常用命令
  5. Android(安卓)2.0 API 读取通讯录中电话
  6. Android(安卓)消息机制问题总结
  7. android入门环境配置
  8. Android(安卓)- Parcelable接口用法 和
  9. APICloud SuperWebView融合Android原生平
  10. Android源码配置默认输入法