周 兵
(鄖陽師范高等??茖W(xué)校 計算機科學(xué)系,十堰 442000)
參 考 文 獻
?
基于Android數(shù)據(jù)交互系統(tǒng)的研究與實現(xiàn)
周 兵
(鄖陽師范高等??茖W(xué)校 計算機科學(xué)系,十堰 442000)
針對Android移動終端與遠程web服務(wù)器在進行數(shù)據(jù)通訊時,一是要保證通訊數(shù)據(jù)的安全、通用、快速,二是要保持移動終端的數(shù)據(jù)與服務(wù)器端的數(shù)據(jù)同步.在移動終端進行數(shù)據(jù)通訊時,一般采用XML數(shù)據(jù)格式和JSON數(shù)據(jù)格式,選擇JSON格式進行數(shù)據(jù)交互,可以提高數(shù)據(jù)的傳輸率,減少響應(yīng)時間和數(shù)據(jù)流量;而要保證移動終端數(shù)據(jù)與服務(wù)器數(shù)據(jù)同步,Android目前通常采用C2DM云端推送、MQTT、RSMB、XMPP等方法方案.通過研究發(fā)現(xiàn)該方案都有不足之處,針對持久連接(Push)方式的不足,結(jié)合國內(nèi)情況,采用極光推送第三平臺,搭建基于極光推送平臺的web 服務(wù)器與Android客戶端的數(shù)據(jù)推送來解決數(shù)據(jù)同步問題.
Android;服務(wù)器端;客戶端;消息推送
Android是Google公司推出的開源手機平臺,它由操作系統(tǒng)、中間件、用戶友好界面和應(yīng)用軟件組成[1].隨著移動互聯(lián)網(wǎng)的快速發(fā)展,智能機的普及,很多用戶都喜歡通過移動終端進行購物、娛樂等,致使移動終端應(yīng)用程序迅速發(fā)展,越來越多的web應(yīng)用程序向移動終端移植.而在進行PC端應(yīng)用程序向移動終端移植的過程中,一是需要合理的考慮系統(tǒng)資源的使用,尤其在Android系統(tǒng)中,內(nèi)存是其重要資源,Android操作系統(tǒng)允許在低內(nèi)存情況下殺死系統(tǒng)服務(wù)或一些應(yīng)用程序,此時就有可能將我們開發(fā)的應(yīng)用程序或服務(wù)殺死.因此,在進行移動終端應(yīng)用開發(fā)時,要盡量對內(nèi)存的占用進行優(yōu)化;二是要考慮在實現(xiàn)移動終端與web 服務(wù)器進行數(shù)據(jù)的通訊時,在保證數(shù)據(jù)安全快速的同時,如何實時保證數(shù)據(jù)一致,實現(xiàn)更好的用戶體驗.
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式,易于人閱讀和編寫,同時也易于計算機解析和生成,JSON采用的是完全獨立于語言的文本格式,JSON相對于XML在解析速度上要更快,而且文檔更小,非常適合在移動終端上使用.JSON主要分兩種結(jié)構(gòu):一是“名稱/值”對象集合.不同的語言理解為對象、記錄、結(jié)構(gòu)、字典、哈希表等.二是值的有序列表.大部分語言中理解為數(shù)組.典型的JSON 格式中“[]”符號對表示 JSON 數(shù)組,“{ } ”符號對表示JSON對象[2],對象與對象之間用逗號分開,名稱與值之間用冒號分開,值是String類型時用引號,“名稱/值”之間用逗號分開,所有名稱必須用引號引起來,在整個JSON結(jié)構(gòu)中只用到了這七種符號,使用起來非常方便.
2.1 輪詢(Pull)方式
輪詢方式是應(yīng)用程序采用定時與服務(wù)器連接,查詢是否有新消息到達,客戶端與服務(wù)器之間的通信需要自己實現(xiàn),例如消息排隊等.在實現(xiàn)過程中還要考慮輪詢的頻率,太慢可能導(dǎo)致某些消息的延遲,太快,則會大量消耗網(wǎng)絡(luò)帶寬和電池.而Android平臺對網(wǎng)絡(luò)帶寬和電池要求是有限制的,如果應(yīng)用程序更新頻率不是很高,不適合采用輪詢方式.
2.2 SMS(Push)方式
在Android平臺上,通過攔截SMS消息并解析消息內(nèi)容來了解服務(wù)器的意圖,客戶端根據(jù)獲取內(nèi)容進行相應(yīng)處理.這種方案的好處是,可以實現(xiàn)完全的實時操作.但是這個方案的成本較高,要向移動公司繳納一定的費用.對于不需要考慮成本的可以采用該方案進行Android的消息推送.
2.3 持久連接(Push)方式
這個方案需要客戶端與服務(wù)器端之間一直保持連接,只要服務(wù)器端有消息需要發(fā)送,直接推送就完成了,該方案可以解決由輪詢帶來的性能問題,但是還是會消耗手機的電池,同時也會耗費服務(wù)器的資源.
3.1 C2DM云端推送
在Android手機平臺上,Google提供了C2DM(Cloud to Device Messaging)是一個用來幫助開發(fā)者從服務(wù)器向Android應(yīng)用程序發(fā)送數(shù)據(jù)的服務(wù),該服務(wù)提供了一個簡單的、輕量級的機制[3],允許服務(wù)器可以通知移動應(yīng)用程序直接與服務(wù)器進行通信,以便從服務(wù)器獲取應(yīng)用程序的更新和用戶數(shù)據(jù).C2DM服務(wù)負(fù)責(zé)處理諸如消息排隊等事務(wù)并向運行于目標(biāo)設(shè)備上的應(yīng)用程序分發(fā)這些消息.但是經(jīng)過一番研究發(fā)現(xiàn),這個服務(wù)存在很大的問題:①C2DM內(nèi)置于Android的2.2系統(tǒng)上,無法兼容老的1.6到2.1系統(tǒng);②C2DM依賴Google提供的C2DM服務(wù)器,而Google已退出中國市場,這個服務(wù)在國內(nèi)已不可用;③把硬件系統(tǒng)集成在一塊了.不同的品牌的硬件廠商平臺,他們可能會把Google的這種服務(wù)去掉,尤其在國內(nèi),就有很多把Google這種原生的服務(wù)去掉.
3.2 MQTT協(xié)議實現(xiàn)Android推送
MQTT是一種基于發(fā)布/訂閱的輕量級消息傳輸協(xié)議[4],它由IBM于2001年發(fā)布,協(xié)議簡單、擴展性強、低帶寬,低耗電量,但技術(shù)不夠成熟,實現(xiàn)起來比較復(fù)雜,硬件成本比較高,不適合小型企業(yè)開發(fā).
3.3 RSMB實現(xiàn)推送
Really Small Message Broker (RSMB) ,同樣由IBM提供.其缺點是技術(shù)不夠成熟、實現(xiàn)較復(fù)雜、服務(wù)端組件不開源,部署硬件成本較高.
3.4 XMPP協(xié)議實現(xiàn)Android推送
XMPP(可擴展通訊和表示協(xié)議)是基于可擴展標(biāo)記語言(XML)的協(xié)議,該協(xié)議自由、開放、公開的,并且易于了解,而且在客戶端、服務(wù)器、組件、源碼庫等方面,都已經(jīng)各自有多種實現(xiàn),主要用于即時消息(IM)以及在線探測,但是協(xié)議復(fù)雜、冗余、費流量、費電,部署成本高[5].
3.5 使用第三方平臺JPush
第三方平臺有商用的也有免費的,可以根據(jù)實現(xiàn)情況選擇使用.關(guān)于國內(nèi)的第三方平臺有很多,目前比較不錯的有極光推送.通過極光推送服務(wù),主動、及時地向用戶發(fā)起交互,向其發(fā)送聊天消息、日程提醒、活動預(yù)告、進度提示、動態(tài)更新等服務(wù)[6].移動終端的應(yīng)用程序在開發(fā)時除了考慮內(nèi)存外,還需要考慮其電池的使用時間,用戶移動數(shù)據(jù)的使用,而極光推送采用了AlarmManager機制,用于管理里面封裝的一個獨立硬件時鐘RTC模塊,CPU在休眠的時候也可以正常運行,這樣就可以節(jié)省電量的消耗.采用極光推送進行消息推送,不用客戶端不停的去輪詢訪問服務(wù)器,節(jié)省了用戶的流量,同時也節(jié)省了系統(tǒng)資源,提高了用戶的體驗感.
在基于Android平臺數(shù)據(jù)交互系統(tǒng)實現(xiàn)過程中,有些移動客戶端數(shù)據(jù)需要及時提交給服務(wù)器,此時采用直接與遠程服務(wù)器通信方式;有些服務(wù)器中變化的數(shù)據(jù)需要實時更新(如影院購票系統(tǒng)中電影介紹、娛樂、上映電影等信息)到移動終端合法在線的用戶手機上,采用消息推送的方式,將web服務(wù)器中更新的數(shù)據(jù)推送到JPush平臺,JPush平臺再將消息推送到所有預(yù)定該消息的在線客戶端,客戶端再將推送過來的消息通過解析存儲到SQLite中并更新相應(yīng)的UI界面.
4.1 直接與遠程數(shù)據(jù)的交互的實現(xiàn)
在基于Android數(shù)據(jù)交互系統(tǒng)中,有些數(shù)據(jù)需要實時與服務(wù)器進行數(shù)據(jù)的交互,如:用戶的驗證等信息,需要實時交互的數(shù)據(jù)采用直接與服務(wù)器連接的方式來訪問,此時就需要建立客戶端的程序和web服務(wù)器端的程序,先由客戶端采用POST或GET方式將數(shù)據(jù)提交給web服務(wù)器服務(wù)器,服務(wù)器獲得客戶端請求后對該請求進行處理,將處理的結(jié)果返回給客戶端進行相應(yīng)的頁面更新.以用戶登陸為例,其實現(xiàn)步驟如下:
(1)Android客戶端的實現(xiàn)創(chuàng)建一個Activity,該Activity繼承系統(tǒng)提高Activity類,在該類中使用DefaultHttpClient類創(chuàng)建一個HttpClient對象獲得響應(yīng),使用HttpPost類創(chuàng)建一個HttpPost對象,調(diào)用HttpPost的setParams()方法添加請求參數(shù),也可以調(diào)用setEntity()方法設(shè)置請求參數(shù),HttpPost 對象的主要作用是將Android 手機端的數(shù)據(jù)提交給 Web 應(yīng)用服務(wù)器[7],接著調(diào)用HttpClient對象的execute()方法發(fā)送請求,返回一個HttpResponse對象,調(diào)用HttpResponse的getEntity()方法獲取包含了服務(wù)器響應(yīng)內(nèi)容的HttpEntity對象,通過這個對象獲取服務(wù)器的響應(yīng)內(nèi)容.部分代碼片段如下:
String url=“http://192.168.1.120:8080/android/LoginServlet”;//目標(biāo)地址
HttpClient client=new DefaultHttpClient();//創(chuàng)建HttpClient對象
HttpPost httpRequest=new HttpPost(url);//創(chuàng)建HttpPost對象
String name=userName.getText().toString().trim();
String pwd=userPwd.getText().toString().trim();//將要傳遞的參數(shù)保存到List集合中
List
params.add(new BasicNameValuePair(“userPwd”,pwd));
…………
httpRequest.setEntity(new UrlEncodedFormEntity(params,“utf-8”));//設(shè)置編碼方式
…………
HttpResponse httpResponse=client.execute(httpRequest);//執(zhí)行請求
//判斷請求是否成功
if(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
System.out.println(“登陸成功”);
//獲得數(shù)據(jù)并解析該數(shù)據(jù)
String str=EntityUtils.toString(httpResponse.getEntity());
}else{
System.out.println(“登陸失敗”);
}
(2)web 服務(wù)器端的實現(xiàn)
在web 服務(wù)器端建立一個servlet類,重寫service(HttpServletRequest request, HttpServletResponse response)方法,通過request對象中的getParameter()方法,獲得Android客戶端請求的數(shù)據(jù),將獲得的數(shù)據(jù)與數(shù)據(jù)庫中的數(shù)據(jù)進行比較,將比較的結(jié)果返回給Android客戶端,客戶端根據(jù)返回的數(shù)據(jù)進行相應(yīng)的更新操作,其部分代碼如下:
String name = request.getParameter(“userName”);//獲得傳遞過來的用戶名
String pwd = request.getParameter(“userPwd”);//獲得傳遞過來的用戶密碼
UsersDao dao = new UsersDao();//實例化UsersDao對象
boolean flag = dao.isValidUser(new Users(name, pwd));//用戶合法性驗證
//判斷用戶是否合法
if (flag) {
//合法用戶
} else {
//不合法用戶
}
4.2 極光推送平臺與客戶端交互的實現(xiàn)
當(dāng)web服務(wù)器數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生變化時,需要將變化的數(shù)據(jù)先推送到極光推送平臺,極光推送平臺再將該數(shù)據(jù)推送到所有合法的在線的移動終端,客戶端獲得極光推送平臺推送過來的數(shù)據(jù)后,通過解析,將解析的數(shù)據(jù)存儲到SQLite中并將該數(shù)據(jù)實時更新到用戶UI界面中.其實現(xiàn)步驟如下:
(1)在極光推送平臺上注冊賬號.登陸注冊頁面https://www.jpush.cn/,填寫相應(yīng)的注冊信息如:用戶名、密碼、公司名、聯(lián)系方式、Email等進行注冊;
(2)注冊成功后會將激活鏈接發(fā)送到填寫的Email郵箱中,通過該Email地址激活該用戶,激活用戶后,登陸極光推送平臺創(chuàng)建一個應(yīng)用,輸入應(yīng)用程序的名稱和應(yīng)用包名,此時最關(guān)鍵是應(yīng)用包名一定要與Android項目中的包名一致,否則當(dāng)Android客戶端部署后不能成功推送,應(yīng)用創(chuàng)建成功后會自動生成一個AppKey和一個API 主密碼,這是客戶端或web服務(wù)器端與極光推送平臺連接通信的憑證;
(3)在極光推送官網(wǎng)上分別將jpush-client-3.2.3.jar、gson-2.2.4.jar、slf4j-ap0.i-1.7.5.jar包下載下來,再在web項目中將該包導(dǎo)入到web項目中l(wèi)ibs目錄下;
(4)在web項目中相應(yīng)的servlet中添加代碼,實現(xiàn)數(shù)據(jù)庫中表的數(shù)據(jù)發(fā)生增刪改等操作時,將變化的數(shù)據(jù)以消息或通知的方式推送到極光推送平臺,極光推送平臺再將該消息或通知推送到所有合法在線的移動客戶端,其web 服務(wù)器端的主要代碼如下:
// masterSecret:極光網(wǎng)站上申請的密鑰 ;appKey:網(wǎng)站上申請應(yīng)用的appKey
//建立JpushClient類,用來發(fā)送消息的對象
JPushClient jPushClient = new JPushClient(masterSecret, appKey);
…………
//設(shè)置推送平臺、接收者、推送內(nèi)容等信息
PushPayload payload = PushPayload.newBuilder().setPlatform(Platform.all()).setAudience(Audience.all()).
setNotification(Notification.
alert(json.toJson(users))).
build();
jPushClient.sendPush(payload); //發(fā)送消息
(5)創(chuàng)建一個Android客戶端項目,該項目的包名一定要與創(chuàng)建應(yīng)用的包名一致,新建一個libs目錄,將jpush-sdk-release1.7.1.jar從官網(wǎng)上下載下來,并導(dǎo)入到Android項目的libs目錄下,修改AndroidManifest.xml,主要不同點就是需要添加
(6)添加代碼,通過cn.jpush.android.api.JPushInterface類的init()方式初始化的JPush,官方建議新建一個類,該類繼承android.app.Application;重寫onCreate()方法,在onCreate()方法中添加JPushInterface.init(getApplicationContext())代碼即可初始化JPush.
(7)使用廣播接收極光推送平臺推送過來最新信息.定義一個類,該類必須繼承android.content.BroadcastReceiver,重寫onReceive()方法,在該方法中接收推送過來的信息,并將接收到JSON格式的信息進行解析,更新相應(yīng)的UI界面.代碼如下:
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
…………
//將JSON格式數(shù)據(jù)轉(zhuǎn)換成JSON數(shù)組
JSONArray jsonArray = new JSONArray(json);
//存放轉(zhuǎn)換后的Java對象
List //對JSON數(shù)組遍歷并轉(zhuǎn)換成Java對象 JSONObject jsonObject=jsonArray.getJSONObject(i); String filmName=jsonObject.getString(“filmName”); ………… all.add(new FilmInfo (filmName,……)); }} (8)更新UI界面.Handler主要接收子線程發(fā)送的數(shù)據(jù),并對此數(shù)據(jù)進行處理,從而可以實現(xiàn)異步更新[8]. 在基于Android數(shù)據(jù)交互系統(tǒng)的實現(xiàn)過程中,采用直接連接web服務(wù)器的方式,實現(xiàn)移動客戶端與服務(wù)器的實時訪問,采用極光推送平臺將服務(wù)器中變化的數(shù)據(jù)實時推送到移動客戶端的方式,實現(xiàn)移動終端用戶界面的動態(tài)更新,保持移動終端的數(shù)據(jù)與服務(wù)器數(shù)據(jù)的同步更新,使用戶的體驗更加流暢,延長電池的使用時間,節(jié)省用戶的流量,提高系統(tǒng)的運行效率. 參 考 文 獻 [1] 王 楠,宋 飛,周華春.一種基于Android平臺的即時通信方案[J]. 計算機應(yīng)用與軟件,2013(4). [2] 龔成瑩,邢敬宏,胡銀保.基于JSON的Android移動終端與PHP及MySQL數(shù)據(jù)通信[J].工業(yè)儀表與自動化裝置, 2013(1). [3] 鄒 海,李 強,邱慧麗.基于Android C2DM服務(wù)的云端推送研究與實現(xiàn)[J]. 計算機技術(shù)與發(fā)展,2012(7). [4] 關(guān)慶余,李鴻彬,于 波. MQTT協(xié)議在Android平臺上的研究與應(yīng)用[J]. 計算機系統(tǒng)應(yīng)用,2014(4). [5] 倪紅軍.基于Android 平臺的消息推送研究與實現(xiàn)[J]. 實驗室研究與探索,2014(5). [6] 劉 平. Android手機訪問服務(wù)器的一種數(shù)據(jù)交互方法[J]. 電子設(shè)計工程,2010(9). [7] 周 兵. Android中UI線程與后臺線程交互的探討[J]. 鄖陽師范高等??茖W(xué)校學(xué)報,2013(3). Design and Implementation of Data Exchange Based on Android System ZHOU Bing (Department of Computer Science,Yunyang Teatechers' College, Shiyan 442000, China) In view of the Android mobile terminal and the remote web server in data communication, a communication is to ensure data security,popularity and speediness.The second one is to maintain the data of the mobile terminal and the server data synchronization. Data communication in a mobile terminal, the general use of XML data format and JSON data format,and selection of JSON format data exchange can improve the data transmission rate, reduce the response time and data flow.It can also ensure the mobile terminal data with the server data synchronization. Android is commonly used in current C2DM cloud push, MQTT, RSMB, XMPP method scheme.The study finds that the program has shortcomings.Persistent connection (Push) mode is insufficient. In view of the domestic situation, the aurora push third platform is used to build web server Aurora push platform and Android client data are sent to solve the data synchronization problem. Android ;server; client; message push 2015-01-18 2013鄖陽師范高等??茖W(xué)??蒲许椖?2013B16 ). 周 兵(1979-),男,講師,研究方向,計算機軟件應(yīng)用. TP31 A 1671-119X(2015)03-0046-055 結(jié) 語