- 浏览: 314919 次
- 性别:
- 来自: 益阳
文章分类
最新评论
-
duckbit:
楼主是否能把共享layout的例子发给我,有点没明白 谢谢额! ...
Android换肤apk -
天涯海角262253:
...
Androidpn里的Xmpp的理解 -
lbstudy:
Activity之间的切换动画 -
dumbnesslys:
楼主可不可以给个源码 ,就build.xml的 772774 ...
Ant自动打包 -
finaljava:
build.xml 这么复杂,看看这个吧http://angr ...
Ant自动打包
XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。用xmpp来实现android的push功能,感觉有点大材小用了,xmpp本身是一种即时通信协议。
xmpp是一种用于即时通信的协议,使用过程有点类似于我们使用QQ的过程,其使用过程分为三步:
1. 连接服务器,就好像打开QQ软件,看代码:
if(!mXmppManager.isConnected()) { ConnectionConfiguration config = new ConnectionConfiguration(mHost, mPort); config.setSecurityMode(SecurityMode.required); config.setSASLAuthenticationEnabled(false); config.setCompressionEnabled(false); XMPPConnection connection = new XMPPConnection(config); mXmppManager.setConnection(connection); try { connection.connect(); Log.i(LOGTAG, "XMPP connected successfully"); /** * 这个就是对于通信的xml文本进行解析的解析器,再把信息转换成IQ,这个相当于QQ的聊天信息 * 如果要用这个协议,其IQ的子类和IQProvider要进行重写 */ ProviderManager.getInstance().addIQProvider("notification", "androidpn:iq:notification", new NotificationIQProvider()); } catch (XMPPException e) { Log.d(LOGTAG, "the connection is error ... "); } mXmppManager.runTask(); } else { Log.i(LOGTAG, "XMPP connected already"); mXmppManager.runTask(); }
这一步主要是连接服务器,还有设置一些连接的参数,还有设置连接的解析器。
2. 如果没有用户,注册新的帐号和密码
只要连接了服务器了,客户端就可以向服务器端发送消息,发送是以Packet(数据包)来进行发送的,这个类有很多的子类,注册的子类为Registration。if(!mXmppManager.isRegistered()){
final String newUsername = newRandomUUID();
final String newPassword = newRandomUUID();
Registration registration = new Registration();
PacketFilter packetFilter = new AndFilter(new PacketIDFilter(
registration.getPacketID()), new PacketTypeFilter(
IQ.class));
PacketListener packetListener = new PacketListener() {
@Override
public void processPacket(Packet packet) {
// 服务器回复客户端
if(packet instanceof IQ) {
IQ response = (IQ) packet;
if(response.getType() == IQ.Type.ERROR) { // 注册失败
if (!response.getError().toString().contains(
"409")) {
Log.e(LOGTAG,"Unknown error while registering XMPP account! " + response.getError().getCondition());
}
} else if(response.getType() == IQ.Type.RESULT) { // 注册成功
mXmppManager.setUsername(newUsername);
mXmppManager.setPassword(newPassword);
// 把用户名和密码都保存到磁盘
Editor editor = mSharedPrefs.edit();
editor.putString(Contants.XMPP_USERNAME, newUsername);
editor.putString(Contants.XMPP_PASSWORD, newPassword);
editor.commit();
mXmppManager.runTask();
}
}
}
};
// 给注册的Packet设置Listener,因为只有等到正真注册成功后,我们才可以交流
mConnection.addPacketListener(packetListener, packetFilter);
registration.setType(IQ.Type.SET);
registration.addAttribute("username", newUsername);
registration.addAttribute("password", newPassword);
// 向服务器端,发送注册Packet包,注意其中Registration是Packet的子类
mConnection.sendPacket(registration);
} else { // 已经注册过了
mXmppManager.runTask();
}
还有要注意的是,上面的addPacketListener方法不是给所有发送的数据包设置listener,而只是针对这次的注册Packet。
3. 用注册的帐号和密码进行登陆(像用QQ号帐进行登陆一样)
// 判断是否已经登陆过了,是否是在登陆状态 if(!mXmppManager.isAuthenticated()) { try { mConnection.login(mUsername, mPassword, "AndroidpnClient"); // 设置XmppConnection的监听器 if(mXmppManager.getConnectionListener() != null) { mConnection.addConnectionListener(mXmppManager.getConnectionListener()); } // 设置服务器端推送的监听器 PacketFilter packetFilter = new PacketTypeFilter(NotificationIQ.class); PacketListener packetListener = mXmppManager.getNotificationPacketListener(); mConnection.addPacketListener(packetListener, packetFilter); mXmppManager.runTask(); } catch (XMPPException e) { // 登陆失败,应该重试 String INVALID_CREDENTIALS_ERROR_CODE = "401"; String errorMessage = e.getMessage(); // 如果只是因为没有注册,则进行重新注册 if (errorMessage != null && errorMessage.contains(INVALID_CREDENTIALS_ERROR_CODE)) { mXmppManager.reregisterAccount(); return; } mXmppManager.startReconnectionThread(); } catch (Exception e) { // 有可能mConnection都为空 Log.e(LOGTAG, "LoginTask.run()... other error"); Log.e(LOGTAG, "Failed to login to xmpp server. Caused by: " + e.getMessage()); mXmppManager.startReconnectionThread(); // 启动重连线程 } } else { mXmppManager.runTask(); }
这里设置了连接的监听器mConnection.addConnectionListener(),连接过程中有可以连接突然中断,连接出错等等问题,要进行监听。
设置服务器推送信息的Listener,接收到信息后,显示给用户。
如果出错的原因是401(无效的用户名和密码,则应该进行重新注册,再连接)
对于服务器push过来的信息进行处理,是在PacketListener类里面,这个接口里,只要实现一个方法processPacket(Packet packet),从传过来的Packet(数据包)里获取自己需要的数据:
对于Androidpn项目的整体代码分析,看下一遍文章。public void processPacket(Packet packet) {
if(packet instanceof NotificationIQ) {
NotificationIQ notification = (NotificationIQ) packet;
if(notification.getChildElementXML().contains("androidpn:iq:notification")) {
String notificationId = notification.getId();
String notificationApiKey = notification.getApiKey();
String notificationTitle = notification.getTitle();
String notificationMessage = notification.getMessage();
String notificationUri = notification.getUri();
Intent intent = new Intent(Contants.ACTION_SHOW_NOTIFICATION);
intent.putExtra(Contants.NOTIFICATION_ID, notificationId);
intent.putExtra(Contants.NOTIFICATION_API_KEY,notificationApiKey);
intent.putExtra(Contants.NOTIFICATION_TITLE,notificationTitle);
intent.putExtra(Contants.NOTIFICATION_MESSAGE, notificationMessage);
intent.putExtra(Contants.NOTIFICATION_URI, notificationUri);
mXmppManager.getContext().sendBroadcast(intent);
}
}
}
评论
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);
Log.i("test", "notificationId===============" + notificationId);
Log.i("test", "notificationApiKey============" + notificationApiKey);
Log.i("test", "notificationTitle============" + notificationTitle);
Log.i("test", "notificationMessage=================" + notificationMessage);
Log.i("test", "notificationDistance========distance=====111====" + notificationDistance);
Log.i("test", "notificationUri===============" + notificationUri);
疑惑1、 这几个参数代表什么意思呢, notificationId; notificationApiKey; notificationTitle; notificationMessage; notificationUri;
我看源码里好几处都用到这几个参数 ,
疑惑2、 现在服务端已经能将消息推送到服务端了并增加了一些参数,推送的消息里增加了距离distance等参数,应该在客户端的哪个类里获取这些值呢?
如何处理呢?
谢谢了
发表评论
-
浅析QQGame
2012-03-01 14:31 3529通过分析QQGame的项目,发现其存在两种方式: 1. 不安 ... -
opengl初探
2012-02-22 10:15 0android里的surfaceview Surfac ... -
onSaveInstanceState(Bundle outState)的调用时机
2012-02-15 11:10 3150Activity的方法onSaveInstanceState( ... -
Activity之间的切换动画
2012-02-15 10:53 22928从android系统2.1以后,android新增了方法:ov ... -
FLAG_ACTIVITY_NEW_TASK和affinity亲和力
2012-02-06 14:07 3616一直以为在intent里加了FLAG_ACTIVITY_N ... -
什么时候调用Dialog的dismiss()方法
2012-02-03 16:27 10068调用Dialog的dismiss()方法的方式: 1. 重写 ... -
引用主题属性
2011-12-28 18:09 2129文档里写的引用主题属性的方法如下: ?[<pac ... -
Intent的FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_FRONT
2011-12-18 14:50 54809Activity的两种启动模式:FLAG_ACTIVITY_C ... -
Android换肤apk
2011-12-11 15:30 4208在android系统中,每 ... -
Androidpn的框架浅析
2011-12-11 13:47 11783开发部署方法: 1. ... -
Log的tag的设置
2011-12-09 15:27 2455android输出日志的方法如下: int andro ... -
PopupWindow自适应布局
2011-12-04 18:24 13180Android自带的Menu菜单,常常无法满足我们的需求 ... -
Android程序换肤
2011-12-02 15:15 0Android的换肤功能,有多种方式,现在来说一下生成皮肤ap ... -
Activity与Service通信
2011-12-02 14:46 13140Activity与Service通信的方式有三种: 继 ... -
Ant自动打包2(打特殊厂商的包)
2011-11-29 15:08 4926由于公司内置的需要,我们的程序要针对不同的厂商打不同的ap ... -
Eclipse Indigo设置Courier New字体
2011-11-25 14:25 2192网上的教程如下: ... -
Fragment研究2
2011-11-24 10:43 6530几个类的结构的研 ... -
Ant自动打包
2011-08-23 15:56 39022Ant使用 在ant的官网http://ant. ... -
渐进式下载和流式下载有什么区别
2010-10-23 12:06 2328流式下载 下载边播放的BT软件,下载时必须要从电影的开头下 ... -
TableLaout样式
2010-10-12 10:41 1125要想用TableLaout来模仿九宫格的样式,其中有两个难点: ...
相关推荐
在这个“xmpp-androidPn server and client”的项目中,我们关注的是XMPP在Android平台上的应用,特别是在实现推送通知(Push Notification)方面的功能。 服务端组件: 1. androidpn-server-0.5.0-bin.zip:这个...
Tomcat版的AndroidPN(Push Notification)项目是基于XMPP协议的一个推送通知服务,它利用了Tomcat服务器和MySQL数据库来处理和存储推送信息。 首先,要搭建这个系统,你需要确保已经安装了Java Development Kit ...
【标题】中的“安卓XMPP聊天通讯Socket相关-XMPP(Android客户端的实现Tomcat版的Androidpn).rar”提到了XMPP(Extensible Messaging and Presence Protocol)在Android平台上的实现,以及它与Tomcat服务器的结合。...
AndroidPN基于XMPP(Extensible Messaging and Presence Protocol),它是一种开放标准的即时通讯协议,支持双向通信。AndroidPN-server是AndroidPN服务的后台部分,负责处理来自客户端的注册请求、存储设备信息以及...
首先,我们需要理解AndroidPN的工作原理。AndroidPN基于XMPP(Extensible Messaging and Presence Protocol)协议,这是一种实时通信协议,常用于即时消息和在线状态通知。当服务端启动时,客户端通过XMPP建立连接并...
AndroidPN(Android Push Notification)是一款专为Android平台设计的推送通知服务,它利用XMPP(Extensible Messaging and Presence Protocol,可扩展消息传递和存在协议)协议实现服务器与设备之间的实时通信。...
AndroidPN基于XMPP(Extensible Messaging and Presence Protocol)协议,这是一种用于即时通信和在线状态管理的开放标准。通过这个协议,服务器可以向客户端发送数据,即使客户端应用并未处于活动状态。 2. **...
AndroidPN的核心机制是基于XMPP(Extensible Messaging and Presence Protocol)协议,这是一种开放的即时通讯协议,允许服务器向客户端发送消息,即使客户端没有主动连接到服务器。在AndroidPN中,Tomcat作为XMPP...
AndroidPN(Android Push Notification)是Android平台上的一...理解以上这些知识点,可以帮助开发者构建一个高效、可靠且功能丰富的AndroidPN服务器推送系统。在实际开发中,还需要结合具体的业务场景进行定制和优化。
AndroidPN是基于XMPP(Extensible Messaging and Presence Protocol)协议的,这是一种开放标准的即时通讯协议,广泛应用于聊天、推送通知等多种场景。 在描述中提到了一个链接,该链接指向了CSDN博客上的一篇文章...
AndroidPN(Android Push Notification)是一种基于XMPP协议的推送服务,用于在Android设备上实现后台消息推送。这个服务能够帮助开发者实现在应用不处于前台运行状态时,依然能向用户发送通知,提升用户体验并减少...
AndroidPN(Android Push Notification)是一种基于XMPP协议的开源消息推送系统,专为Android平台设计。这个项目包含两部分:客户端应用和服务器端组件。在本文中,我们将深入探讨这两个部分以及它们的工作原理。 ...
在这个“xmpp客户端源代码”中,我们可以深入理解XMPP协议如何在Android平台上实现,以及Android应用程序如何与XMPP服务器进行交互。 首先,AndroidPN(Android Push Notification)客户端版本0.5.0是一个开源项目...
- "开源项目之Android 推送框架(androidpn) - banketree - 博客频道 - CSDN_NET.mht" 提到了一个Android推送框架,这将涉及XMPP在移动应用中的应用,以及如何使用XMPP进行设备间的消息推送。 - "xmpp介绍与RFC3920...
本文将详细解析基于Xmpp(Extensible Messaging and Presence Protocol)的Android消息推送实例——AndroidPN(Android Push Notification)。 Xmpp是一种开放的即时通讯协议,它允许用户进行实时双向通信,广泛...
3. **开放性**:XMPP协议是开源的,便于开发者学习和理解。 4. **跨平台性**:由于基于XML传输,因此具备良好的跨平台特性。 #### 三、AndroidPN实现原理 AndroidPN的实现主要依赖于两个关键组件:asmack 和 MINA ...
【AndroidPN】是一个开源的Android推送通知服务,它基于XMPP协议,由Java编写,提供了一种可扩展的方案,让服务器能够向Android客户端...开发者可以通过理解和定制AndroidPN源码,根据自身需求构建更个性化的推送服务。
"Androidpn"可能包含了服务器端的相关代码,比如XMPP服务器的配置、数据库连接和业务逻辑处理。 5. **开发流程**: 开发过程中,首先需要配置服务器环境,安装并设置XMPP服务器。接着,在Android客户端上集成XMPP...
首先,我们要理解XMPP,这是一种基于XML的实时通信协议,广泛应用于即时消息和在线状态管理。XMPP的核心特点是其灵活性和可扩展性,它允许开发者根据需求定制各种功能,比如文件传输、群组聊天等。在AndroidPN客户端...