2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

2、</p><p>  關(guān)鍵字:實時預(yù)報,Android,溫度檢測,定位</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)開發(fā)的目的1</p><p>  1.2系統(tǒng)開發(fā)工具1</p><p>  1.3 項目需求分析1</p><p><b>  2.項目設(shè)計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 項目框架3</p><p>  3.Google Android平臺的相關(guān)理論3</p><p>  3.1 Google Android移動平臺下的應(yīng)用研究3</p><p>  3.2 Android關(guān)鍵技術(shù)研究4</p><p>  4.天氣預(yù)報程序設(shè)計6</p>&

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

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

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

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

12、展的現(xiàn)實性作用,有巨大的實用價值。雖然該技術(shù)在Android平臺已經(jīng)比較成熟,但是通過該軟件的開發(fā)仍然能幫助我更好的認(rèn)識Android系統(tǒng)的工作原理。</p><p><b>  系統(tǒng)開發(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(用來模擬安卓手機(jī)中的溫度傳感器)</p><p>  1.3 項目需求分析</p><p>  (1) 系統(tǒng)能夠通過手機(jī)精確定位全國各個城市未來幾天的天氣情況</p><p>  (2) 系統(tǒng)具有安全性,獨立性,可靠性</p><p>  (3) 系統(tǒng)界面設(shè)計優(yōu)美,符合用戶的操作

14、習(xí)慣,且在一定程度上節(jié)省流量開銷</p><p><b>  2.項目設(shè)計</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ù),然后對數(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 項目框架</b></p><p>  圖 2.3 工程目錄</p><p>  其中GPSActi

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

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

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

19、t;  Android.location:定位以及與定位有關(guān)的一些類。</p><p>  Android.util:涉及到一些實用性的方法,例如對時間和日期進(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:提供了訪問Android中的內(nèi)容提供者的類。</p><p>  Android.telephony:提供用來與撥打電話相關(guān)的API交互的類。</p><p>  Android.view: 提供最基本的用戶界面接口框架。</p>

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

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

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

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

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

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

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

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

29、t;p>  4.天氣預(yù)報程序設(shè)計</p><p>  4.1 Android的UI界面的實現(xiàn)</p><p>  在Android中用戶界面都是布局在XML文件中的。這些XML文件放在工程/res/layout下面。這對以前熟悉java可視化編程的人來說可能有些不太習(xí)慣??赡苡腥艘蓡枮槭裁匆巡季治募旁赬ML文件里呢?其實有過web基礎(chǔ)的都應(yīng)該知道m(xù)vc框架,這是一種用于網(wǎng)站開發(fā)的

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

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

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

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

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

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

39、設(shè)定滑動的動畫。該動畫實在res\anim中設(shè)置,如圖4.4所示為左右滑動效果布局</p><p>  圖 4.4 界面滑動布局</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>  其他四個與此基本相似,在此不再列出。&l

42、t;/p><p>  當(dāng)我們定義了滑動效果之后還要在main.xml中把想要滑動的布局包含進(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>  有了這個布局之后我們就可以在主程序界面調(diào)用界面進(jìn)行切換了。主程序?qū)崿F(xiàn)觸屏監(jiān)聽接口,監(jiān)聽觸摸時的x,y坐標(biāo),以及當(dāng)手指離開時的坐標(biāo),如果兩者之間的距離大于或小于100像素,則認(rèn)為想要實現(xiàn)滑動。</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){//從左往右滑動</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ù)報系統(tǒng)最重要的當(dāng)然是如何才能有效的獲取天氣信息了,要想獲取實時的天氣信息,我們就要訪問專門提供天氣信息的網(wǎng)站把網(wǎng)站返回的信息解析出想要的信息并顯示在手機(jī)上。通過

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

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

54、ect Access Protocol),WSDL(Web Service Description Language)</p><p>  SOAP依賴于XML文檔來構(gòu)建,一條SOAP消息就是一份特定的XML文檔,SOAP主要包含三個方面的主要元素:</p><p>  <Envelope…/>根元素,該元素是必填的。其中SOAP消息用來傳遞的數(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開源組織提供的Axis1,Axis

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

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

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

59、SerializationEnvelope對象的bodyin屬性,該屬性返回一個SoapObject對象,該對象就代表了Web Service的返回消息,解析該SoapObject對象,即可獲取調(diào)用Web Service的返回值。</p><p>  基于此編寫調(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ù)報Web Services支持的洲、國內(nèi)外省份和城市信息)</p><p>  //String m

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

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

63、pe(</p><p>  SoapEnvelope.VER11);</p><p>  // 實例化SoapObject對象</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;  // 解析出每個省份</p><p>  result.add(str.split(" ")[0]);</p><p><b>  }</b></p><p>  return result;</p><p><b>  }</b></p><p&g

72、t;  通過具體的城市獲取天氣信息</p><p>  public static SoapObject getWeatherByCity(String cityName)</p><p><b>  {</b></p><p>  // 根據(jù)城市或地區(qū)名稱查詢獲得未來三天內(nèi)天氣情況、現(xiàn)在的天氣實況、天氣和生活指數(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>  接下來我們只需要對該文件解析就可以拿出我們需要

81、的數(shù)據(jù)了。然后把對應(yīng)的數(shù)據(jù)添加在相應(yīng)的地方即可。</p><p><b>  城市列表的選擇:</b></p><p>  當(dāng)我們單擊城市選擇按鈕的時候會跳出圖4.6的城市選擇界面</p><p>  圖4.6 城市選擇界面</p><p><b>  對應(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)聽器</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)聽器</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>  // 選擇城市對話框</p><p>  AlertDialog.Builder dialog = new AlertDial

96、og.Builder(this);</p><p>  dialog.setTitle("請選擇所屬城市");</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>  編寫gps定位轉(zhuǎn)換類用于定位當(dāng)前位置信息ConverUtil。由于Google SDK內(nèi)部的一個小bug,我們不能直接利用手機(jī)內(nèi)部來定位地址,必須要把當(dāng)前的經(jīng)緯度信息發(fā)送給谷歌網(wǎng)站

103、來解析。</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對象</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>  本軟件同樣實現(xiàn)了傳感器接口,可以實時監(jiān)測當(dāng)前外部溫度,增加用戶的友好體驗,主要方法為:</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ù)存儲</b></p><p>  有時候應(yīng)用程序需要有數(shù)據(jù)保存,而且這些數(shù)據(jù)都比較簡單,基本上只是一些簡單的字符串,標(biāo)量類型的值等。

116、對于這種數(shù)據(jù),Android提供了SharedPreferences進(jìn)行保存。SharedPreferences主要保存的是一些簡單的key-value對。在本程序中,我首先設(shè)置了一個判斷網(wǎng)絡(luò)狀態(tài)連通情況的方法,返回一個Boolean類型的值,如果網(wǎng)絡(luò)正常連接,則會從網(wǎng)絡(luò)刷新天氣,如果當(dāng)前網(wǎng)絡(luò)狀態(tài)不好,則會從本地保存的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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論