基于android平臺(tái)的天氣預(yù)報(bào)系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)畢業(yè)論文_第1頁(yè)
已閱讀1頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  基于Android平臺(tái)的天氣預(yù)報(bào)系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)</p><p>  摘要:安卓是谷歌于2008年推出的一個(gè)智能手機(jī)操作系統(tǒng),其獨(dú)特的設(shè)計(jì)模式使得開(kāi)發(fā)手機(jī)軟件變得非常簡(jiǎn)單。該論文介紹了一款安卓天氣預(yù)報(bào)的設(shè)計(jì)與實(shí)現(xiàn)過(guò)程。用戶可以通過(guò)主界面選擇城市來(lái)獲得包括風(fēng)力、風(fēng)向、紫外線強(qiáng)度等的天氣信息。基于手機(jī)的天氣預(yù)報(bào)系統(tǒng)能夠使用戶對(duì)于各地的天氣情況實(shí)時(shí)掌握,方便用戶的出行和行程安排,具有一定的實(shí)用性。

2、</p><p>  關(guān)鍵字:實(shí)時(shí)預(yù)報(bào),Android,溫度檢測(cè),定位</p><p>  The Design and Development of Weather Forecast System based on the Android System</p><p>  Abstract: Android is a Smartphone system launc

3、hed by Google in 2008, whose unique design pattern makes it easier to develop mobile phone softwares . The paper introduces the process of the design and implementation of a Android weather forecast system. Users can cho

4、ose a city what he likes from the home screen to get access to the weather information ,including wind,wind direction,strong of ultraviolet light and so on.Weather forecast system based on mobile phone enables users to t

5、ake the real-t</p><p>  Keywords: real-time forecast, Android , Temperature detection , location</p><p><b>  目錄</b></p><p><b>  1.緒論1</b></p><p&g

6、t;  1.1系統(tǒng)開(kāi)發(fā)的目的1</p><p>  1.2系統(tǒng)開(kāi)發(fā)工具1</p><p>  1.3 項(xiàng)目需求分析1</p><p><b>  2.項(xiàng)目設(shè)計(jì)2</b></p><p>  2.1 系統(tǒng)架構(gòu)圖2</p><p>  2.2 webservice網(wǎng)絡(luò)拓?fù)鋱D2<

7、/p><p>  2.3 項(xiàng)目框架3</p><p>  3.Google Android平臺(tái)的相關(guān)理論3</p><p>  3.1 Google Android移動(dòng)平臺(tái)下的應(yīng)用研究3</p><p>  3.2 Android關(guān)鍵技術(shù)研究4</p><p>  4.天氣預(yù)報(bào)程序設(shè)計(jì)6</p>&

8、lt;p>  4.1 Android的UI界面的實(shí)現(xiàn)6</p><p>  4.2歡迎界面的實(shí)現(xiàn)7</p><p>  4.3 主界面功能實(shí)現(xiàn)8</p><p>  4.4數(shù)據(jù)存儲(chǔ)19</p><p><b>  5.系統(tǒng)測(cè)試20</b></p><p>  5.1測(cè)試目的20&

9、lt;/p><p>  5.3 測(cè)試內(nèi)容和結(jié)果20</p><p>  5.4 測(cè)試結(jié)果22</p><p><b>  6.結(jié)束語(yǔ)23</b></p><p><b>  致謝24</b></p><p>  參 考 文 獻(xiàn)24</p><p>

10、;<b>  1.緒論</b></p><p><b>  系統(tǒng)開(kāi)發(fā)的目的</b></p><p>  由于智能手機(jī)的快速普及,智能操作系統(tǒng)在手機(jī)市場(chǎng)占據(jù)了很大一部分,其中以Andriod和iOS最為流行。為了讓智能手機(jī)用戶能夠隨時(shí)隨地查詢互聯(lián)網(wǎng)所提供的信息,一種非常高效的方法就是將網(wǎng)絡(luò)系統(tǒng)的功能擴(kuò)展到智能手機(jī)終端上,讓手機(jī)能夠通過(guò)移動(dòng)網(wǎng)絡(luò)訪問(wèn)W

11、eb網(wǎng)站并處理各種各樣的業(yè)務(wù)。由于在大學(xué)學(xué)習(xí)過(guò)java語(yǔ)言,并且Andriod系統(tǒng)是基于java語(yǔ)言開(kāi)發(fā)的,因此想開(kāi)發(fā)一套基于Andriod平臺(tái)的3G手機(jī)氣象軟件,并從網(wǎng)上獲取天氣預(yù)報(bào)信息。Android平臺(tái)的天氣預(yù)報(bào)軟件的開(kāi)發(fā)可以進(jìn)一步擴(kuò)大氣象信息的覆蓋面,讓廣大Android手機(jī)用戶能夠在第一時(shí)間獲取最新的天氣預(yù)報(bào)信息,以便提前預(yù)防,方便出行。同時(shí),把氣象災(zāi)害造成的損失降到最低,也可以提高公共服務(wù)質(zhì)量,更好的發(fā)揮氣象事業(yè)對(duì)經(jīng)濟(jì)社會(huì)發(fā)

12、展的現(xiàn)實(shí)性作用,有巨大的實(shí)用價(jià)值。雖然該技術(shù)在Android平臺(tái)已經(jīng)比較成熟,但是通過(guò)該軟件的開(kāi)發(fā)仍然能幫助我更好的認(rèn)識(shí)Android系統(tǒng)的工作原理。</p><p><b>  系統(tǒng)開(kāi)發(fā)工具</b></p><p>  (1) win7系統(tǒng) jdk 1.8</p><p>  (2) Eclipse 標(biāo)準(zhǔn)版及ADT插件</p>

13、<p>  (3) SensorSimulator(用來(lái)模擬安卓手機(jī)中的溫度傳感器)</p><p>  1.3 項(xiàng)目需求分析</p><p>  (1) 系統(tǒng)能夠通過(guò)手機(jī)精確定位全國(guó)各個(gè)城市未來(lái)幾天的天氣情況</p><p>  (2) 系統(tǒng)具有安全性,獨(dú)立性,可靠性</p><p>  (3) 系統(tǒng)界面設(shè)計(jì)優(yōu)美,符合用戶的操作

14、習(xí)慣,且在一定程度上節(jié)省流量開(kāi)銷</p><p><b>  2.項(xiàng)目設(shè)計(jì)</b></p><p><b>  2.1 系統(tǒng)架構(gòu)圖</b></p><p>  圖2.1 系統(tǒng)構(gòu)架圖</p><p>  2.2 webservice網(wǎng)絡(luò)拓?fù)鋱D</p><p>  本系統(tǒng)是基于提

15、供webservice服務(wù)的網(wǎng)站接收數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行解析,從中找到需要的數(shù)據(jù)。如圖2.2所示為提供webservice服務(wù)的網(wǎng)站網(wǎng)絡(luò)拓?fù)鋱D</p><p>  圖 2.2 網(wǎng)絡(luò)拓?fù)鋱D</p><p><b>  2.3 項(xiàng)目框架</b></p><p>  圖 2.3 工程目錄</p><p>  其中GPSActi

16、vity用來(lái)處理GPS定位信息,WeatherWebServiceActivity為天氣預(yù)報(bào)主界面類,WebServiceUtil用來(lái)處理從網(wǎng)站中接收的數(shù)據(jù),ConverUtil為處理經(jīng)緯度轉(zhuǎn)換的類,LoginActivity是處理登錄界面的類。</p><p>  3.Google Android平臺(tái)的相關(guān)理論</p><p>  3.1 Google Android移動(dòng)平臺(tái)下的應(yīng)用研究

17、</p><p>  Android系統(tǒng)提供給應(yīng)用程序開(kāi)發(fā)者的只是一個(gè)框架,在該平臺(tái)下開(kāi)發(fā)應(yīng)用程序必須要遵守這個(gè)框架原則。我們開(kāi)發(fā)的應(yīng)用程序其實(shí)就是在這個(gè)框架上進(jìn)行拓展,下面介紹一下android這個(gè)框架所提供的功能。</p><p>  Android.app:提供最上層的程序模型和運(yùn)行環(huán)境</p><p>  Android.content:包含對(duì)設(shè)備上的數(shù)據(jù)進(jìn)

18、行訪問(wèn)和發(fā)布的類</p><p>  Android.database:Android系統(tǒng)內(nèi)置一個(gè)輕量級(jí)的SQLite數(shù)據(jù)庫(kù)</p><p>  Android.graphics:底層的圖形庫(kù),包含顏色過(guò)濾,畫(huà)布,矩形,點(diǎn),可以用來(lái)將它們直接繪制到屏幕上。</p><p>  Android.net: 提供用來(lái)幫助訪問(wèn)網(wǎng)絡(luò)的類。</p><p&g

19、t;  Android.location:定位以及與定位有關(guān)的一些類。</p><p>  Android.util:涉及到一些實(shí)用性的方法,例如對(duì)時(shí)間和日期進(jìn)行操作。</p><p>  Android.media: 提供一些管理多種視頻,音頻的媒體接口。</p><p>  Android.os:提供了系統(tǒng)服務(wù),IPC機(jī)制和消息傳輸。</p>&l

20、t;p>  Android.opngl:提供了OpenGL的工具。</p><p>  Android.provider:提供了訪問(wèn)Android中的內(nèi)容提供者的類。</p><p>  Android.telephony:提供用來(lái)與撥打電話相關(guān)的API交互的類。</p><p>  Android.view: 提供最基本的用戶界面接口框架。</p>

21、;<p>  Addroid.webkit:提供用來(lái)調(diào)用默認(rèn)瀏覽器的接口。</p><p>  Android.widget包含各種UI元素,可以在應(yīng)用程序的布局中使用。</p><p>  3.2 Android關(guān)鍵技術(shù)研究</p><p>  Android平臺(tái)是基于java語(yǔ)言開(kāi)發(fā)的,其中主要由四大組建構(gòu)成,分別為:Activity、Servic

22、e、Broadcast Receiver、Content Provider。</p><p>  1.Activity Activity就是一個(gè)用戶界面,每一個(gè)Activity就是一個(gè)獨(dú)立的界面。比如照相機(jī)程序,實(shí)現(xiàn)一個(gè)拍照的Activity,短信也是一個(gè)Activity,撥號(hào)界面也是一個(gè)Activity等等,這些Activity都是相互獨(dú)立的,但組合在一起它們就變成一個(gè)完整功能的應(yīng)用程序了。我們可以把Act

23、ivity理解成java中的JFrame控件,不過(guò)它與JFrame的區(qū)別在于:java中的JFrame本身可以設(shè)置布局管理器,不斷的向JFrame中添加組件,但Activity只能通過(guò)setContentView(layout)方法在主界面顯示布局。 </p><p>  2.Service Service與Activity的地位是相同的,它也代表一個(gè)獨(dú)立的Android組件,Service與Activit

24、y的區(qū)別在于:Service通常在后臺(tái)運(yùn)行,它不需要與用戶進(jìn)行交互,因此Service沒(méi)有用戶界面。與Activity需要繼承Activity的基類一樣,Service同樣也需要繼承Service基類。當(dāng)一個(gè)Service組件在后臺(tái)運(yùn)行起來(lái)后,它就會(huì)和Acitivity同樣也有自己的生命周期。Service組件通常用于為一些不需要界面但是又必須在后臺(tái)運(yùn)行的程序提供服務(wù),比如音樂(lè)或者音頻播放軟件。</p><p>

25、  3. Broadcast Receiver 中文意思是廣播接收者,顧名思義它主要就是用來(lái)接收來(lái)自廣播和系統(tǒng)中的應(yīng)用程序發(fā)送的消息。在Android中廣播的用處非常廣泛,例如當(dāng)開(kāi)機(jī)后會(huì)自動(dòng)產(chǎn)生一條廣播,接收到這條廣播后系統(tǒng)就能及時(shí)的做出提示和保存數(shù)據(jù)等操作;當(dāng)電池電量低的時(shí)候系統(tǒng)也會(huì)產(chǎn)生一條廣播,這樣就能及時(shí)提示用戶進(jìn)行充電等的操作。本質(zhì)上Broadcast Receiver就是一種全局的監(jiān)聽(tīng)器,我們用它來(lái)監(jiān)聽(tīng)系統(tǒng)向應(yīng)用程序發(fā)送的廣

26、播消息?;谝陨纤鑫覀兛梢杂盟浅7奖愕膶?shí)現(xiàn)系統(tǒng)中不同組件之間的相互通信。 </p><p>  4.Content Provider 它是不同APP之間進(jìn)行交換數(shù)據(jù)的核心的API , Content Provider在系統(tǒng)中以某種URI的形式對(duì)外提供數(shù)據(jù),允許其他應(yīng)用查詢或者修改數(shù)據(jù);其他應(yīng)用程序使用Content Resolver根據(jù)URI去訪問(wèn)和操作指定的數(shù)據(jù)。事實(shí)上這里有一個(gè)簡(jiǎn)單的類比:可以把

27、Content Provider看作安卓系統(tǒng)內(nèi)部提供的一個(gè)網(wǎng)站,這個(gè)網(wǎng)站以固定的URI對(duì)外提供服務(wù);而Content Resolver可以當(dāng)成系統(tǒng)內(nèi)部的HttpClient,它可以向指定的URI發(fā)送請(qǐng)求,這種請(qǐng)求最后委托給Content Provider處理,從而實(shí)現(xiàn)對(duì)網(wǎng)站內(nèi)部數(shù)據(jù)進(jìn)行操作。</p><p><b>  3.3 小結(jié)</b></p><p>  本單元

28、主要概括了關(guān)于Android平臺(tái)的三個(gè)方面的內(nèi)容:1.Google android移動(dòng)平臺(tái)的概述2.google android移動(dòng)平臺(tái)開(kāi)發(fā)過(guò)程的研究3.Google android移動(dòng)平臺(tái)下的應(yīng)用研究,概要的介紹了Google android移動(dòng)平臺(tái)相關(guān)知識(shí),4.介紹了Android平臺(tái)下的四大組件的相關(guān)內(nèi)容。通過(guò)本章我們對(duì)Google android移動(dòng)平臺(tái)有初步的認(rèn)識(shí)和了解,為后面的開(kāi)發(fā)做了堅(jiān)實(shí)的基礎(chǔ)。</p>&l

29、t;p>  4.天氣預(yù)報(bào)程序設(shè)計(jì)</p><p>  4.1 Android的UI界面的實(shí)現(xiàn)</p><p>  在Android中用戶界面都是布局在XML文件中的。這些XML文件放在工程/res/layout下面。這對(duì)以前熟悉java可視化編程的人來(lái)說(shuō)可能有些不太習(xí)慣??赡苡腥艘蓡?wèn)為什么要把布局文件放在XML文件里呢?其實(shí)有過(guò)web基礎(chǔ)的都應(yīng)該知道m(xù)vc框架,這是一種用于網(wǎng)站開(kāi)發(fā)的

30、非常優(yōu)秀的思想,在安卓系統(tǒng)中,安卓開(kāi)發(fā)人員把用戶界面放在XML文檔中定義,這樣就可以讓XML文檔專門負(fù)責(zé)用戶UI界面設(shè)置,而java程序?qū)iT負(fù)責(zé)業(yè)務(wù)實(shí)現(xiàn),從而降低程序的耦合,便于程序的維護(hù)和擴(kuò)展,符合mvc設(shè)計(jì)思想。</p><p>  在XML中Android開(kāi)發(fā)人員放置了很多我們經(jīng)常用到的一些組件,比如view,Button,EditText等,通過(guò)這些系統(tǒng)提供的控件,我們可以開(kāi)發(fā)出我們想要的程序界面來(lái)。&l

31、t;/p><p>  Layout 是一類特殊的ViewGroup 控件,它們本身并不顯示任何的內(nèi)容,存在的惟一原因就是其中的內(nèi)部結(jié)構(gòu),能夠更好地?cái)[放它的子控件。比如Linearlayout(線性布局),可將子控件按水平或垂直方向按順序排列下去;Tablelayout(表格布局),可以將子控件按照表格的形式,一枚枚放置好;Relativelayout(相對(duì)布局),實(shí)際應(yīng)用中這個(gè)布局更靈活,它可以設(shè)定各個(gè)控件之間的對(duì)齊

32、和排列關(guān)系,適合編寫(xiě)復(fù)雜的界面。有了Layout 的存在,控件和控件之間不再是獨(dú)立地存在,而是更有機(jī)地結(jié)合在一起,設(shè)定起來(lái)也更為方便。</p><p>  在本程序中布局文件我一共用到了如圖4.1所示的布局文件</p><p>  圖 4.1 布局文件圖</p><p>  其中city_detail用來(lái)顯示城市簡(jiǎn)介的信息,city_environment用來(lái)顯示當(dāng)

33、前所在城市的生活指數(shù)信息,city_layout用來(lái)顯示用來(lái)選擇城市布局,content_layout用來(lái)顯示天氣情況,gps_view用來(lái)顯示gps定位信息,login用來(lái)顯示登錄歡迎界面,main包含了用來(lái)切換的三個(gè)界面,tqyb顯示主界面布局</p><p>  4.2歡迎界面的實(shí)現(xiàn) </p><p>  考慮到程序界面的美觀效果,在進(jìn)入主界面之前我首先設(shè)置了一個(gè)用來(lái)跳轉(zhuǎn)的Acti

34、vity,并命名為L(zhǎng)oginActivity。在LoginActivity中顯示login布局</p><p>  Timer timer = new Timer();</p><p>  final Intent intent = new Intent(this,edu.njue.app.WeatherWebServiceActivity.class);</p><

35、p>  TimerTask task = new TimerTask(){</p><p><b>  @Override</b></p><p>  public void run() {</p><p>  startActivity(intent);</p><p>  LoginActivity.this.

36、finish();</p><p><b>  }</b></p><p><b>  };</b></p><p>  timer.schedule(task, 1000);</p><p><b>  }</b></p><p>  程序顯

37、示畫(huà)面一秒后會(huì)進(jìn)入主程序天氣界面,如圖4.2所示程序歡迎界面</p><p>  圖 4.2 歡迎界面圖</p><p>  3.3 主界面功能實(shí)現(xiàn)</p><p>  安裝好程序后進(jìn)入程序主界面時(shí),系統(tǒng)會(huì)顯示會(huì)的窗口。在這里我把默認(rèn)城市設(shè)置為南京,如果用戶不單擊城市選擇按鈕的時(shí)候,則會(huì)顯示的是南京近兩天的天氣情況。如圖4.3所示。第一次運(yùn)行時(shí),我是通過(guò)在手機(jī)文件系

38、統(tǒng)中判斷是否存在一個(gè)名為shared_prefs的文件來(lái)判斷是否為第一次運(yùn)行,如果存在則不是第一次運(yùn)行,系統(tǒng)會(huì)繼續(xù)執(zhí)行向下執(zhí)行代碼,如果系統(tǒng)中不存在該文件,則為第一次運(yùn)行該程序,程序彈出對(duì)話框告訴用戶。</p><p>  圖 4.3 第一次運(yùn)行效果圖</p><p>  在主程序界面,我運(yùn)用的主要是ViewFlipper組件,通過(guò)該組件可以實(shí)現(xiàn)滑動(dòng)顯示界面,不過(guò)在設(shè)置滑動(dòng)界面之前我們要先

39、設(shè)定滑動(dòng)的動(dòng)畫(huà)。該動(dòng)畫(huà)實(shí)在res\anim中設(shè)置,如圖4.4所示為左右滑動(dòng)效果布局</p><p>  圖 4.4 界面滑動(dòng)布局</p><p>  其中l(wèi)eft_in中的代碼為:</p><p>  <set xmlns:android="http://schemas.android.com/apk/res/android">

40、</p><p>  <translate android:fromXDelta="100%p" android:toXDelta="0" </p><p>  android:duration="500" /> </p><p>  <alpha android:fromAlpha

41、="0.1" android:toAlpha="1.0" </p><p>  android:duration="500" /> </p><p><b>  </set></b></p><p>  其他四個(gè)與此基本相似,在此不再列出。&l

42、t;/p><p>  當(dāng)我們定義了滑動(dòng)效果之后還要在main.xml中把想要滑動(dòng)的布局包含進(jìn)去。</p><p>  <ViewFlipper android:id="@+id/viewFlipper"</p><p>  android:layout_width="match_parent"</p><

43、p>  android:layout_height="match_parent"></p><p>  <include layout="@layout/tqyb"/></p><p><b>  <include </b></p><p>  android:id=&quo

44、t;@+id/city_envrionment"</p><p>  layout="@layout/city_environment"/></p><p>  <include android:id="@+id/city_detail"</p><p>  layout="@layout/ci

45、ty_detail"/></p><p>  </ViewFlipper>"</p><p>  有了這個(gè)布局之后我們就可以在主程序界面調(diào)用界面進(jìn)行切換了。主程序?qū)崿F(xiàn)觸屏監(jiān)聽(tīng)接口,監(jiān)聽(tīng)觸摸時(shí)的x,y坐標(biāo),以及當(dāng)手指離開(kāi)時(shí)的坐標(biāo),如果兩者之間的距離大于或小于100像素,則認(rèn)為想要實(shí)現(xiàn)滑動(dòng)。</p><p>  public boo

46、lean onTouch(View v, MotionEvent event) {</p><p>  if(event.getAction()==MotionEvent.ACTION_DOWN){</p><p>  touchDownX = event.getX();</p><p>  return true;</p><p>  }e

47、lse if(event.getAction()==MotionEvent.ACTION_UP){</p><p>  touchUpX = event.getX();</p><p>  if(touchUpX-touchDownX>100){//從左往右滑動(dòng)</p><p>  viewFlipper.setAnimation(AnimationUtils

48、.loadAnimation(this,android.R.anim.slide_in_left));</p><p>  viewFlipper.setAnimation(AnimationUtils.loadAnimation(this,android.R.anim.slide_out_right));</p><p>  viewFlipper.showPrevious();<

49、/p><p>  }else if(touchDownX-touchUpX>100){</p><p>  viewFlipper.setAnimation(AnimationUtils.loadAnimation(this, R.anim.right_in));</p><p>  viewFlipper.setAnimation(AnimationUtils.

50、loadAnimation(this,R.anim.left_out));</p><p>  viewFlipper.showNext();</p><p><b>  }</b></p><p>  return true;</p><p><b>  }</b></p><

51、p>  return false;</p><p><b>  }</b></p><p><b>  獲取天氣信息并顯示</b></p><p>  天氣預(yù)報(bào)系統(tǒng)最重要的當(dāng)然是如何才能有效的獲取天氣信息了,要想獲取實(shí)時(shí)的天氣信息,我們就要訪問(wèn)專門提供天氣信息的網(wǎng)站把網(wǎng)站返回的信息解析出想要的信息并顯示在手機(jī)上。通過(guò)

52、網(wǎng)上的搜索,我找到了一個(gè)提供webservice的網(wǎng)站:http://www.webxml.com.cn/webservices/weatherwebservice.asmx 通過(guò)向這個(gè)網(wǎng)站提供參數(shù)就可以獲取指定城市的天氣信息了,該網(wǎng)站是從中央氣象臺(tái)接收的信息,數(shù)據(jù)準(zhǔn)確可靠。每隔兩個(gè)小時(shí)更新一次天氣情況,具有很好的實(shí)時(shí)性。</p><p>  Webservice的出現(xiàn)成功的解決了不同平臺(tái)和語(yǔ)言之間進(jìn)行數(shù)據(jù)交換的

53、問(wèn)題,它主要使用XML文檔來(lái)傳遞消息,并將該消息發(fā)送給任何請(qǐng)求對(duì)象,由于不同系統(tǒng)對(duì)XML的完美支持,因此從根本上完善了跨平臺(tái)服務(wù),任何時(shí)刻、任何平臺(tái)我們可以使用任何語(yǔ)言來(lái)訪問(wèn)該Webservice服務(wù)。對(duì)于Webservice使用者而言,webservice API與任何操作平臺(tái)無(wú)關(guān),它只是以XML語(yǔ)言作為數(shù)據(jù)交換格式。</p><p>  Webservice平臺(tái)主要涉及到的技術(shù)是SOAP(Simple Obj

54、ect Access Protocol),WSDL(Web Service Description Language)</p><p>  SOAP依賴于XML文檔來(lái)構(gòu)建,一條SOAP消息就是一份特定的XML文檔,SOAP主要包含三個(gè)方面的主要元素:</p><p>  <Envelope…/>根元素,該元素是必填的。其中SOAP消息用來(lái)傳遞的數(shù)據(jù)的XML文檔以該元素作為根元素

55、</p><p>  <Header…/>元素,該元素是選填的。它包含了SOAP消息的頭信息</p><p>  <Body…/>元素,該元素是必填的。它包含所有的調(diào)用和相應(yīng)的內(nèi)容</p><p>  Java本身提供了很豐富的Web Service支持,比如Sun公司制定的JAX-WS 2規(guī)范,Apache開(kāi)源組織提供的Axis1,Axis

56、2,CXF等。我們可以使用Google公司為Android平臺(tái)開(kāi)發(fā)的專門處理Webservice信息的ksoap2-android進(jìn)行客戶端的開(kāi)發(fā)。使用該第三方包的方法為:</p><p>  1.創(chuàng)建HttpTrasportSE對(duì)象</p><p>  2.創(chuàng)建SoapSerializationEnvelope對(duì)象</p><p>  3.創(chuàng)建SoapObject

57、對(duì)象,創(chuàng)建該對(duì)象時(shí)需要傳入所要調(diào)用Web Service的命名空間</p><p>  4.如果有參數(shù)需要傳給WebService服務(wù)器端,調(diào)用SoapObject對(duì)象的addProperty(String name,Object value)方法來(lái)設(shè)置參數(shù),該方法的name參數(shù)指定參數(shù)名,value指定參數(shù)值</p><p>  5.調(diào)用SoapSerializationEnvelope

58、的setOutputSoapObject()方法,或者直接對(duì)bodyout屬性賦值,將前兩步創(chuàng)建的SoapObject對(duì)象設(shè) SoapSerializationEnvelope的傳出SOAP消息體</p><p>  6.調(diào)用對(duì)象的call()方法,并以SoapSerializationEnvelope作為參數(shù)調(diào)用遠(yuǎn)程的WebService</p><p>  7.調(diào)用完成后,訪問(wèn)Soap

59、SerializationEnvelope對(duì)象的bodyin屬性,該屬性返回一個(gè)SoapObject對(duì)象,該對(duì)象就代表了Web Service的返回消息,解析該SoapObject對(duì)象,即可獲取調(diào)用Web Service的返回值。</p><p>  基于此編寫(xiě)調(diào)用webservice服務(wù)的類WebServiceUtil</p><p><b>  返回城市列表</b>

60、;</p><p>  public static List<String> getProvinceList()</p><p><b>  {</b></p><p>  // 需要調(diào)用的方法名(獲得本天氣預(yù)報(bào)Web Services支持的洲、國(guó)內(nèi)外省份和城市信息)</p><p>  //String m

61、ethodName = "getRegionProvince";</p><p>  String methodName = "getSupportProvince";</p><p>  // 創(chuàng)建HttpTransportSE傳輸對(duì)象</p><p>  HttpTransportSE httpTranstation =

62、new HttpTransportSE(SERVICE_URL);</p><p>  httpTranstation.debug = true;</p><p>  // 使用SOAP1.1協(xié)議創(chuàng)建Envelop對(duì)象</p><p>  SoapSerializationEnvelope envelope = new SoapSerializationEnvelo

63、pe(</p><p>  SoapEnvelope.VER11);</p><p>  // 實(shí)例化SoapObject對(duì)象</p><p>  SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);</p><p>  envelope.bodyOut = soapO

64、bject;</p><p>  // 設(shè)置與.Net提供的Web Service保持較好的兼容性</p><p>  envelope.dotNet = true;</p><p><b>  try</b></p><p><b>  {</b></p><p>  //

65、 調(diào)用Web Service</p><p>  httpTranstation.call(SERVICE_NS + methodName, envelope);</p><p>  if (envelope.getResponse() != null)</p><p><b>  {</b></p><p>  //

66、獲取服務(wù)器響應(yīng)返回的SOAP消息</p><p>  SoapObject result = (SoapObject) envelope.bodyIn;</p><p>  SoapObject detail = (SoapObject) result.getProperty(methodName</p><p>  + "Result");&l

67、t;/p><p>  // 解析服務(wù)器響應(yīng)的SOAP消息。</p><p>  return parseProvinceOrCity(detail);</p><p><b>  }</b></p><p>  } catch (Exception e)</p><p><b>  {<

68、;/b></p><p>  e.printStackTrace();</p><p><b>  }</b></p><p>  return null;</p><p><b>  }</b></p><p>  解析出省份和城市,把返回的數(shù)據(jù)用split方法切割,

69、只取需要的省份數(shù)據(jù)</p><p>  private static List<String> parseProvinceOrCity(SoapObject detail)</p><p><b>  {</b></p><p>  ArrayList<String> result = new ArrayList<

70、String>();</p><p>  for (int i = 0; i < detail.getPropertyCount(); i++)</p><p><b>  {</b></p><p>  String str = detail.getProperty(i).toString();</p><p&

71、gt;  // 解析出每個(gè)省份</p><p>  result.add(str.split(" ")[0]);</p><p><b>  }</b></p><p>  return result;</p><p><b>  }</b></p><p&g

72、t;  通過(guò)具體的城市獲取天氣信息</p><p>  public static SoapObject getWeatherByCity(String cityName)</p><p><b>  {</b></p><p>  // 根據(jù)城市或地區(qū)名稱查詢獲得未來(lái)三天內(nèi)天氣情況、現(xiàn)在的天氣實(shí)況、天氣和生活指數(shù)</p><

73、;p>  //String methodName = "getWeather";</p><p>  String methodName = "getWeatherbyCityName";</p><p>  HttpTransportSE httpTranstation = new HttpTransportSE(SERVICE_URL);&

74、lt;/p><p>  httpTranstation.debug = true;</p><p>  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);</p><p>  SoapObject soapObject = new SoapObje

75、ct(SERVICE_NS, methodName);</p><p>  //soapObject.addProperty("theCityCode", cityName);</p><p>  soapObject.addProperty("theCityName",cityName);</p><p>  envelop

76、e.bodyOut = soapObject;</p><p>  envelope.dotNet = true;</p><p><b>  try</b></p><p><b>  {</b></p><p>  // 調(diào)用Web Service</p><p>  h

77、ttpTranstation.call(SERVICE_NS + methodName, envelope);</p><p>  if (envelope.getResponse() != null)</p><p><b>  {</b></p><p>  // 獲取服務(wù)器響應(yīng)返回的SOAP消息</p><p> 

78、 SoapObject result = (SoapObject) envelope.bodyIn;</p><p>  SoapObject detail = (SoapObject) result.getProperty(methodName+ "Result");</p><p>  // 解析服務(wù)器響應(yīng)的SOAP消息。</p><p> 

79、 return detail;</p><p><b>  }</b></p><p>  } catch (Exception e)</p><p><b>  {</b></p><p>  e.printStackTrace();</p><p><b> 

80、 }</b></p><p>  return null;</p><p><b>  }</b></p><p>  如圖4.5所示為調(diào)用此方法后返回的為XML文檔</p><p>  圖 4.5 網(wǎng)站返回XML文檔</p><p>  接下來(lái)我們只需要對(duì)該文件解析就可以拿出我們需要

81、的數(shù)據(jù)了。然后把對(duì)應(yīng)的數(shù)據(jù)添加在相應(yīng)的地方即可。</p><p><b>  城市列表的選擇:</b></p><p>  當(dāng)我們單擊城市選擇按鈕的時(shí)候會(huì)跳出圖4.6的城市選擇界面</p><p>  圖4.6 城市選擇界面</p><p><b>  對(duì)應(yīng)的方法為</b></p>&

82、lt;p>  public void show_dialog(int cityId)</p><p><b>  {</b></p><p>  city_text = (TextView)findViewById(R.id.city_text);</p><p>  switch (cityId)</p><p>

83、;<b>  {</b></p><p>  case CITY:</p><p>  // 取得city_layout.xml中的視圖</p><p>  final View view = LayoutInflater.from(this).inflate(</p><p>  R.layout.city_layou

84、t, null);</p><p>  // 省份Spinner</p><p>  province_spinner = (Spinner) view.findViewById(R.id.province_spinner);</p><p>  // 城市Spinner</p><p>  city_spinner = (Spinner)

85、view.findViewById(R.id.city_spinner);</p><p>  provinces = WebServiceUtil.getProvinceList();</p><p>  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.si

86、mple_spinner_item, provinces);</p><p>  adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);</p><p>  province_spinner.setAdapter(adapter);</p><p>  // 省份

87、Spinner監(jiān)聽(tīng)器</p><p>  province_spinner.setOnItemSelectedListener(new OnItemSelectedListener()</p><p><b>  {</b></p><p><b>  @Override</b></p><p> 

88、 public void onItemSelected(AdapterView<?> view,</p><p>  View parent, int position, long id)</p><p><b>  {</b></p><p>  citys = WebServiceUtil.getCityListByProvin

89、ce(provinces.get(position));</p><p>  ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(WeatherWebServiceActivity.this,</p><p>  android.R.layout.simple_spinner_item, citys);&

90、lt;/p><p>  adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);</p><p>  city_spinner.setAdapter(adapter1);</p><p><b>  }</b></p><p&

91、gt;<b>  @Override</b></p><p>  public void onNothingSelected(AdapterView<?> arg0)</p><p><b>  {</b></p><p><b>  }</b></p><p>&

92、lt;b>  });</b></p><p>  // 城市Spinner監(jiān)聽(tīng)器</p><p>  city_spinner.setOnItemSelectedListener(new OnItemSelectedListener()</p><p><b>  {</b></p><p><b

93、>  @Override</b></p><p>  public void onItemSelected(AdapterView<?> arg0, View arg1,</p><p>  int position, long arg3)</p><p><b>  {</b></p><p&

94、gt;  city_str = citys.get(position);</p><p><b>  }</b></p><p><b>  @Override</b></p><p>  public void onNothingSelected(AdapterView<?> arg0)</p>

95、<p><b>  {</b></p><p><b>  }</b></p><p><b>  });</b></p><p>  // 選擇城市對(duì)話框</p><p>  AlertDialog.Builder dialog = new AlertDial

96、og.Builder(this);</p><p>  dialog.setTitle("請(qǐng)選擇所屬城市");</p><p>  dialog.setView(view);</p><p>  dialog.setPositiveButton("確定",new DialogInterface.OnClickListener(

97、)</p><p><b>  {</b></p><p><b>  @Override</b></p><p>  public void onClick(DialogInterface dialog, int which)</p><p><b>  {</b></

98、p><p>  city_text.setText(city_str);</p><p>  writeSharedPreference(city_str);</p><p>  refresh(city_str);</p><p>  checkWeather(city_str);</p><p><b>  

99、}</b></p><p><b>  });</b></p><p>  dialog.setNegativeButton("取消",new DialogInterface.OnClickListener()</p><p><b>  {</b></p><p>

100、<b>  @Override</b></p><p>  public void onClick(DialogInterface dialog, int which)</p><p><b>  {</b></p><p>  dialog.dismiss();</p><p><b>

101、  }</b></p><p><b>  });</b></p><p>  dialog.show();</p><p><b>  break;</b></p><p><b>  default:</b></p><p><b&

102、gt;  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  編寫(xiě)gps定位轉(zhuǎn)換類用于定位當(dāng)前位置信息ConverUtil。由于Google SDK內(nèi)部的一個(gè)小bug,我們不能直接利用手機(jī)內(nèi)部來(lái)定位地址,必須要把當(dāng)前的經(jīng)緯度信息發(fā)送給谷歌網(wǎng)站

103、來(lái)解析。</p><p>  public static String getAddress(double longitude,double latitude){</p><p><b>  //</b></p><p>  HttpClient client = new DefaultHttpClient();</p><

104、p>  //Get方法得到內(nèi)容</p><p>  HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/"</p><p>  + "geocode/json?latlng="</p><p>  + latitude + ","

105、; + longitude </p><p>  + "&sensor=false&region=cn");</p><p>  StringBuilder sb = new StringBuilder();</p><p><b>  try{</b></p><p>  HttpR

106、esponse response = client.execute(httpGet);</p><p>  HttpEntity entity = response.getEntity();</p><p>  //獲取服務(wù)器響應(yīng)的字符串</p><p>  InputStream is = entity.getContent();</p><p

107、><b>  int b;</b></p><p>  while((b = is.read())!=-1){</p><p>  sb.append((char)b);</p><p><b>  }</b></p><p>  //把服務(wù)器相應(yīng)的字符串轉(zhuǎn)化為JSon對(duì)象</p>

108、<p>  JSONObject jsonObj = new JSONObject(sb.toString());</p><p>  //解析出相應(yīng)結(jié)果中的地址信息</p><p>  String s1 = jsonObj.getJSONArray("results").getJSONObject(0).getString("formatte

109、d_address");</p><p>  String s2 = s1.split(",")[3];</p><p>  Log.i("start", s2);</p><p>  return jsonObj.getJSONArray("results").getJSONObject(0).

110、getString("formatted_address");</p><p>  }catch(Exception e){</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p>  return null;</p><

111、;p><b>  }</b></p><p>  本軟件同樣實(shí)現(xiàn)了傳感器接口,可以實(shí)時(shí)監(jiān)測(cè)當(dāng)前外部溫度,增加用戶的友好體驗(yàn),主要方法為:</p><p>  public void onSensorChanged(SensorEvent event) {</p><p>  // TODO Auto-generated method st

112、ub</p><p>  float[] values = event.values;</p><p>  //真機(jī)上獲取觸發(fā)event的傳感器類型</p><p>  //int sensorType = event.sensor.getType();</p><p>  //模擬器上獲取觸發(fā)event的傳感器類型</p>&

113、lt;p>  int sensorType = event.type;</p><p>  StringBuilder sb = null;</p><p>  switch(sensorType){</p><p>  case Sensor.TYPE_TEMPERATURE:</p><p>  sb = new StringBui

114、lder();</p><p>  sb.append(values[0]);</p><p>  sb.append("℃");</p><p>  et.setText(sb.toString());</p><p><b>  break;</b></p><p>  d

115、efault:break;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  4.4數(shù)據(jù)存儲(chǔ)</b></p><p>  有時(shí)候應(yīng)用程序需要有數(shù)據(jù)保存,而且這些數(shù)據(jù)都比較簡(jiǎn)單,基本上只是一些簡(jiǎn)單的字符串,標(biāo)量類型的值等。

116、對(duì)于這種數(shù)據(jù),Android提供了SharedPreferences進(jìn)行保存。SharedPreferences主要保存的是一些簡(jiǎn)單的key-value對(duì)。在本程序中,我首先設(shè)置了一個(gè)判斷網(wǎng)絡(luò)狀態(tài)連通情況的方法,返回一個(gè)Boolean類型的值,如果網(wǎng)絡(luò)正常連接,則會(huì)從網(wǎng)絡(luò)刷新天氣,如果當(dāng)前網(wǎng)絡(luò)狀態(tài)不好,則會(huì)從本地保存的XML文件中讀取緩存的天氣,方便用戶進(jìn)行查看。</p><p>  判斷網(wǎng)絡(luò)狀態(tài)的方法:<

117、/p><p>  //判斷網(wǎng)絡(luò)類型是否為3G網(wǎng)絡(luò)</p><p>  public boolean isNetwork(){</p><p>  ConnectivityManager connectivityManager = (ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVI

118、CE);</p><p>  NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();</p><p>  if(networkInfo!=null){</p><p>  return networkInfo.isAvailable();</p><p>&l

119、t;b>  }</b></p><p>  return false;</p><p><b>  }</b></p><p>  //判斷是否為WIFI連接</p><p>  public boolean isWIFINetwork(){</p><p>  Connect

120、ivityManager connectivityManager = (ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);</p><p>  if(connectivityManager == null){</p><p>  return false;</p><p>

121、<b>  }else{</b></p><p>  NetworkInfo[] info = connectivityManager.getAllNetworkInfo();</p><p>  if(info!=null){</p><p>  for(int i=0;i<info.length;i++){</p>&l

122、t;p>  if(info[i].getTypeName().equals("WIFI")&&info[i].isConnected()){</p><p>  return true;</p><p><b>  }</b></p><p><b>  }</b></p&g

123、t;<p><b>  }</b></p><p><b>  }</b></p><p>  return false;</p><p><b>  }</b></p><p>  在oncreate方法中,首先判斷當(dāng)前連接情況if(isNetWork()||i

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論