`
Jonathan樊
  • 浏览: 77342 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

Android信息推送—AndroidPN的学习(上)

阅读更多

         就最近的形势来看,似乎是不差的。变革即意味着机遇,确实如此。我觉得我似乎在朝着自己的计划慢慢靠近。我想很快就会有确切的答案吧。我静静地等着。

         

        最近两天一直在研究Android 信息推送的事情。学习了AndroidPN这个框架,虽然最后不会用这个,项目还是要自己搭,但终究有值得借鉴的地方,特此把学习的内容总结在这里。

 

        AndroidPN(Android Push Notification)是韩国人思密达共享的一个简单的框架,基于XMPP协议,实现了信息推送服务。

        一:安装测试运行

        1,下载客户端和服务器端程序。http://sourceforge.net/projects/androidpn/files/  程序10年11月上传后就没有再更改过,可能已经被原分享者放弃了思密达。

        2,打开客户端程序下的raw/androidpn.properties文件,配置客户端信息,将xmppHost配置成10.0.2.2,xmppPort=5222,5222 是服务器的xmpp服务监听端口。

        3,运行androidpn-server-0.5.0\bin\run.bat启动服务器,从浏览器访问http://127.0.0.1:7070/

在模拟器中运行客户端。

        4,从Web端向客户端发消息。

        效果如下:



       

        友情提示:

        1,如果出现运行run.bat一闪而过,无法访问http://127.0.0.1:7070/的情况,请配置好Java环境变量。

        2,客户端运行后后提示“Application unfortunately Stopped”,有可能是引用的asmack.jar包的问题,重新引用,然后Clean,重新Build Project。祝大家好运。


         二:源代码学习

        在项目中我是写客户端的,所以我主要学习了客户端的源码。现总结如下:
 
         1,程序入口DemoAppActivity开启服务:

 // Start the service
ServiceManager serviceManager = new ServiceManager(this);
serviceManager.setNotificationIcon(R.drawable.notification);//设置消息的图标
serviceManager.startService();

 在实例化ServiceManage的过程中,做了以下工作,加载 res/raw/androidpn.properties 配置文件中的参数信息,并将其保存在SharedPreferences中。然后调用startService()开启服务。

 

 

public void startService() {
        Thread serviceThread = new Thread(new Runnable() {
            @Override
            public void run() {
                Intent intent = NotificationService.getIntent();
                context.startService(intent);
            }
        });
        serviceThread.start();
}

 startService()方法开启了一个子线程去启动真正的信息推送服务NotificationService。对于Service,作者思密达在OnCreate()的时候做了很多工作,OnCreate()方法在服务被创建时调用,且只会被调用一次。因此多次的start()并不会产生多个实例。在OnCreate()方法中,作者获取了一个很重要的参数deviceId设备ID。可是后面并没有使用它。

 

 

telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
// Get deviceId
deviceId = telephonyManager.getDeviceId();

 获得设备ID后,

 

 

xmppManager = new XmppManager(this);
taskSubmitter.submit(new Runnable() {
public void run() {
   NotificationService.this.start();
   }
});

 实例化XmappManager,并且调用taskSubmitter,在taskSubmitter方法里实例化NotificationService类,并且调用其start()方法。实例化NotificationService类时会做以下工作:

 

public NotificationService() {
        notificationReceiver = new NotificationReceiver();
        connectivityReceiver = new ConnectivityReceiver(this);
        phoneStateListener = new PhoneStateChangeListener(this);
        executorService = Executors.newSingleThreadExecutor();
        taskSubmitter = new TaskSubmitter(this);
        taskTracker = new TaskTracker(this);
}

 实例化notificationReceiver,NotificationReceiver继承了BroadcastReceiver类。BroadcastReceiver (广播接收者)用于接收广播 Intent 。ConnectivityReceiver同样继承了BroadcastReceiver类。PhoneStateChangeListener继承了PhoneStateListener,用于监听手机状态变化。Executors.newSingleThreadExecutor()返回一个线程池(这个线程池只有一个线程),这个线程池可以在线程死后(或发生异常时)重新启动一个线程来替代原来的线程继续执行下去。

 

NotificationService.start()方法

private void start() {
        Log.d(LOGTAG, "start()...");
        registerNotificationReceiver();
        registerConnectivityReceiver();
        // Intent intent = getIntent();
        // startService(intent);
        xmppManager.connect();
}

 registerNotificationReceiver()方法注册了notificationReceiver来接收广播,registerConnectivityReceiver()方法注册了connectivityReceiver来监听网络连接状况。然后调用xmappManager的connect方法。

 

继续跟踪xmappManager的connect方法又执行了哪些工作

 

public void connect() {
        Log.d(LOGTAG, "connect()...");
        submitLoginTask();
}

 调用了submitLoginTask()方法,顾名思义,提交登录任务。

 

private void submitLoginTask() {
        Log.d(LOGTAG, "submitLoginTask()...");
        submitRegisterTask();
        addTask(new LoginTask());
}

 提交登录任务中,又提交了一个注册任务,同时将新建的登录任务添加到任务集合中并交由 TaskTracker 来对添加的任务进行监视。继续根据在登录任务中执行的工作:

(1)如果连接没有经过身份验证,根据username和password执行登录操作,然后为连接添加各种监听机制。执行刚刚添加的任务runTask()(2)如果连接通过身份验证,直接执行任务runTask();

 

private LoginTask() {
            this.xmppManager = XmppManager.this;
        }

        public void run() {
            Log.i(LOGTAG, "LoginTask.run()...");

            if (!xmppManager.isAuthenticated()) {
                Log.d(LOGTAG, "username=" + username);
                Log.d(LOGTAG, "password=" + password);

                try {
                    xmppManager.getConnection().login(
                            xmppManager.getUsername(),
                            xmppManager.getPassword(), XMPP_RESOURCE_NAME);
                    Log.d(LOGTAG, "Loggedn in successfully");

                    // connection listener
                    if (xmppManager.getConnectionListener() != null) {
                        xmppManager.getConnection().addConnectionListener(
                                xmppManager.getConnectionListener());
                    }

                    // packet filter
                    PacketFilter packetFilter = new PacketTypeFilter(
                            NotificationIQ.class);
                    // packet listener
                    PacketListener packetListener = xmppManager
                            .getNotificationPacketListener();
                    connection.addPacketListener(packetListener, packetFilter);

                    xmppManager.runTask();

                } catch (XMPPException e) {
                    Log.e(LOGTAG, "LoginTask.run()... xmpp error");
                    Log.e(LOGTAG, "Failed to login to xmpp server. Caused by: "
                            + e.getMessage());
                    String INVALID_CREDENTIALS_ERROR_CODE = "401";
                    String errorMessage = e.getMessage();
                    if (errorMessage != null
                            && errorMessage
                                    .contains(INVALID_CREDENTIALS_ERROR_CODE)) {
                        xmppManager.reregisterAccount();
                        return;
                    }
                    xmppManager.startReconnectionThread();

                } catch (Exception e) {
                    Log.e(LOGTAG, "LoginTask.run()... other error");
                    Log.e(LOGTAG, "Failed to login to xmpp server. Caused by: "
                            + e.getMessage());
                    xmppManager.startReconnectionThread();
                }

            } else {
                Log.i(LOGTAG, "Logged in already");
                xmppManager.runTask();
            }

        }
    }

 

 

 

 

具体的监听和接下来的操作会在下篇进行分析。

  • 大小: 15.7 KB
  • 大小: 8.8 KB
2
0
分享到:
评论

相关推荐

    Android推送框架 androidpn

    Androidpn推送框架源码分析及配置方法,压缩包里面包括服务端和客户端代码,及说明文档

    Android推送框架 androidpn.doc

    AndroidPN(Android Push Notification)是一个基于XMPP协议的开源Android推送通知实现,它包括了客户端和服务器端的完整实现。XMPP(Extensible Messaging and Presence Protocol)是一种用于即时通信和在线状态的...

    基于androidpn设计的android远程推送demo

    通过学习和运行这个基于AndroidPN的远程推送Demo,开发者可以深入理解Android推送服务的工作原理,以及如何在实际应用中实现可靠且高效的推送机制。这对于提升用户体验,尤其是对于消息通知类应用,具有非常重要的...

    androidpn推送框架+文档

    androidpn为Android应用提供消息通知推送支持, 它本质上服务器端基于 Openfire,客户端基于 asmack,这二者都最 XMPP IM 开源实现里的二个基本组件,应该说 androidpn 只是把二者更多地结合起来用于做 Push的场景。...

    androidpn-client推送客户端

    AndroidPN(Android Push Notification)客户端是一款专门为Android操作系统设计的应用程序,用于实现远程服务器向设备推送通知的功能。在移动应用开发中,推送通知是一项至关重要的特性,它允许应用程序在后台状态...

    Android完美的消息推送技术Androidpn,安装后改ip地址即可

    网上很多讲解androidpn推送的博客,也有很多源码,下载后导入有时也会有错误,此资源可以完美的运行,运行前你需要完成如下操作:1、启动Tomcat 2、下载androidpn 地址:http://sourceforge.net/projects/androidpn/...

    androidpn服务器推送

    AndroidPN(Android Push Notification)是Android平台上的一种消息推送服务,旨在帮助开发者实现在应用程序后台时仍然能够接收服务器发送的通知或数据。在AndroidPN服务器推送的实现中,有以下几个关键知识点: 1....

    基于androidpn设计的android客户端远程推送demo

    这个Demo是学习和理解Android远程推送机制的一个良好起点,通过它你可以深入理解GCM/FCM的工作原理,并能够自行开发具有推送功能的应用。同时,对于开发者来说,掌握远程推送技术对于提升应用的用户活跃度和满意度至...

    androidpn离线推送

    AndroidPN离线推送是一种在Android平台上实现的消息推送技术,它允许应用在用户设备处于离线状态时仍能接收到服务器发送的通知。这个技术的核心在于优化应用程序的通信效率,提高用户体验,尤其是在用户没有打开应用...

    androidpn 推送系统

    2. 客户端:安装在Android设备上的应用程序,需要集成AndroidPN客户端库,用于接收和处理推送消息。 3. 通信协议:通常采用XMPP(Extensible Messaging and Presence Protocol)协议,这是一种实时通信协议,适合于...

    改进安卓推送androidpn源代码myecplse工程

    增加了,在发出一条消息后,保存到消息表,这样,由于有些app未上线导致无法收到推送消息。在app上线后,自动判定是否已经发送给该app,如果没发,就发送推送消息。保证不会漏发推送消息。我定义的是三天内的消息,...

    androidpn 消息推送客户端+服务器端

    AndroidPN(Android Push Notification)是一种基于XMPP协议的开源消息推送系统,专为Android平台设计。这个项目包含两部分:客户端应用和服务器端组件。在本文中,我们将深入探讨这两个部分以及它们的工作原理。 ...

    消息推送-androidpn

    通过AndroidPN,开发者可以及时将新内容、活动或者提醒推送到用户的设备上,无需用户主动打开应用。 **一、AndroidPN架构** 1. **服务器端**:AndroidPN服务器负责接收和处理来自应用服务器的推送请求,并将这些...

    著名的AndroidPN消息推送客户端

    AndroidPN(Android Push Notification)是一种基于XMPP(Extensible Messaging and Presence Protocol)协议的开源消息推送客户端,主要用于Android平台。XMPP是一种开放标准的即时通讯协议,它允许应用程序通过...

    Androidpn推送增强版

    下面将详细介绍AndroidPN的服务端和客户端实现,以及如何利用它来实现Android设备上的推送功能。 一、AndroidPN服务端 AndroidPN服务端是整个推送系统的核心,负责接收应用程序发送的消息,并将这些消息推送到指定...

    androidpn消息推送源码

    7. **学习和实践**:分析和研究AndroidPN的源码,可以帮助开发者深入理解XMPP协议的工作原理,以及在Android平台上实现消息推送服务的具体步骤。通过修改和扩展源码,可以定制自己的推送服务,满足特定的应用场景...

    androidpn消息推送

    AndroidPN(Android Push Notification)是一种基于Google Cloud Messaging (GCM) 的第三方消息推送服务,用于在Android设备上实现后台消息的实时推送。AndroidPN的主要功能是帮助开发者在应用程序不运行时,仍然...

    android推送开源框架

    AndroidPN,全称为Android Push Notification,是一个专门为Android平台设计的开源推送框架。它允许开发者轻松地在应用程序中集成远程推送通知服务,以便实时地向用户发送消息,无需应用程序处于前台运行状态。...

    androidpn 服务端和android端源代码

    这个项目主要用于帮助开发者实现在Android设备上进行远程消息推送,这对于实时更新应用信息、通知用户新消息或者在后台执行任务时与服务器保持通信非常有用。 首先,我们来看服务端。"androidpn-server-bin-tomcat...

Global site tag (gtag.js) - Google Analytics