推送功能在手機應用開發中愈來愈重要,已經成爲手機開發的必須。在Android應用開發中,因爲衆所周知的緣由,Android消息推送咱們不得不大費周折。本文就是用來和你們共同探討一種Android消息推送的完美解決方案。php
1、消息推送基礎html
消息推送,就是在互聯網上經過按期傳送用戶須要的信息來減小信息過載的一項新技術。推送技術經過自動傳送信息給用戶,來減小用於網絡上搜索的時間。它根據用戶的興趣來搜索、過濾信息,並將其按期推給用戶,幫助用戶高效率地發掘有價值的信息java
當咱們開發須要和服務器交互的移動應用時,基本上都須要和服務器進行交互,包括上傳數據到服務器,同時從服務器上獲取數據。android
通常狀況下,客戶端與服務器之間通信客戶端是主動的,但這就存在一個問題就是一旦服務器數據有更新或者服務器要下發通知給客戶端只能等客戶端鏈接的時候才能實現。這種方式使消息失去了實時性。git
如何使客戶端可以實時的收到服務器的消息和通知,整體來講有兩種方式,第一種是客戶端使用Pull(拉)的方式,就是隔一段時間就去服務器上獲取一下信息,看是否有更新的信息出現。第二種就是 服務器使用Push(推送)的方式,當服務器端有新信息了,則把最新的信息Push到客戶端上。這樣,客戶端就能自動的接收到消息。 github
雖然Pull和Push兩種方式都能實現獲取服務器端更新信息的功能,可是明顯來講Push方式比Pull方式更優越。由於Pull方式更費客戶端的網絡流量,更主要的是費電量,還須要咱們的程序不停地去監測服務端的變化。 服務器
2、幾種常見的解決方案實現原理網絡
1)輪詢(Pull)方式:客戶端定時向服務器發送詢問消息,一旦服務器有變化則當即同步消息。併發
2)SMS(Push)方式:經過攔截SMS消息而且解析消息內容來了解服務器的命令,但這種方式通常用戶在經濟上很難承受。性能
3)持久鏈接(Push)方式:客戶端和服務器之間創建長久鏈接,這樣就能夠實現消息的及時行和實時性。
3、消息推送解決方案概述
A、C2DM雲端推送方案
在Android手機平臺上,Google提供了C2DM(Cloudto Device Messaging)服務。Android Cloud to Device Messaging (C2DM)是一個用來幫助開發者從服務器向Android應用程序發送數據的服務。該服務提供了一個簡單的、輕量級的機制,容許服務器能夠通知移動應用程序直接與服務器進行通訊,以便於從服務器獲取應用程序更新和用戶數據。
該方案存在的主要問題是C2DM須要依賴於Google官方提供的C2DM服務器,因爲國內的網絡環境,這個服務常常不可用。
B、MQTT協議實現Android推送
採用MQTT協議實現Android推送功能也是一種解決方案。MQTT是一個輕量級的消息發佈/訂閱協議,它是實現基於手機客戶端的消息推送服務器的理想解決方案。
wmqtt.jar 是IBM提供的MQTT協議的實現。咱們能夠從這裏(https://github.com/tokudu/AndroidPushNotificationsDemo)下載該項目的實例代碼,而且能夠找到一個採用PHP書寫的服務器端實現(https://github.com/tokudu/PhpMQTTClient)。
C、RSMB實現推送功能
Really Small Message Broker (RSMB) ,是一個簡單的MQTT代理,一樣由IBM提供,其查看地址是:http://www.alphaworks.ibm.com/tech/rsmb。缺省打開1883端口,應用程序當中,它負責接收來自服務器的消息並將其轉發給指定的移動設備。SAM是一個針對MQTT寫的PHP庫。咱們能夠從這個http://pecl.php.net/package/sam/download/0.2.0地址下載它.
D、XMPP協議實現Android推送
Google官方的C2DM服務器底層也是採用XMPP協議進行的封裝。XMPP(可擴展通信和表示協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線探測。這個協議可能最終容許因特網用戶向因特網上的其餘任何人發送即時消息。
androidpn是一個基於XMPP協議的java開源Android push notification實現。它包含了完整的客戶端和服務器端。但也存在一些不足之處:
1) 好比時間過長時,就再也收不到推送的信息了。
2)性能上也不夠穩定。
3)若是將消息從服務器上推送出去,就再也不管理了,無論消息是否成功到達客戶端手機上。
若是咱們要使用androidpn,則還須要作大量的工做,須要理解XMPP協議、理解Androidpn的實現機制,須要調試內部存在的BUG。
E、使用第三方平臺
目前國內、國外有一些推送平臺可供使用,可是涉及到收費問題、保密問題、服務質量問題、擴展問題等等,又不得不是咱們望而卻步。
4、消息推送完美方案
綜合以上論述,在創建Android消息推送方面可謂方案多多,但每一款方案都有其優缺點。但不管如何,仍是本身搭建一個推送平臺是上策。由於你有、他有不如本身有。
舉個例子,在搭建自有推送平臺上建議使用《某某Android消息推送組件》。該組不只能夠拿來即用,而且還能夠提供源碼以便擴展,實現本身的特殊需求。
A、推送原理
Android消息推送組件基於XMPP協議實現Android推送。XMPP(可擴展通信和表示協議)是基於可擴展標記語言(XML)的協議,它用於即時消息(IM)以及在線探測。這個協議可能最終容許因特網用戶向因特網上的其餘任何人發送即時消息。
Android消息推送組件實現原理見下圖:
圖1-消息推送原理圖
Android消息推送組件由服務器部分和客戶端部分組成。每一部分都由XMPP協議組件和外部接口組件構成。XMPP協議組件負責服務器和Android客戶端間的鏈接管理、消息通信,外部接口組件負責接收應用系統、客戶端應用的命令,嚮應用系統發送接收到的通知消息。
Android消息組件提供基於Tomcat的服務器應用和Android開發jar包。其中基於Tomcat的服務器應用直接在Tomcat上部署便可,Android開發jar包引入Android項目便可。
B 集成方式
1)服務器部署
Android消息組件Tomcat的服務器應用直接部署在Tomcat中,端口號任意設定。
2)客戶端jar包引用
在Android項目中創建libs目錄,而後將提供的Android開發jar包複製到該目錄便可。見下圖:
圖2-jar包引入圖
3)Android項目AndroidManifest.xml文件修改
在該文件中增長如下權限:
在該文件中註冊服務:
至此,Android消息組件集成工做完成。
C、接口方式
1)服務器端接口採用基於http協議的訪問方式,採用http協議從服務器中獲取各類信息,實現通知消息的推送。
如使用如下方式和參數就能夠實現各類用戶消息的查詢:
http://localhost:8080/user.do?action=getAllUser&isOnline=&userID=&userType=&deptID=&deptName=&realName=
使用以下方式就能夠實現各類消息的推送:
http://localhost:8080/notification.do?action=pushNoti&userNames=&title=&content=
2)Android客戶端接口採用廣播機制。
消息接收:當XMPP協議組件接收到推送消息時,將按照必定格式廣播該消息,通知客戶端其餘應用接收並處理該消息。
消息發送:客戶端應用須要向服務器或者其餘客戶端發送即時消息時,只需按必定格式廣播該消息,XMPP組件就會自動接收該消息併發送到指定的其餘客戶端。
D、優點特色
1)系統集成簡單,無需複雜的設置。
2)Android客戶端應用和Android消息推送組件徹底分離,經過接口相互調用,實現模塊應用最優化。
3)客戶端通信機制採用廣播方式,給客戶端應用帶來極大的靈活性和可擴展性,能夠自由處理接收到的推送消息。
4)Android消息推送組件在服務器端具有消息存儲、消息重發、消息路由等功能,在客戶端部分具有斷線重連、、收到確認、閱讀確認、消息發送、命令執行等功能,確保消息可以推送到客戶端,同時也保證客戶端可以收到、閱讀消息。
E、 應用範圍
Android消息推送組件可在如下場景中使用:
1)用於消息推送。如:通知下達、應急指揮等。
2)用戶及時消息交互。如在線聊天、工做狀況交互等。
3)用於遠程控制。如控制遠程客戶端的狀態、數據上報等。
最後,但願轉載的朋友可以尊重做者的勞動成果,加上轉載地址。
http://bbs.hiapk.com/thread-4652657-1-1.html
【編輯推薦】