劉平
(西安財(cái)經(jīng)學(xué)院 網(wǎng)絡(luò)與現(xiàn)代教育技術(shù)中心,陜西 西安710061)
為了讓手機(jī)用戶能夠在任何時(shí)候 (Anytime)、任何地方(Anywhere)、以任何方式(Anyway)查詢企業(yè)所提供的服務(wù),一種高效的辦法就是將應(yīng)用系統(tǒng)的功能拓展到手機(jī)終端,手機(jī)通過移動(dòng)網(wǎng)和互聯(lián)網(wǎng)訪問企業(yè)Web網(wǎng)站并處理各項(xiàng)業(yè)務(wù)(移動(dòng)商務(wù)系統(tǒng))。從市場的角度來講,將企業(yè)提供的服務(wù)通過現(xiàn)代的先進(jìn)技術(shù)拓展到手機(jī)終端,是一項(xiàng)具有極大潛在的市場需求。由此可見,能夠給手機(jī)終端提供有效、便捷和清晰地訪問Web服務(wù)器數(shù)據(jù)的方法在實(shí)際中非常有用。隨著3G網(wǎng)絡(luò)的使用,移動(dòng)終端不再僅是通訊網(wǎng)絡(luò)的終端,還將成為互聯(lián)網(wǎng)的終端。因此,移動(dòng)終端的應(yīng)用軟件和需要的服務(wù)將會(huì)有很大的發(fā)展空間。Google為此于2007年11月推出了一個(gè)專為移動(dòng)設(shè)備設(shè)計(jì)的軟件平臺(tái)——Android,它是一套真正意義上的開放性移動(dòng)設(shè)備綜合平臺(tái),其包括操作系統(tǒng)、中間件和一些關(guān)鍵的平臺(tái)應(yīng)用(見圖1)。Android最大特點(diǎn)在于它是一個(gè)開放的體系架構(gòu),具有非常好的開發(fā)和調(diào)試環(huán)境,而且還支持各種可擴(kuò)展的用戶體驗(yàn),Android里面包含非常豐富的圖形組建,多媒體支持功能和非常強(qiáng)大的瀏覽器[1]。Android平臺(tái)的開放性等特點(diǎn)既能促進(jìn)技術(shù)(包括平臺(tái)自身)的創(chuàng)新,又有助于降低開發(fā)成本,還可以使運(yùn)營商能非常方便地制定特色化產(chǎn)品,因此,它具有很大的市場發(fā)展?jié)摿?。谷歌的Android手機(jī)操作系統(tǒng)在發(fā)布以后,每年的Android手機(jī)上市速度驚人,預(yù)計(jì)在不久將來大有占據(jù)手機(jī)大份額市場的可能,Android手機(jī)應(yīng)用程序是以XML文件作為其界面和數(shù)據(jù)的描述文件,對于每一個(gè)組件和數(shù)據(jù)都有唯一的R.java文件標(biāo)識(shí),根據(jù)這些標(biāo)識(shí)來加載和確定組件對象,進(jìn)而通過事件來驅(qū)動(dòng)事務(wù),Android的重要技術(shù)是提供了一套API來解析這些XML描述文件,編寫的程序緊湊、數(shù)據(jù)安全,界面豐富,交互模式多樣化,應(yīng)用程序架構(gòu)清晰,同時(shí)也比較抽象,對開發(fā)人員要求比較高。但是由于Android發(fā)布的是新技術(shù),難免在實(shí)際應(yīng)用中還存在發(fā)展的空間,有些方面還需要進(jìn)一步完善,需要在市場中不斷開發(fā)新的技術(shù)結(jié)合Android提供的API,將開發(fā)的應(yīng)用程序更加安全、完美和有效。為此,筆者經(jīng)過對Android提供的API訪問Web服務(wù)器進(jìn)行數(shù)據(jù)通信進(jìn)行了系統(tǒng)研究,認(rèn)為Android提供的技術(shù)在框架上很大的優(yōu)勢,但在具體取數(shù)據(jù)和發(fā)數(shù)據(jù)的細(xì)節(jié)上還需要增加新的技術(shù)來彌補(bǔ)。為此,本文筆者就開發(fā)Android手機(jī)軟件過程中創(chuàng)建的數(shù)據(jù)交換和提取不同類型數(shù)據(jù)的方法和過程進(jìn)行了闡述,為開發(fā)者提供參考。
圖1 Android系統(tǒng)架構(gòu)圖Fig.1 Android system architecture
大多數(shù)中間件技術(shù)開發(fā)人員熟悉如何用計(jì)算機(jī)瀏覽器訪問互聯(lián)網(wǎng),瀏覽器的主要作用是給互聯(lián)網(wǎng)的Web服務(wù)器提交數(shù)據(jù)、驗(yàn)證數(shù)據(jù)和解析顯示數(shù)據(jù)。其工作原理是通過Http協(xié)議,提交數(shù)據(jù)用GET或者POST方法,客戶端的數(shù)據(jù)通過瀏覽器網(wǎng)頁提交給Web應(yīng)用服務(wù)器,應(yīng)用服務(wù)器通過Web頁面接收各種不同類型數(shù)據(jù),將數(shù)據(jù)通過服務(wù)器的Servlet子類HttpServlet對象提交給服務(wù)器端處理邏輯,服務(wù)器邏輯將接收到的數(shù)據(jù)按照客戶端的要求在Web服務(wù)器端進(jìn)行運(yùn)算,再將運(yùn)算的結(jié)果返回給客戶端瀏覽器進(jìn)行解析和顯示。這里關(guān)鍵是Web服務(wù)器端的Servlet,它是服務(wù)器和客戶端交互數(shù)據(jù)的服務(wù)器端端口,即所有客戶端的數(shù)據(jù)都要通過Servlet提交給Web服務(wù)器,所有要返回給客戶端的數(shù)據(jù)都要通過Web服務(wù)器端的Servlet響應(yīng)給客戶端。在實(shí)際應(yīng)用的服務(wù)器端,創(chuàng)建Servlet的子類對象HttpServlet[2](HttpServletRequest和HttpServletResponse),分別用來接收客戶端的數(shù)據(jù)和將數(shù)據(jù)返回給客戶端。
現(xiàn)在的問題就在Android手機(jī)終端,如何能夠把客戶的數(shù)據(jù)通過手機(jī)界面提交給Web服務(wù)器?Android手機(jī)終端訪問Web服務(wù)器的技術(shù)架構(gòu)是怎樣的?又如何能夠在手機(jī)終端把Web服務(wù)器響應(yīng)的數(shù)據(jù)按照服務(wù)器的不同數(shù)據(jù)類型恢復(fù)原型?這就是下面要解決的問題。
以實(shí)際開發(fā)的Android手機(jī)終端登錄功能為案例介紹如何利用Sun公司提供的java數(shù)據(jù)流和過濾流結(jié)合Android提供的API提取Web服務(wù)器端不同類型的數(shù)據(jù)。
1)首先引用所需要的各種API 在Android手機(jī)終端開發(fā)應(yīng)用程序時(shí),首先需要利用Google和Sun公司提供的必要類包(API),包括Http通信協(xié)議下的類org.apache.http.*手機(jī)端端類org.apache.http.client.*消息類org.apache.http.message.*數(shù)據(jù)流類java.io.*交互界面類java.util.*,android.app.Activity操作描述類android.content.*鍵值處理類android.os.Bundle;日志類android.util.Log顯示組件類android.view.*和界面類android.widget.*等。
2)定義訪問網(wǎng)站的URL
3)創(chuàng)建Android程序界面類 創(chuàng)建一個(gè)手機(jī)界面,需要繼承Android提供的Activity類,在該類中創(chuàng)建提交給Web服務(wù)器的數(shù)據(jù)的HttpPost對象,覆蓋Activity類的方法on-Create(Bundle b),創(chuàng)建事件監(jiān)聽器 OnClickListener對象,在其中實(shí)現(xiàn)onClick(View v)方法,再把該事件監(jiān)聽器注冊到相應(yīng)的事件源loginButton上。主要代碼如下:
4)創(chuàng)建HttpPost對象 HttpPost對象的主要作用是將Android手機(jī)端的數(shù)據(jù)提交給Web應(yīng)用服務(wù)器,為此Android提供了很好的API,這里就利用Android和Sun公司提供的這些類把需要提交給服務(wù)器的數(shù)據(jù)(NameValuePair對象)保存到一個(gè)List對象中,主要代碼如下:
5)設(shè)置數(shù)據(jù)編碼方式 Android手機(jī)在將準(zhǔn)備好的數(shù)據(jù)發(fā)送到Web服務(wù)器之前,需要對數(shù)據(jù)的編碼進(jìn)行規(guī)定,這樣服務(wù)器在接收到這些數(shù)據(jù)后,就會(huì)根據(jù)發(fā)送過去的文字編碼處理和顯示,代碼如下:
6)提交HttpPost對象和獲取服務(wù)器HttpResponse響應(yīng)數(shù)據(jù) 完成前面的工作,就該將數(shù)據(jù)提交給Web應(yīng)用服務(wù)器了,在應(yīng)用服務(wù)接收Android手機(jī)提交的數(shù)據(jù)后,經(jīng)過處理,將要返回(響應(yīng))給Android手機(jī)的數(shù)據(jù)打包到一個(gè)HttpResponse對象中,發(fā)回給手機(jī),代碼如下:
到此,Android平臺(tái)的通信任務(wù)已完成,即將Web服務(wù)器相應(yīng)過來的數(shù)據(jù)交給了httpResponse對象,剩下來的工作就是如何將Web服務(wù)器響應(yīng)過來的數(shù)據(jù)從httpResponse對象中取出。
1)獲取響應(yīng)服務(wù)器的數(shù)據(jù) 從Web服務(wù)器響應(yīng)到手機(jī)終端的數(shù)據(jù)一般打包在一個(gè)字節(jié)數(shù)組中,關(guān)鍵是這個(gè)字節(jié)數(shù)組中可能包含了各種不同的數(shù)據(jù)類型,為此,需要采取Java數(shù)據(jù)流和過濾流的方法從字節(jié)數(shù)據(jù)中取出各種類型的數(shù)據(jù),這是本文介紹的關(guān)鍵技術(shù),代碼如下:
將字節(jié)數(shù)組中的數(shù)據(jù)還原成原來的各種數(shù)據(jù)類型 ,代碼如下:
到此手機(jī)終端從Web服務(wù)器獲取了所有類型的數(shù)據(jù),剩下的任務(wù)就是將這些數(shù)據(jù)進(jìn)一步交給Android手機(jī)終端View組件[3],在手機(jī)界面上顯示給用戶,這方面的內(nèi)容不再贅述。
在Android手機(jī)終端發(fā)送請求后,接收請求的Web服務(wù)器端會(huì)根據(jù)請求的數(shù)據(jù)信息進(jìn)行運(yùn)算,然后把運(yùn)算結(jié)果響應(yīng)給手機(jī)客戶端。下面介紹Web服務(wù)器如何實(shí)現(xiàn)這一過程的。
1)引用所需API 在Web端開發(fā)應(yīng)用程序時(shí),首先需要利用Sun公司提供的必要類包(API),包括數(shù)據(jù)流類java.io.*交互界面類java.util.*數(shù)據(jù)通信端口類javax.servlet.*通信協(xié)議類javax.servlet.http.*用Spring架構(gòu)通過XML文件注入數(shù)據(jù) 對 象 類 org.springframework.web.context.*,org.springframework.web.context.support.*service.CustomerService等。
2)創(chuàng)建Servlet類數(shù)據(jù)端口 創(chuàng)建Servlet對象就是創(chuàng)建了Web應(yīng)用服務(wù)器和連接互聯(lián)網(wǎng)上所用客戶端通信設(shè)備的數(shù)據(jù)接收和發(fā)送端口,主要代碼如下:
3)訪問持久層檢索數(shù)據(jù) 這里應(yīng)用已經(jīng)完善的Spring管理事務(wù)的對象方法來獲取持久層的數(shù)據(jù),主要代碼如下:
4)創(chuàng)建輸出流數(shù)據(jù)流對象 這里創(chuàng)建的輸出流對象主要是把響應(yīng)的數(shù)據(jù)發(fā)送到手機(jī)端,由于可能是不同類型的數(shù)據(jù),所以采用DataOutputStream對象來處理,用輸出過濾流對象[4]將不同類型的數(shù)據(jù)返回手機(jī)終端,主要代碼如下:
Web應(yīng)用服務(wù)器端用到的是SSH架構(gòu)[5]技術(shù),服務(wù)器的業(yè)務(wù)邏輯已經(jīng)成熟,只需要將Spring的業(yè)務(wù)通過前述的Servlet進(jìn)行封裝,就可以將所有的Spring管理的事物業(yè)務(wù)通過Servlet和Android手機(jī)進(jìn)行交互,方法是在Spring的ApplicationContext.xml文件中增加下面的配置即可。ApplicationContext.xml文件主要配置如下:
這樣服務(wù)器響應(yīng)給手機(jī)終端的數(shù)據(jù)處理部分完畢,一次交互過程完成。
Android提供的API僅僅把從Web服務(wù)器中的數(shù)據(jù)響應(yīng)到手機(jī)終端的HttpResponse對象中,接著將該對象中的數(shù)據(jù)轉(zhuǎn)化成字節(jié)數(shù)組,由于響應(yīng)過來的數(shù)據(jù)可能是各種不同的類型,都包含在該字節(jié)數(shù)組中,要將自己數(shù)組中的數(shù)據(jù)還原成服務(wù)器端原有的數(shù)據(jù)類型,就要采用別的方法,于是采用了Sun公司提供的ByteArrayInputStream[6]過濾流和DataInput-Stream流綁定的方法,利用DataInputStream提供的各種readXxx()方法,就可以把Web服務(wù)器端發(fā)過來的不同數(shù)據(jù)類型Xxx數(shù)據(jù)提取出來,然后交給Android提供View[7]對象在界面上進(jìn)行處理。這樣就為Android手機(jī)訪問Web服務(wù)器提取不同類型的數(shù)據(jù)提供了技術(shù)構(gòu)架[8-9],為Android和其他種類的手機(jī)開發(fā)人員提供了參考。
[1]Burnette Ed.Android基礎(chǔ)教程[M].張波,高朝勤,楊選,等譯.北京:人民郵電出版社,2009.
[2]彭晨陽.java實(shí)用系統(tǒng)開發(fā)指南[M].北京:機(jī)械工業(yè)出版社,2004.
[3]王向輝,張國印,陳潔.Android應(yīng)用程序開發(fā)[M].北京:清華大學(xué)出版社,2010.
[4]廖文奎.Struts編程基礎(chǔ)與實(shí)例精講[M].北京:中國電力出版社,2006.
[5]Deitel P J,Deitel HM.Java for programmers[M].張君施,譯.北京:電子工業(yè)出版社,2010.
[6]羅會(huì)波.JSF第一步[M].北京:清華大學(xué)出版社,2007.
[7]余志龍.Google Android SDK開發(fā)范例大全 [M].北京:人民郵電出版社,2009.
[8]連晉平,劉平.Web Service技術(shù)在移動(dòng)通信商務(wù)手機(jī)終端的應(yīng)用[J].電子設(shè)計(jì)工程,2008,16(7):64-65.LIAN Jin-ping,LIU Ping.Application of Web Service in mobile-communication-business cell phone[J].Electronic Design Engineering,2008,16(7):64-65.
[9]連晉平,李梅,劉平.3G移動(dòng)商務(wù)系統(tǒng)的數(shù)據(jù)層次和狀態(tài)分析[J].電子設(shè)計(jì)工程,2010,18(2):132-133.LIAN Jin-ping,LI Mei,LIU Ping.Analysis of data levels&states of3G mobile business affairs system[J].Electronic Design Engineering,2010,18(2):132-133.