劉平
(西安財經學院 網絡與現代教育技術中心,陜西 西安710061)
為了讓手機用戶能夠在任何時候 (Anytime)、任何地方(Anywhere)、以任何方式(Anyway)查詢企業所提供的服務,一種高效的辦法就是將應用系統的功能拓展到手機終端,手機通過移動網和互聯網訪問企業Web網站并處理各項業務(移動商務系統)。從市場的角度來講,將企業提供的服務通過現代的先進技術拓展到手機終端,是一項具有極大潛在的市場需求。由此可見,能夠給手機終端提供有效、便捷和清晰地訪問Web服務器數據的方法在實際中非常有用。隨著3G網絡的使用,移動終端不再僅是通訊網絡的終端,還將成為互聯網的終端。因此,移動終端的應用軟件和需要的服務將會有很大的發展空間。Google為此于2007年11月推出了一個專為移動設備設計的軟件平臺——Android,它是一套真正意義上的開放性移動設備綜合平臺,其包括操作系統、中間件和一些關鍵的平臺應用(見圖1)。Android最大特點在于它是一個開放的體系架構,具有非常好的開發和調試環境,而且還支持各種可擴展的用戶體驗,Android里面包含非常豐富的圖形組建,多媒體支持功能和非常強大的瀏覽器[1]。Android平臺的開放性等特點既能促進技術(包括平臺自身)的創新,又有助于降低開發成本,還可以使運營商能非常方便地制定特色化產品,因此,它具有很大的市場發展潛力。谷歌的Android手機操作系統在發布以后,每年的Android手機上市速度驚人,預計在不久將來大有占據手機大份額市場的可能,Android手機應用程序是以XML文件作為其界面和數據的描述文件,對于每一個組件和數據都有唯一的R.java文件標識,根據這些標識來加載和確定組件對象,進而通過事件來驅動事務,Android的重要技術是提供了一套API來解析這些XML描述文件,編寫的程序緊湊、數據安全,界面豐富,交互模式多樣化,應用程序架構清晰,同時也比較抽象,對開發人員要求比較高。但是由于Android發布的是新技術,難免在實際應用中還存在發展的空間,有些方面還需要進一步完善,需要在市場中不斷開發新的技術結合Android提供的API,將開發的應用程序更加安全、完美和有效。為此,筆者經過對Android提供的API訪問Web服務器進行數據通信進行了系統研究,認為Android提供的技術在框架上很大的優勢,但在具體取數據和發數據的細節上還需要增加新的技術來彌補。為此,本文筆者就開發Android手機軟件過程中創建的數據交換和提取不同類型數據的方法和過程進行了闡述,為開發者提供參考。

圖1 Android系統架構圖Fig.1 Android system architecture
大多數中間件技術開發人員熟悉如何用計算機瀏覽器訪問互聯網,瀏覽器的主要作用是給互聯網的Web服務器提交數據、驗證數據和解析顯示數據。其工作原理是通過Http協議,提交數據用GET或者POST方法,客戶端的數據通過瀏覽器網頁提交給Web應用服務器,應用服務器通過Web頁面接收各種不同類型數據,將數據通過服務器的Servlet子類HttpServlet對象提交給服務器端處理邏輯,服務器邏輯將接收到的數據按照客戶端的要求在Web服務器端進行運算,再將運算的結果返回給客戶端瀏覽器進行解析和顯示。這里關鍵是Web服務器端的Servlet,它是服務器和客戶端交互數據的服務器端端口,即所有客戶端的數據都要通過Servlet提交給Web服務器,所有要返回給客戶端的數據都要通過Web服務器端的Servlet響應給客戶端。在實際應用的服務器端,創建Servlet的子類對象HttpServlet[2](HttpServletRequest和HttpServletResponse),分別用來接收客戶端的數據和將數據返回給客戶端。
現在的問題就在Android手機終端,如何能夠把客戶的數據通過手機界面提交給Web服務器?Android手機終端訪問Web服務器的技術架構是怎樣的?又如何能夠在手機終端把Web服務器響應的數據按照服務器的不同數據類型恢復原型?這就是下面要解決的問題。
以實際開發的Android手機終端登錄功能為案例介紹如何利用Sun公司提供的java數據流和過濾流結合Android提供的API提取Web服務器端不同類型的數據。
1)首先引用所需要的各種API 在Android手機終端開發應用程序時,首先需要利用Google和Sun公司提供的必要類包(API),包括Http通信協議下的類org.apache.http.*手機端端類org.apache.http.client.*消息類org.apache.http.message.*數據流類java.io.*交互界面類java.util.*,android.app.Activity操作描述類android.content.*鍵值處理類android.os.Bundle;日志類android.util.Log顯示組件類android.view.*和界面類android.widget.*等。
2)定義訪問網站的URL

3)創建Android程序界面類 創建一個手機界面,需要繼承Android提供的Activity類,在該類中創建提交給Web服務器的數據的HttpPost對象,覆蓋Activity類的方法on-Create(Bundle b),創建事件監聽器 OnClickListener對象,在其中實現onClick(View v)方法,再把該事件監聽器注冊到相應的事件源loginButton上。主要代碼如下:

4)創建HttpPost對象 HttpPost對象的主要作用是將Android手機端的數據提交給Web應用服務器,為此Android提供了很好的API,這里就利用Android和Sun公司提供的這些類把需要提交給服務器的數據(NameValuePair對象)保存到一個List對象中,主要代碼如下:

5)設置數據編碼方式 Android手機在將準備好的數據發送到Web服務器之前,需要對數據的編碼進行規定,這樣服務器在接收到這些數據后,就會根據發送過去的文字編碼處理和顯示,代碼如下:

6)提交HttpPost對象和獲取服務器HttpResponse響應數據 完成前面的工作,就該將數據提交給Web應用服務器了,在應用服務接收Android手機提交的數據后,經過處理,將要返回(響應)給Android手機的數據打包到一個HttpResponse對象中,發回給手機,代碼如下:

到此,Android平臺的通信任務已完成,即將Web服務器相應過來的數據交給了httpResponse對象,剩下來的工作就是如何將Web服務器響應過來的數據從httpResponse對象中取出。
1)獲取響應服務器的數據 從Web服務器響應到手機終端的數據一般打包在一個字節數組中,關鍵是這個字節數組中可能包含了各種不同的數據類型,為此,需要采取Java數據流和過濾流的方法從字節數據中取出各種類型的數據,這是本文介紹的關鍵技術,代碼如下:

將字節數組中的數據還原成原來的各種數據類型 ,代碼如下:

到此手機終端從Web服務器獲取了所有類型的數據,剩下的任務就是將這些數據進一步交給Android手機終端View組件[3],在手機界面上顯示給用戶,這方面的內容不再贅述。
在Android手機終端發送請求后,接收請求的Web服務器端會根據請求的數據信息進行運算,然后把運算結果響應給手機客戶端。下面介紹Web服務器如何實現這一過程的。
1)引用所需API 在Web端開發應用程序時,首先需要利用Sun公司提供的必要類包(API),包括數據流類java.io.*交互界面類java.util.*數據通信端口類javax.servlet.*通信協議類javax.servlet.http.*用Spring架構通過XML文件注入數據 對 象 類 org.springframework.web.context.*,org.springframework.web.context.support.*service.CustomerService等。
2)創建Servlet類數據端口 創建Servlet對象就是創建了Web應用服務器和連接互聯網上所用客戶端通信設備的數據接收和發送端口,主要代碼如下:

3)訪問持久層檢索數據 這里應用已經完善的Spring管理事務的對象方法來獲取持久層的數據,主要代碼如下:

4)創建輸出流數據流對象 這里創建的輸出流對象主要是把響應的數據發送到手機端,由于可能是不同類型的數據,所以采用DataOutputStream對象來處理,用輸出過濾流對象[4]將不同類型的數據返回手機終端,主要代碼如下:

Web應用服務器端用到的是SSH架構[5]技術,服務器的業務邏輯已經成熟,只需要將Spring的業務通過前述的Servlet進行封裝,就可以將所有的Spring管理的事物業務通過Servlet和Android手機進行交互,方法是在Spring的ApplicationContext.xml文件中增加下面的配置即可。ApplicationContext.xml文件主要配置如下:

這樣服務器響應給手機終端的數據處理部分完畢,一次交互過程完成。
Android提供的API僅僅把從Web服務器中的數據響應到手機終端的HttpResponse對象中,接著將該對象中的數據轉化成字節數組,由于響應過來的數據可能是各種不同的類型,都包含在該字節數組中,要將自己數組中的數據還原成服務器端原有的數據類型,就要采用別的方法,于是采用了Sun公司提供的ByteArrayInputStream[6]過濾流和DataInput-Stream流綁定的方法,利用DataInputStream提供的各種readXxx()方法,就可以把Web服務器端發過來的不同數據類型Xxx數據提取出來,然后交給Android提供View[7]對象在界面上進行處理。這樣就為Android手機訪問Web服務器提取不同類型的數據提供了技術構架[8-9],為Android和其他種類的手機開發人員提供了參考。
[1]Burnette Ed.Android基礎教程[M].張波,高朝勤,楊選,等譯.北京:人民郵電出版社,2009.
[2]彭晨陽.java實用系統開發指南[M].北京:機械工業出版社,2004.
[3]王向輝,張國印,陳潔.Android應用程序開發[M].北京:清華大學出版社,2010.
[4]廖文奎.Struts編程基礎與實例精講[M].北京:中國電力出版社,2006.
[5]Deitel P J,Deitel HM.Java for programmers[M].張君施,譯.北京:電子工業出版社,2010.
[6]羅會波.JSF第一步[M].北京:清華大學出版社,2007.
[7]余志龍.Google Android SDK開發范例大全 [M].北京:人民郵電出版社,2009.
[8]連晉平,劉平.Web Service技術在移動通信商務手機終端的應用[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移動商務系統的數據層次和狀態分析[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.