1.引言java
所謂的消息推送就是從服務器端向移動終端發送鏈接,傳輸必定的信息。好比一些新聞客戶端,每隔一段時間收到一條或者多條通知,這就是從服務器端傳來的推送消息;還好比經常使用的一些IM軟件如微信、GTalk等,都具備服務器推送功能。android
推送方法以下:spring
1)經過SMS進行服務器端和客戶端的交流通訊。服務器
在Android平臺上,你能夠經過攔截SMS消息而且解析消息內容來了解服務器的意圖,能夠實現徹底的實時操做。可是問題是這個方案的成本相對比較高,且依賴於運營商。微信
2)循環主動定時獲取網絡
這種方法須要客戶端來作一個定時或者週期性的訪問服務器端接口,以得到最新的消息。輪詢的頻率太慢可能致使某些消息的延遲,太快則會大量消耗網絡帶寬和電池。併發
3)持久鏈接框架
這個方案能夠解決由輪詢帶來的性能問題,可是仍是會消耗手機的電池。咱們須要開一個服務來保持和服務器端的持久鏈接(蘋果就和谷歌的C2DM是這種機制)。可是對於Android系統,當系統可用資源較低,系統會強制關閉咱們的服務或者是應用,這種狀況下鏈接會強制中斷。(Apple的推送服務之因此工做的很好,是由於每一臺手機僅僅保持一個與服務器之間的鏈接,事實上C2DM也是這麼工做的。即全部的推送服務都是經由一個代理服務器完成的,這種狀況下只須要和一臺服務器保持持久鏈接便可。C2DM=Cloud to Device Messaging)。性能
相比之下第三種仍是最可行的。爲軟件編寫系統服務或開機啓動功能;或者若是系統資源較低,服務被關閉後能夠在onDestroy ()方法裏面再重啓該服務,進而實現持久鏈接的方式。google
C2DM內置於Android的2.2系統上,沒法兼容老的1.6到2.1系統;且依賴於Google官方提供的C2DM服務器,因爲國內的網絡環境,這個服務常常不可用。
創建在TCP協議之上的XMPP協議,不只可提供可這種持久鏈接的功能,能實現服務器和客戶機的雙工通訊,還能不依賴與系統版本和google服務器的限制,提供了比較好的解決方案。
2. XMPP協議
XMPP全稱Extensible Messaging and Presence Protocol,前身是Jabber項目,是一種以XML爲基礎的開放式即時通信協議。XMPP由於被Google Talk和網易泡泡應用而被廣大網民所接觸。XMPP的關鍵特點是,分散式的即時通信系統,以及使用XML串流。XMPP目前被IETF國際標準組織完成了標準化工做。
Android push notification(androidpn) 是一個基於XMPP協議的java開源實現,它包含了完整的客戶端和服務器端。該服務器端基本是在另一個開源工程openfire基礎上修改實現的。
androidpn客戶端須要用到一個基於java的開源XMPP協議包asmack,這個包一樣也是基於openfire下的另一個開源項目smack,不過咱們不須要本身編譯,能夠直接把androidpn客戶端裏面的asmack.jar拿來使用。客戶端利用asmack中提供的XMPPConnection類與服務器創建持久鏈接,並經過該鏈接進行用戶註冊和登陸認證,一樣也是經過這條鏈接,接收服務器發送的通知。
androidpn服務器端也是java語言實現的,基於openfire開源工程,不過它的Web部分採用的是spring框架,這一點與openfire是不一樣的。Androidpn服務器包含兩個部分,一個是偵聽在5222端口上的XMPP服務,負責與客戶端的XMPPConnection類進行通訊,做用是用戶註冊和身份認證,併發送推送通知消息。另一部分是Web服務器,採用一個輕量級的HTTP服務器,負責接收用戶的Web請求。服務器的這兩方式,意義非凡:當相應的TCP端口被防火牆封閉,可使用輪詢的方式進行訪問,所以又有助於經過防火牆。