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