服务器推送技术,目前应
用广泛的大部分都是对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 #key
xmppHost=192.168.1.1 #ip
xmppPort=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
读取本地的账户信息,并登录,开始等待服务器推送消息
相关推荐
AndroidPN环境搭建 本文件真对网上的环境搭建源网站无法登陆设立 <坏掉了/>http://sourceforge.net/projects/androidpn/ </坏掉了> 说明: http://www.cnblogs.com/devxiaobai/archive/2011/07/09/2101794.html ...
AndroidPN(Android Push Notification)是Android平台上的一种消息推送服务,旨在帮助开发者实现在应用程序后台时仍然能够接收服务器发送的通知或数据。在AndroidPN服务器推送的实现中,有以下几个关键知识点: 1....
通过分析“推送”文件夹中的核心代码,开发者能够掌握消息队列的管理、网络连接的建立与维护、心跳包的发送与接收,以及错误处理等关键环节。深入理解这些模块将帮助开发者构建一个稳定且高效的推送服务系统。 对于...
在Android平台上,AndroidPN(Android Push Notification)是一个用于实现远程推送通知服务的开源项目。它允许开发者通过服务器向Android设备发送消息,即使应用程序在后台运行或完全关闭时也能接收到这些消息。本...
这里我们关注的是一个特定的配置——"androidpn tomcat + oracle 版本"。这个配置涉及到AndroidPN服务在Tomcat应用服务器上运行,并与Oracle数据库进行集成。让我们深入探讨这个主题,了解其中涉及的关键知识点。 ...
AndroidPN(Android Push Notification)是一个开源项目,旨在为Android应用程序提供简单、高效的后台推送通知服务。这个项目通常需要与服务器端的组件配合工作,其中Tomcat作为常用的Java应用服务器,常常被用于...
AndroidPN(Android Push Notification)是一种基于XMPP(Extensible Messaging and Presence Protocol)协议的开源消息推送客户端,主要用于Android平台。XMPP是一种开放标准的即时通讯协议,它允许应用程序通过...
Androidpn客户端 和服务端源码下载,实现了消息推送。具体使用方法可百度。
在Android开发中,AndroidPN(Android Push Notification)是一种常见的服务,用于实现在服务器端向Android设备推送消息。本文将深入探讨如何将AndroidPN-server与Tomcat应用服务器进行整合,以便在MyEclipse环境中...
- 消息存储:推送的消息可能会被记录在数据库中,以便跟踪发送状态或进行日志分析。 为了成功部署和运行AndroidPN,你需要: - 安装Eclipse和Tomcat服务器。 - 导入源码项目到Eclipse,并配置Tomcat为服务器。 - ...
将androidpn集成到我们平时开发的javaee中,直接启动tomcat就可以启动xmpp服务,不需要另外部署androidpn。 注释:项目有点大,所以没有上传jar包,可以直接使用项目中的maven下载所需jar文件
"AndroidPN-client-0.5.0"是一个针对Android平台的Push Notification服务的客户端库,主要功能是为了实现设备与服务器之间的即时通信。Push Notification服务在移动应用开发中扮演着重要角色,它允许服务器向已安装...
"AndroidPN—Demo"是一个基于Android平台的推送通知服务示例项目,主要展示了如何实现设备的登录、连接以及接收远程推送消息的功能。AndroidPN(Android Push Notification)是一种服务,允许开发者向他们的Android...
AndroidPN,全称为Android Push Notification...开发者可以通过阅读和分析这些代码,学习如何在实际项目中实现AndroidPN的自动重连机制。记得在实践中不断测试和调整,以确保在各种网络环境和设备条件下都能稳定工作。
AndroidPN(Android Push Notification)是专门为Android平台设计的一种推送服务,它允许服务器向移动设备发送实时消息,从而提高应用程序的互动性和效率。AndroidPN客户端代码是实现这一功能的关键部分,它处理与...
androidpn 的客户端和服务器端源码. 使用说明: 解压后得到两个压缩包: androidpn-client.zip和androidpn-server-0.5.0-bin.zip, 解压两个包,Eclipse导入client,配置好目标平台,打开raw/androidpn.properties...