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