Android 中的XMPP 应用

原文来自:程序员杂志第一期,个人感觉这篇文章中的实例介绍的不错,在这里与大家分享,原文如下:

Extensible Messaging and Presence Protocol(XMPP)——可扩展消息与表示协议, 是由Jabber 开源社区贡献的一个基于XML的通信协议,它是被广泛应用的四大即时通信协议之一。Google 的即时通信软件GTalk 就是基于XMPP协议的。这次Google 推出Android,当然不会忘记XMPP,为它编写了相应的API 和Demo,现在就让我们从Google提供的Demo开始,一步步了解Android上的XMPP应用。( 下面基于模拟器演示)

启用XMPP

在API Demos 中, 我们很容易就找到了XMPP 的相关应用:XMPP Data Message Sender(APIDemos->App->Service)。但是,不要急于运行它,因为在使用XMPP应用之前,还要设置连接XMPP 服务器账号。进入Dev Tools(待机界面的最后一个应用):

打开XMPP Settings,点击Add Account,在Googlesign in中填入你的GMail 帐号和密码进行登录。打开主菜单 Appliactions/APIs/App/Service XmppData Message Sender,在界面中输入你刚刚登录用的GMail 地址, 登录XMPP服务器使用GMail的账号

点击Sendmessage 按钮。如果不出所料,你会看到如下一个提示:

恭喜你,你已经能够通过xmpp发送数据消息了。

实际上这条信息是由XMPP Data Message Sender 发送给XMPP 服务器, 而客户端通过XmppDataMessage-Receiver(请参考API Demos 提供的源代码及相关文档)接收的。因为接收者是你自己,所以你会看到这条消息。如果使用两台电脑分别以不同的帐号登录XMPP服务器,两个模拟器之间就可 以互发消息了(同一台电脑也可以实现,只是配置过程稍微有些繁琐)。

发送给GTalk

也许你会尝试将接收者改为一个已经登录的GTalk帐号,但是,无论你如何按Send,GTalk 也不会接收到任何信息,这是为什么?

原因是Android 中XMPP的信息分成两种形式:ataMessage( 数据消息) 和Text Message(文本消息),XMPPData Message Sender 发送的是数据消息,而GTalk 能接收的是文本消息,语言不通啊,所以无法交流。其实要Android 与GTalk 交流也不难,打开XmppData-MessageSender.java的源代码,修改下面的这行代码:
mXmppSession.sendDataMessage(username,getIntentToSend());
将其修改为:
mXmppSession.sendTextMessage(username, 0,”this is a test!”);

当你再次运行 XMPP Data Message Sende,就可以发送文本信息了。
登录xing_ye@gmail.com的GTalk 帐号(注:你在DevTools 中设置的lidahe.sun登录帐号必须和要发送的xing_ye帐号互为好友),再点击Send按钮试试看。

GTalk已经收到了Android发出的消息

实现双向通信的GTalk客户端

刚刚我们实现了数据消息的互发,也实现了向GTalk 发送消息,那么能不能用接收数据消息的方式来接收文本消息呢?很遗憾,答案是否定的。与数据消息不同,文本消息并不能发送Intent,因而也无法用 IntentReciver 来接收(参见XmppDataMessageReceiver.java 源代码)。但是,android提供了相应的处理方式。
如果你设置了XMPP登录帐号,当你启动模拟器时,Android 就开始接收发送到该帐号的消息了,它将收到的消息保存到名为IM数据库里。同时,也会将该账号发送的消息也保存下来。因此,Android 提供了一个名为Im的provider,通过它,你就可以查询保存在IM中的数据。请看下面的代码:

/*来自:http://davanum.wordpress.com/2007/11/23/
totally-unofficial-android-gtalk-clientsendreceive-xmpp-messages/*/
/* Run a query against CONTENT_URI = “content://im/messages”*/

Cursor cursor = managedQuery(Im.Messages.
CONTENT_URI, null, “contact=/’” + mRecipient.
getText().toString() + “/’”, null, null);
// Display the cursor results in a simple list
/* Note that the adapter is dyamic (picks up newentries automatically)*/
ListAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1,
cursor, // Give the cursor to the list adatper
new String[]{Im.MessagesColumns.BODY},
new int[]{android.R.id.text1});
this.mListMessages.setAdapter(adapter);

访问上面的链接可以得到全部的代码。

数据消息的应用

文本消息可以用来实现IM客户端,那么数据消息有什么作用呢?事实上,数据消息可以成为应用程序之间沟通的纽带。通过 demo 我们已经看到, 运行在后台的XmppDataMessageReceiver 能够接收来自其他设备的消息, 但是demo 中只是以通知的形式告知用户, 并没有附带任何实际的应用。但是, 只要对demo 进行一些小小的改动,就能立即显现出数据消息的作用。在XmppDataMessageReceiver 中不能直接启动一个应用,但是可以启动一个服务。而通过这个服务作为中转,就可以把数据消息跟特定的应用程序关联。

同样借助API Demos 提供的例程,让我们看看如何实现这个操作。首先修改XmppDataMessageReceiver 的onRecieveIntent,在显示通知的后面增加这样一行代码:context.startService(new Intent(context,LocalService.class), null);
其中的LocalService同样是API Demos提供的,它能够创建一个服务例程。接着修改LocalService 的onCreate(),在最后增加:

Intent i = new Intent(Intent.MAIN_ACTION);
i.addLaunchFlags(Intent.NEW_TASK_LAUNCH);
i.setClassName(“com.google.android.samples”, “com.
google.android.samples.app.HelloWorld”);
startActivity(i);

启动Demo 提供的Hello World 应用。再次运行APIDemos,向本地登录XMPP的帐号发送一个数据消息,你会看到:

总结

通过将数据消息中的参数传递给Activity,不仅可以实现两台设备之间应用程序之间的交互, 还可以完全完成棋类游戏等一些点对点的应用。所以XMPP无疑改变了标准之争的格局,提供了无限扩充的发展空间层。希望xmpp服务的基础上开发更多富有 创新的应用软件。感谢Androidcn社区的地狱男爵(李大和)对本文成稿的贡献。

更多相关文章

  1. Android(安卓)性能优化(二)Handler运行机制原理,源码分析
  2. 关于Handler的理解
  3. 漫谈Android数据缓存、数据序列化和Intent传递复杂数据
  4. Android(安卓)数据存储和文件使用案例分析
  5. Android(安卓)studio 关于SQlite数据库导出,创建数据库、表以及如
  6. android json访问php webservice
  7. Adapter
  8. Android(安卓)音视频深入 四 Android原生API录视频MP4,有缺陷,没有
  9. Android(安卓)中 MessageQueue 的 nativePollOnce

随机推荐

  1. android permission list
  2. Android从一个APP跳转到另一个APP的主界
  3. 第九章使用ContentProvider实现数据共享
  4. Android中的color.xml的说明
  5. 如何在ActionBar上面添加popup menu
  6. android调试信息
  7. Android can not create linked resource
  8. android读取Resources中内容
  9. 在Android命令行启动程序的方法
  10. Android 入门文档__ContentProvider详解