Android 中的XMPP 應用

來源:互聯網
上載者:User
文章目錄
  • 啟用XMPP
  • 發送給GTalk
  • 實現雙向通訊的GTalk用戶端
  • 資料訊息的應用
  • 總結

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社區的地獄男爵(李大和)對本文成稿的貢獻。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.