- 浏览: 289394 次
- 性别:
- 来自: 青岛
文章分类
最新评论
-
totot:
打扰大师了,acquireWakeLock(),releas ...
使用WakeLock使Android应用程序保持后台唤醒 -
totot:
打扰大师了,acquireWakeLock(),releas ...
使用WakeLock使Android应用程序保持后台唤醒 -
aaa6287152:
感谢楼主 问题解决 一开始按照第一条修改了,结果看第二条没有修 ...
The method of type must override a superclass method解决方式 -
Mark_dev:
chen646531623 写道达哥,很不幸,我出现了你所说的 ...
Unable to resolve host "...": No address associated 错误 解决方案 -
Mark_dev:
我也遇到楼上的那个问题。
Unable to resolve host "...": No address associated 错误 解决方案
原文:http://xgeek.me/blog/2012/03/28/androidpn/
服务器推送技术,目前应用广泛的大部分都是对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
读取本地的账户信息,并登录,开始等待服务器推送消息
评论
1 楼
wenjiefeng
2012-10-13
你好,在andrioidpn-client客户端源码里,NotificationDetailsActivity这个类里,下面的参数都是什么意思呢
Intent intent = getIntent();
String notificationId = intent
.getStringExtra(Constants.NOTIFICATION_ID);
String notificationApiKey = intent
.getStringExtra(Constants.NOTIFICATION_API_KEY);
String notificationTitle = intent
.getStringExtra(Constants.NOTIFICATION_TITLE);
String notificationMessage = intent
.getStringExtra(Constants.NOTIFICATION_MESSAGE);
String notificationUri = intent
.getStringExtra(Constants.NOTIFICATION_URI);
疑惑1、 这几个参数代表什么意思呢, notificationId; notificationApiKey; notificationTitle; notificationMessage; notificationUri;
我看源码里好几处都用到这几个参数 ,
疑惑2、 现在服务端已经能将消息推送到服务端了并增加了一些参数,推送的消息里增加了距离distance等参数,该在客户端的哪个类里获取这些值呢
Intent intent = getIntent();
String notificationId = intent
.getStringExtra(Constants.NOTIFICATION_ID);
String notificationApiKey = intent
.getStringExtra(Constants.NOTIFICATION_API_KEY);
String notificationTitle = intent
.getStringExtra(Constants.NOTIFICATION_TITLE);
String notificationMessage = intent
.getStringExtra(Constants.NOTIFICATION_MESSAGE);
String notificationUri = intent
.getStringExtra(Constants.NOTIFICATION_URI);
疑惑1、 这几个参数代表什么意思呢, notificationId; notificationApiKey; notificationTitle; notificationMessage; notificationUri;
我看源码里好几处都用到这几个参数 ,
疑惑2、 现在服务端已经能将消息推送到服务端了并增加了一些参数,推送的消息里增加了距离distance等参数,该在客户端的哪个类里获取这些值呢
发表评论
-
ASimpleCache 一个为android制定的 轻量级的 开源缓存框架。
2014-04-10 11:04 1712ASimpleCache 是一个为android制定的 轻量 ... -
android 中 EditText加入图标 更改边框颜色 设置透明 代码
2013-07-19 10:20 4034main.xml [java] view pl ... -
TortoiseGit安装教程
2013-07-17 11:40 2019TortoiseGit 是Windows下的可视化Git界面 ... -
使用WakeLock使Android应用程序保持后台唤醒
2013-07-17 11:02 3022在使用一些产品列如 ... -
Android AlarmManager实现不间断轮询服务
2013-07-17 10:48 2956在消息的获取上是选择轮询还 是推送得根据实际的业务需要来技 ... -
二维码、条形码扫描——使用Google ZXing
2013-07-17 10:20 3627我在项目中用到了二维码扫描的技术,用的是Google提供的Z ... -
android 基于基站,apn,gps,wifi,network 根据不同手机sim卡获取经纬度
2013-05-20 15:08 2318一:新建MyLocation类,本类主要管理使用各种获取经 ... -
android 基于百度地图api开发定位以及获取详细地址
2013-05-20 15:02 2879一:百度地图开发必须要到百度开发平台android开发api ... -
android google地图定位开发,且可以自由移动位置重新获取定位,地址信息
2013-05-20 15:00 2691一:申请key: 1.首先找到debug keyst ... -
Android UI库及组件推荐
2013-03-28 10:40 1870一、UI组件库 1. GreenDroid ... -
Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示的原因及解决办法
2012-11-13 10:00 1798关键词:Android、模拟器、无法启动 某天,Andr ... -
关于Eclpse升级到ADT-20,xml布局文件不能正常显示问题
2012-10-29 17:39 17121.首先要把自己的eclipse中的adt升级到最新的版本(目 ... -
Android开发错误汇总
2012-10-29 17:38 3615大家都在为项目开发成功而喜悦,但可不知成功的路上是会经常出错的 ... -
The method of type must override a superclass method解决方式
2012-09-21 10:18 2264标签:override ActionSupport ... -
[程序猿感悟] Android平台开发中的重构三步走
2012-09-13 16:26 2017我们都知道,技术是优 ... -
Android Layout XML属性
2012-08-16 11:29 1217Layout对于迅速的搭建界面和提高界面在不同分辨率的屏幕 ... -
Eclipse快捷键大全
2012-08-02 09:50 1117Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ct ... -
Android中asset文件夹和raw文件夹区别
2012-07-26 16:58 1993*res/raw和assets的相同点 ... -
分享45个android实例源码,很好很强大.大家赶快来收藏吧!!
2012-07-26 15:55 1117http://www.eoeandroid.com/threa ... -
Intent调用大全,史上最全的
2012-07-26 12:11 1061//调用浏览器 Uri uri = Uri.parse(&q ...
相关推荐
- 消息存储:推送的消息可能会被记录在数据库中,以便跟踪发送状态或进行日志分析。 为了成功部署和运行AndroidPN,你需要: - 安装Eclipse和Tomcat服务器。 - 导入源码项目到Eclipse,并配置Tomcat为服务器。 - ...
AndroidPN,全称为Android Push Notification...开发者可以通过阅读和分析这些代码,学习如何在实际项目中实现AndroidPN的自动重连机制。记得在实践中不断测试和调整,以确保在各种网络环境和设备条件下都能稳定工作。
Androidpn推送框架源码分析及配置方法,压缩包里面包括服务端和客户端代码,及说明文档
**四、AndroidPN源码分析** AndroidPN的源码可以帮助开发者理解如何实现一个完整的推送服务。通过阅读`PushService`、`PushReceiver`、`PushServerSync`等相关类,可以学习到如何创建后台服务、如何处理广播接收器...
由于描述中没有给出详细信息,我们将根据标签和可能的源码分析来探讨相关知识点。 1. **Android 应用程序架构**: 在Android平台上,开发者通常使用Activity、Service、BroadcastReceiver和ContentProvider这四大...
此外,通过调试和分析这个示例,可以深入理解AndroidPN的工作原理和最佳实践。 在实际开发中,除了理解AndroidPN的原理外,还需要关注以下几点: 1. **权限设置**:在AndroidManifest.xml中添加必要的权限,如...
**目录分析** AndroidPN的源代码结构包含了服务器端和客户端的相关模块,例如,`org.androidpn.server.xmpp.net.Connection`类代表服务器的XMPP连接,而`org.androidpn.server.xmpp.session.SessionManager`负责会话...
通过上述分析,我们可以看出AndroidPN在实现客户端与服务器之间的稳定通信方面做了大量的工作。特别是在处理连接断开后的自动重连功能上,通过`ReconnectionThread`和`XmppManager`等组件实现了较为完善的解决方案。...
在实际应用中,开发者可以根据自身需求,对AndroidPN服务器端源码进行定制,比如增加消息分类、统计分析功能,或者对接其他后台系统。通过对源码的深入学习和实践,开发者不仅可以掌握Android消息推送的核心技术,还...
源码分析可以揭示如何实现高效、可靠的消息队列。 3. **推送服务**:服务器端有一个后台服务,定时检查消息队列并尝试发送消息。这部分可能涉及到多线程和异步处理,确保消息能够及时、准确地发送到目标设备。 4. ...
总的来说,这个修改过的AndroidPN服务端项目源码为开发者提供了一次学习和实践推送通知服务的机会,通过分析和理解代码,可以提升Android应用的实时通信能力和后台服务的构建技能。同时,对于想要自建推送服务的...
**AndroidPN客户端0.5推送源码解析** AndroidPN(Android Push Notification)是一个开源项目,旨在为Android设备提供一个高效、可靠的消息推送服务。在移动应用开发中,消息推送是提高用户互动性和实时性的重要...
7. **学习和实践**:分析和研究AndroidPN的源码,可以帮助开发者深入理解XMPP协议的工作原理,以及在Android平台上实现消息推送服务的具体步骤。通过修改和扩展源码,可以定制自己的推送服务,满足特定的应用场景...
"AndroidPN客户端"是针对Android平台的一个推送通知服务的客户端实现。这个项目主要涉及的是如何在Android设备上接收并处理远程...通过分析和修改这个客户端代码,开发者可以定制自己的推送通知系统,满足特定需求。
3. **性能监控**:在压力测试中,实时监控CPU、内存和网络资源的使用情况,以便于分析性能瓶颈并进行优化。 4. **错误处理**:当出现网络异常、服务器响应超时等情况时,客户端应有良好的错误处理机制,保证程序的...
本文将通过分析开源项目Androidpn,探讨如何在Android设备上构建一个推送通知系统。 **一、Androidpn开源项目** Androidpn是一个专门为Android平台设计的开源项目,提供基于XMPP协议的推送通知服务。该项目包括一...
软件开发设计:PHP、QT、...云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。
同时,增加了数据库功能,这可能意味着推送服务现在能够存储和管理更多的推送历史记录,或者支持对用户接收推送消息的行为进行数据分析,从而为开发者提供更精细化的推送策略。 AndroidPN的工作原理是基于Google ...