版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
.../...基于Android平臺的天氣預報系統(tǒng)的設(shè)計與開發(fā)摘要:安卓是谷歌于20XX推出的一個智能手機操作系統(tǒng),其獨特的設(shè)計模式使得開發(fā)手機軟件變得非常簡單。該論文介紹了一款安卓天氣預報的設(shè)計與實現(xiàn)過程。用戶可以通過主界面選擇城市來獲得包括風力、風向、紫外線強度等的天氣信息?;谑謾C的天氣預報系統(tǒng)能夠使用戶對于各地的天氣情況實時掌握,方便用戶的出行和行程安排,具有一定的實用性。關(guān)鍵字:實時預報,Android,溫度檢測,定位TheDesignandDevelopmentofWeatherForecastSystembasedontheAndroidSystemAbstract:AndroidisaSmartphonesystemlaunchedbyGooglein2008,whoseuniquedesignpatternmakesiteasiertodevelopmobilephonesoftwares.ThepaperintroducestheprocessofthedesignandimplementationofaAndroidweatherforecastsystem.Userscanchooseacitywhathelikesfromthehomescreentogetaccesstotheweatherinformation,includingwind,winddirection,strongofultravioletlightandsoon.Weatherforecastsystembasedonmobilephoneenablesuserstotakethereal-timecontrolofweatherconditionsofallparts,thusbringinggreatconveniencetotheuser'stravelandtravelarrangements,andhasacertainpracticalityKeywords:real-timeforecast,Android,Temperaturedetection,location目錄1.緒論11.1系統(tǒng)開發(fā)的目的11.2系統(tǒng)開發(fā)工具11.3項目需求分析12.項目設(shè)計22.1系統(tǒng)架構(gòu)圖22.2webservice網(wǎng)絡(luò)拓撲圖22.3項目框架33.GoogleAndroid平臺的相關(guān)理論33.1GoogleAndroid移動平臺下的應(yīng)用研究33.2Android關(guān)鍵技術(shù)研究44.天氣預報程序設(shè)計64.1Android的UI界面的實現(xiàn)64.2歡迎界面的實現(xiàn)74.3主界面功能實現(xiàn)84.4數(shù)據(jù)存儲195.系統(tǒng)測試205.1測試目的205.3測試內(nèi)容和結(jié)果205.4測試結(jié)果226.結(jié)束語23致謝24參考文獻24...1.緒論系統(tǒng)開發(fā)的目的由于智能手機的快速普及,智能操作系統(tǒng)在手機市場占據(jù)了很大一部分,其中以Andriod和iOS最為流行。為了讓智能手機用戶能夠隨時隨地查詢互聯(lián)網(wǎng)所提供的信息,一種非常高效的方法就是將網(wǎng)絡(luò)系統(tǒng)的功能擴展到智能手機終端上,讓手機能夠通過移動網(wǎng)絡(luò)訪問Web網(wǎng)站并處理各種各樣的業(yè)務(wù)。由于在大學學習過java語言,并且Andriod系統(tǒng)是基于java語言開發(fā)的,因此想開發(fā)一套基于Andriod平臺的3G手機氣象軟件,并從網(wǎng)上獲取天氣預報信息。Android平臺的天氣預報軟件的開發(fā)可以進一步擴大氣象信息的覆蓋面,讓廣大Android手機用戶能夠在第一時間獲取最新的天氣預報信息,以便提前預防,方便出行。同時,把氣象災(zāi)害造成的損失降到最低,也可以提高公共服務(wù)質(zhì)量,更好的發(fā)揮氣象事業(yè)對經(jīng)濟社會發(fā)展的現(xiàn)實性作用,有巨大的實用價值。雖然該技術(shù)在Android平臺已經(jīng)比較成熟,但是通過該軟件的開發(fā)仍然能幫助我更好的認識Android系統(tǒng)的工作原理。系統(tǒng)開發(fā)工具<1>win7系統(tǒng)jdk1.8<2>Eclipse標準版及ADT插件<3>SensorSimulator〔用來模擬安卓手機中的溫度傳感器1.3項目需求分析<1>系統(tǒng)能夠通過手機精確定位全國各個城市未來幾天的天氣情況<2>系統(tǒng)具有安全性,獨立性,可靠性<3>系統(tǒng)界面設(shè)計優(yōu)美,符合用戶的操作習慣,且在一定程度上節(jié)省流量開銷2.項目設(shè)計2.1系統(tǒng)架構(gòu)圖點擊圖標進入系統(tǒng)系統(tǒng)點擊圖標進入系統(tǒng)系統(tǒng)顯示天氣預報主界面顯示天氣預報主界面點擊城市下拉列表點擊城市下拉列表選擇想要查詢的城市選擇想要查詢的城市跳轉(zhuǎn)到該城市的天氣信息界面跳轉(zhuǎn)到該城市的天氣信息界面界面圖2.1系統(tǒng)構(gòu)架圖2.2webservice網(wǎng)絡(luò)拓撲圖本系統(tǒng)是基于提供webservice服務(wù)的網(wǎng)站接收數(shù)據(jù),然后對數(shù)據(jù)進行解析,從中找到需要的數(shù)據(jù)。如圖2.2所示為提供webservice服務(wù)的網(wǎng)站網(wǎng)絡(luò)拓撲圖圖2.2網(wǎng)絡(luò)拓撲圖2.3項目框架圖2.3工程目錄其中GPSActivity用來處理GPS定位信息,WeatherWebServiceActivity為天氣預報主界面類,WebServiceUtil用來處理從網(wǎng)站中接收的數(shù)據(jù),ConverUtil為處理經(jīng)緯度轉(zhuǎn)換的類,LoginActivity是處理登錄界面的類。3.GoogleAndroid平臺的相關(guān)理論3.1GoogleAndroid移動平臺下的應(yīng)用研究Android系統(tǒng)提供給應(yīng)用程序開發(fā)者的只是一個框架,在該平臺下開發(fā)應(yīng)用程序必須要遵守這個框架原則。我們開發(fā)的應(yīng)用程序其實就是在這個框架上進行拓展,下面介紹一下android這個框架所提供的功能。Android.app:提供最上層的程序模型和運行環(huán)境Android.content:包含對設(shè)備上的數(shù)據(jù)進行訪問和發(fā)布的類Android.database:Android系統(tǒng)內(nèi)置一個輕量級的SQLite數(shù)據(jù)庫Android.graphics:底層的圖形庫,包含顏色過濾,畫布,矩形,點,可以用來將它們直接繪制到屏幕上。A:提供用來幫助訪問網(wǎng)絡(luò)的類。Android.location:定位以及與定位有關(guān)的一些類。Android.util:涉及到一些實用性的方法,例如對時間和日期進行操作。Android.media:提供一些管理多種視頻,音頻的媒體接口。Android.os:提供了系統(tǒng)服務(wù),IPC機制和消息傳輸。Android.opngl:提供了OpenGL的工具。Avider:提供了訪問Android中的內(nèi)容提供者的類。Android.telephony:提供用來與撥打電話相關(guān)的API交互的類。Android.view:提供最基本的用戶界面接口框架。Addroid.webkit:提供用來調(diào)用默認瀏覽器的接口。Android.widget包含各種UI元素,可以在應(yīng)用程序的布局中使用。3.2Android關(guān)鍵技術(shù)研究Android平臺是基于java語言開發(fā)的,其中主要由四大組建構(gòu)成,分別為:Activity、Service、BroadcastReceiver、ContentProvider。1.ActivityActivity就是一個用戶界面,每一個Activity就是一個獨立的界面。比如照相機程序,實現(xiàn)一個拍照的Activity,短信也是一個Activity,撥號界面也是一個Activity等等,這些Activity都是相互獨立的,但組合在一起它們就變成一個完整功能的應(yīng)用程序了。我們可以把Activity理解成java中的JFrame控件,不過它與JFrame的區(qū)別在于:java中的JFrame本身可以設(shè)置布局管理器,不斷的向JFrame中添加組件,但Activity只能通過setContentView<layout>方法在主界面顯示布局。2.ServiceService與Activity的地位是相同的,它也代表一個獨立的Android組件,Service與Activity的區(qū)別在于:Service通常在后臺運行,它不需要與用戶進行交互,因此Service沒有用戶界面。與Activity需要繼承Activity的基類一樣,Service同樣也需要繼承Service基類。當一個Service組件在后臺運行起來后,它就會和Acitivity同樣也有自己的生命周期。Service組件通常用于為一些不需要界面但是又必須在后臺運行的程序提供服務(wù),比如音樂或者音頻播放軟件。3.BroadcastReceiver中文意思是廣播接收者,顧名思義它主要就是用來接收來自廣播和系統(tǒng)中的應(yīng)用程序發(fā)送的消息。在Android中廣播的用處非常廣泛,例如當開機后會自動產(chǎn)生一條廣播,接收到這條廣播后系統(tǒng)就能及時的做出提示和保存數(shù)據(jù)等操作;當電池電量低的時候系統(tǒng)也會產(chǎn)生一條廣播,這樣就能及時提示用戶進行充電等的操作。本質(zhì)上BroadcastReceiver就是一種全局的監(jiān)聽器,我們用它來監(jiān)聽系統(tǒng)向應(yīng)用程序發(fā)送的廣播消息。基于以上所述我們可以用它非常方便的實現(xiàn)系統(tǒng)中不同組件之間的相互通信。4.ContentProvider它是不同APP之間進行交換數(shù)據(jù)的核心的API,ContentProvider在系統(tǒng)中以某種URI的形式對外提供數(shù)據(jù),允許其他應(yīng)用查詢或者修改數(shù)據(jù);其他應(yīng)用程序使用ContentResolver根據(jù)URI去訪問和操作指定的數(shù)據(jù)。事實上這里有一個簡單的類比:可以把ContentProvider看作安卓系統(tǒng)內(nèi)部提供的一個網(wǎng)站,這個網(wǎng)站以固定的URI對外提供服務(wù);而ContentResolver可以當成系統(tǒng)內(nèi)部的HttpClient,它可以向指定的URI發(fā)送請求,這種請求最后委托給ContentProvider處理,從而實現(xiàn)對網(wǎng)站內(nèi)部數(shù)據(jù)進行操作。3.3小結(jié)本單元主要概括了關(guān)于Android平臺的三個方面的內(nèi)容:1.Googleandroid移動平臺的概述2.googleandroid移動平臺開發(fā)過程的研究3.Googleandroid移動平臺下的應(yīng)用研究,概要的介紹了Googleandroid移動平臺相關(guān)知識,4.介紹了Android平臺下的四大組件的相關(guān)內(nèi)容。通過本章我們對Googleandroid移動平臺有初步的認識和了解,為后面的開發(fā)做了堅實的基礎(chǔ)。4.天氣預報程序設(shè)計4.1Android的UI界面的實現(xiàn)在Android中用戶界面都是布局在XML文件中的。這些XML文件放在工程/res/layout下面。這對以前熟悉java可視化編程的人來說可能有些不太習慣??赡苡腥艘蓡枮槭裁匆巡季治募旁赬ML文件里呢?其實有過web基礎(chǔ)的都應(yīng)該知道m(xù)vc框架,這是一種用于網(wǎng)站開發(fā)的非常優(yōu)秀的思想,在安卓系統(tǒng)中,安卓開發(fā)人員把用戶界面放在XML文檔中定義,這樣就可以讓XML文檔專門負責用戶UI界面設(shè)置,而java程序?qū)iT負責業(yè)務(wù)實現(xiàn),從而降低程序的耦合,便于程序的維護和擴展,符合mvc設(shè)計思想。在XML中Android開發(fā)人員放置了很多我們經(jīng)常用到的一些組件,比如view,Button,EditText等,通過這些系統(tǒng)提供的控件,我們可以開發(fā)出我們想要的程序界面來。Layout是一類特殊的ViewGroup控件,它們本身并不顯示任何的內(nèi)容,存在的惟一原因就是其中的內(nèi)部結(jié)構(gòu),能夠更好地擺放它的子控件。比如Linearlayout〔線性布局,可將子控件按水平或垂直方向按順序排列下去;Tablelayout〔表格布局,可以將子控件按照表格的形式,一枚枚放置好;Relativelayout〔相對布局,實際應(yīng)用中這個布局更靈活,它可以設(shè)定各個控件之間的對齊和排列關(guān)系,適合編寫復雜的界面。有了Layout的存在,控件和控件之間不再是獨立地存在,而是更有機地結(jié)合在一起,設(shè)定起來也更為方便。 在本程序中布局文件我一共用到了如圖4.1所示的布局文件圖4.1布局文件圖其中city_detail用來顯示城市簡介的信息,city_environment用來顯示當前所在城市的生活指數(shù)信息,city_layout用來顯示用來選擇城市布局,content_layout用來顯示天氣情況,gps_view用來顯示gps定位信息,login用來顯示登錄歡迎界面,main包含了用來切換的三個界面,tqyb顯示主界面布局4.2歡迎界面的實現(xiàn)考慮到程序界面的美觀效果,在進入主界面之前我首先設(shè)置了一個用來跳轉(zhuǎn)的Activity,并命名為LoginActivity。在LoginActivity中顯示login布局Timertimer=newTimer<>;finalIntentintent=newIntent<this,edu.njue.app.WeatherWebServiceActivity.class>; TimerTasktask=newTimerTask<>{@Overridepublicvoidrun<>{ startActivity<intent>; LoginActivity.this.finish<>; } }; timer.schedule<task,1000>; }程序顯示畫面一秒后會進入主程序天氣界面,如圖4.2所示程序歡迎界面圖4.2歡迎界面圖4.3主界面功能實現(xiàn)第一次安裝好進入程序界面時,系統(tǒng)會顯示"本程序是第一次運行,請選擇想要了解的城市"的窗口。在這里我把默認城市設(shè)置為XX,如果用戶不單擊城市選擇按鈕的時候,則會顯示的是XX近兩天的天氣情況。如圖4.3所示。第一次運行時,我是通過在手機文件系統(tǒng)中判斷是否存在一個名為shared_prefs的文件來判斷是否為第一次運行,如果存在則不是第一次運行,系統(tǒng)會繼續(xù)執(zhí)行向下執(zhí)行代碼,如果系統(tǒng)中不存在該文件,則為第一次運行該程序,程序彈出對話框告訴用戶。圖4.3第一次運行效果圖在主程序界面,我運用的主要是ViewFlipper組件,通過該組件可以實現(xiàn)滑動顯示界面,不過在設(shè)置滑動界面之前我們要先設(shè)定滑動的動畫。該動畫實在res\anim中設(shè)置,如圖4.4所示為左右滑動效果布局圖4.4界面滑動布局其中l(wèi)eft_in中的代碼為:<setxmlns:android=/apk/res/android"><translateandroid:fromXDelta="100%p"android:toXDelta="0"android:duration="500"/><alphaandroid:fromAlpha="0.1"android:toAlpha="1.0"android:duration="500"/></set>其他四個與此基本相似,在此不再列出。當我們定義了滑動效果之后還要在main.xml中把想要滑動的布局包含進去。<ViewFlipperandroid:id="@+id/viewFlipper"android:layout_width="match_parent"android:layout_height="match_parent"><includelayout="@layout/tqyb"/><includeandroid:id="@+id/city_envrionment"layout="@layout/city_environment"/><includeandroid:id="@+id/city_detail"layout="@layout/city_detail"/></ViewFlipper>"有了這個布局之后我們就可以在主程序界面調(diào)用界面進行切換了。主程序?qū)崿F(xiàn)觸屏監(jiān)聽接口,監(jiān)聽觸摸時的x,y坐標,以及當手指離開時的坐標,如果兩者之間的距離大于或小于100像素,則認為想要實現(xiàn)滑動。publicbooleanonTouch<Viewv,MotionEventevent>{if<event.getAction<>==MotionEvent.ACTION_DOWN>{touchDownX=event.getX<>;returntrue; }elseif<event.getAction<>==MotionEvent.ACTION_UP>{touchUpX=event.getX<>;if<touchUpX-touchDownX>100>{//從左往右滑動viewFlipper.setAnimation<AnimationUtils.loadAnimation<this,android.R.anim.slide_in_left>>;viewFlipper.setAnimation<AnimationUtils.loadAnimation<this,android.R.anim.slide_out_right>>;viewFlipper.showPrevious<>; }elseif<touchDownX-touchUpX>100>{viewFlipper.setAnimation<AnimationUtils.loadAnimation<this,R.anim.right_in>>;viewFlipper.setAnimation<AnimationUtils.loadAnimation<this,R.anim.left_out>>;viewFlipper.showNext<>; }returntrue; }returnfalse; }獲取天氣信息并顯示天氣預報系統(tǒng)最重要的當然是如何才能有效的獲取天氣信息了,要想獲取實時的天氣信息,我們就要訪問專門提供天氣信息的網(wǎng)站把網(wǎng)站返回的信息解析出想要的信息并顯示在手機上。通過網(wǎng)上的搜索,我找到了一個提供webservice的網(wǎng)站:通過向這個網(wǎng)站提供參數(shù)就可以獲取指定城市的天氣信息了,該網(wǎng)站是從中央氣象臺接收的信息,數(shù)據(jù)準確可靠。每隔兩個小時更新一次天氣情況,具有很好的實時性。Webservice的出現(xiàn)成功的解決了不同平臺和語言之間進行數(shù)據(jù)交換的問題,它主要使用XML文檔來傳遞消息,并將該消息發(fā)送給任何請求對象,由于不同系統(tǒng)對XML的完美支持,因此從根本上完善了跨平臺服務(wù),任何時刻、任何平臺我們可以使用任何語言來訪問該Webservice服務(wù)。對于Webservice使用者而言,webserviceAPI與任何操作平臺無關(guān),它只是以XML語言作為數(shù)據(jù)交換格式。Webservice平臺主要涉及到的技術(shù)是SOAP〔SimpleObjectAccessProtocol,WSDL〔WebServiceDescriptionLanguageSOAP依賴于XML文檔來構(gòu)建,一條SOAP消息就是一份特定的XML文檔,SOAP主要包含三個方面的主要元素:<Envelope…/>根元素,該元素是必填的。其中SOAP消息用來傳遞的數(shù)據(jù)的XML文檔以該元素作為根元素<Header…/>元素,該元素是選填的。它包含了SOAP消息的頭信息<Body…/>元素,該元素是必填的。它包含所有的調(diào)用和相應(yīng)的內(nèi)容Java本身提供了很豐富的WebService支持,比如Sun公司制定的JAX-WS2規(guī)范,Apache開源組織提供的Axis1,Axis2,CXF等。我們可以使用Google公司為Android平臺開發(fā)的專門處理Webservice信息的ksoap2-android進行客戶端的開發(fā)。使用該第三方包的方法為:1.創(chuàng)建HttpTrasportSE對象2.創(chuàng)建SoapSerializationEnvelope對象3.創(chuàng)建SoapObject對象,創(chuàng)建該對象時需要傳入所要調(diào)用WebService的命名空間4.如果有參數(shù)需要傳給WebService服務(wù)器端,調(diào)用SoapObject對象的addProperty〔Stringname,Objectvalue>方法來設(shè)置參數(shù),該方法的name參數(shù)指定參數(shù)名,value指定參數(shù)值5.調(diào)用SoapSerializationEnvelope的setOutputSoapObject<>方法,或者直接對bodyout屬性賦值,將前兩步創(chuàng)建的SoapObject對象設(shè)SoapSerializationEnvelope的傳出SOAP消息體6.調(diào)用對象的call<>方法,并以SoapSerializationEnvelope作為參數(shù)調(diào)用遠程的WebService7.調(diào)用完成后,訪問SoapSerializationEnvelope對象的bodyin屬性,該屬性返回一個SoapObject對象,該對象就代表了WebService的返回消息,解析該SoapObject對象,即可獲取調(diào)用WebService的返回值?;诖司帉懻{(diào)用webservice服務(wù)的類WebServiceUtil返回城市列表publicstaticList<String>getProvinceList<> {//需要調(diào)用的方法名<獲得本天氣預報WebServices支持的洲、國內(nèi)外省份和城市信息>//StringmethodName="getRegionProvince"; StringmethodName="getSupportProvince";//創(chuàng)建HttpTransportSE傳輸對象 HttpTransportSEhttpTranstation=newHttpTransportSE<SERVICE_URL>; httpTranstation.debug=true;//使用SOAP1.1協(xié)議創(chuàng)建Envelop對象 SoapSerializationEnvelopeenvelope=newSoapSerializationEnvelope< SoapEnvelope.VER11>;//實例化SoapObject對象 SoapObjectsoapObject=newSoapObject<SERVICE_NS,methodName>; envelope.bodyOut=soapObject;//設(shè)置與.Net提供的WebService保持較好的兼容性 envelope.dotNet=true;try {//調(diào)用WebService httpTranstation.call<SERVICE_NS+methodName,envelope>;if<envelope.getResponse<>!=null> {//獲取服務(wù)器響應(yīng)返回的SOAP消息 SoapObjectresult=<SoapObject>envelope.bodyIn; SoapObjectdetail=<SoapObject>result.getProperty<methodName +"Result">;//解析服務(wù)器響應(yīng)的SOAP消息。returnparseProvinceOrCity<detail>; } }catch<Exceptione> { e.printStackTrace<>; }returnnull; }解析出省份和城市,把返回的數(shù)據(jù)用split方法切割,只取需要的省份數(shù)據(jù)privatestaticList<String>parseProvinceOrCity<SoapObjectdetail> { ArrayList<String>result=newArrayList<String><>;for<inti=0;i<detail.getPropertyCount<>;i++> { Stringstr=detail.getProperty<i>.toString<>;//解析出每個省份 result.add<str.split<"">[0]>; }returnresult; }通過具體的城市獲取天氣信息publicstaticSoapObjectgetWeatherByCity<StringcityName> {//根據(jù)城市或地區(qū)名稱查詢獲得未來三天內(nèi)天氣情況、現(xiàn)在的天氣實況、天氣和生活指數(shù)//StringmethodName="getWeather"; StringmethodName="getWeatherbyCityName"; HttpTransportSEhttpTranstation=newHttpTransportSE<SERVICE_URL>; httpTranstation.debug=true; SoapSerializationEnvelopeenvelope=newSoapSerializationEnvelope<SoapEnvelope.VER11>; SoapObjectsoapObject=newSoapObject<SERVICE_NS,methodName>;//soapObject.addProperty<"theCityCode",cityName>; soapObject.addProperty<"theCityName",cityName>; envelope.bodyOut=soapObject; envelope.dotNet=true;try {//調(diào)用WebService httpTranstation.call<SERVICE_NS+methodName,envelope>;if<envelope.getResponse<>!=null> {//獲取服務(wù)器響應(yīng)返回的SOAP消息 SoapObjectresult=<SoapObject>envelope.bodyIn; SoapObjectdetail=<SoapObject>result.getProperty<methodName+"Result">;//解析服務(wù)器響應(yīng)的SOAP消息。returndetail; } }catch<Exceptione> { e.printStackTrace<>; }returnnull; }如圖4.5所示為調(diào)用此方法后返回的為XML文檔 圖4.5網(wǎng)站返回XML文檔接下來我們只需要對該文件解析就可以拿出我們需要的數(shù)據(jù)了。然后把對應(yīng)的數(shù)據(jù)添加在相應(yīng)的地方即可。城市列表的選擇:當我們單擊城市選擇按鈕的時候會跳出圖4.6的城市選擇界面圖4.6城市選擇界面對應(yīng)的方法為publicvoidshow_dialog<intcityId> {city_text=<TextView>findViewById<R.id.city_text>;switch<cityId> {caseCITY://取得city_layout.xml中的視圖finalViewview=LayoutInflater.from<this>.inflate< R.layout.city_layout,null>;//省份Spinnerprovince_spinner=<Spinner>view.findViewById<R.vince_spinner>;//城市Spinnercity_spinner=<Spinner>view.findViewById<R.id.city_spinner>;provinces=WebServiceUtil.getProvinceList<>; ArrayAdapter<String>adapter=newArrayAdapter<String><this,android.R.layout.simple_spinner_item,provinces>; adapter.setDropDownViewResource<android.R.layout.simple_spinner_dropdown_item>;province_spinner.setAdapter<adapter>;//省份Spinner監(jiān)聽器province_spinner.setOnItemSelectedListener<newOnItemSelectedListener<> {@OverridepublicvoidonItemSelected<AdapterView<?>view, Viewparent,intposition,longid> {citys=WebServiceUtil.getCityListByProvince<provinces.get<position>>;ArrayAdapter<String>adapter1=newArrayAdapter<String><WeatherWebServiceActivity.this,android.R.layout.simple_spinner_item,citys>; adapter1.setDropDownViewResource<android.R.layout.simple_spinner_dropdown_item>;city_spinner.setAdapter<adapter1>; }@OverridepublicvoidonNothingSelected<AdapterView<?>arg0> { } }>;//城市Spinner監(jiān)聽器city_spinner.setOnItemSelectedListener<newOnItemSelectedListener<> {@OverridepublicvoidonItemSelected<AdapterView<?>arg0,Viewarg1,intposition,longarg3> {city_str=citys.get<position>; }@OverridepublicvoidonNothingSelected<AdapterView<?>arg0> { } }>;//選擇城市對話框 AlertDialog.Builderdialog=newAlertDialog.Builder<this>; dialog.setTitle<"請選擇所屬城市">; dialog.setView<view>; dialog.setPositiveButton<"確定",newDialogInterface.OnClickListener<> {@OverridepublicvoidonClick<DialogInterfacedialog,intwhich> {city_text.setText<city_str>; writeSharedPreference<city_str>; refresh<city_str>; checkWeather<city_str>; } }>; dialog.setNegativeButton<"取消",newDialogInterface.OnClickListener<> {@OverridepublicvoidonClick<DialogInterfacedialog,intwhich> { dialog.dismiss<>; } }>; dialog.show<>;break;default:break; } }編寫gps定位轉(zhuǎn)換類用于定位當前位置信息ConverUtil。由于GoogleSDK內(nèi)部的一個小bug,我們不能直接利用手機內(nèi)部來定位地址,必須要把當前的經(jīng)緯度信息發(fā)送給谷歌網(wǎng)站來解析。publicstaticStringgetAddress<doublelongitude,doublelatitude>{// HttpClientclient=newDefaultHttpClient<>;//Get方法得到內(nèi)容 HttpGethttpGet=newHttpGet<"/maps/api/" +"geocode/json?latlng=" +latitude+","+longitude +"&sensor=false®ion=cn">; StringBuildersb=newStringBuilder<>;try{ HttpResponseresponse=client.execute<httpGet>; HttpEntityentity=response.getEntity<>;//獲取服務(wù)器響應(yīng)的字符串 InputStreamis=entity.getContent<>;intb;while<<b=is.read<>>!=-1>{ sb.append<<char>b>; }//把服務(wù)器相應(yīng)的字符串轉(zhuǎn)化為JSon對象 JSONObjectjsonObj=newJSONObject<sb.toString<>>;//解析出相應(yīng)結(jié)果中的地址信息 Strings1=jsonObj.getJSONArray<"results">.getJSONObject<0>.getString<"formatted_address">; Strings2=s1.split<",">[3]; Log.i<"start",s2>;returnjsonObj.getJSONArray<"results">.getJSONObject<0>.getString<"formatted_address">; }catch<Exceptione>{ e.printStackTrace<>; }returnnull; }本軟件同樣實現(xiàn)了傳感器接口,可以實時監(jiān)測當前外部溫度,增加用戶的友好體驗,主要方法為:publicvoidonSensorChanged<SensorEventevent>{//TODOAuto-generatedmethodstubfloat[]values=event.values;//真機上獲取觸發(fā)event的傳感器類型//intsensorType=event.sensor.getType<>;//模擬器上獲取觸發(fā)event的傳感器類型intsensorType=event.type; StringBuildersb=null;switch<sensorType>{caseSensor.TYPE_TEMPERATURE: sb=newStringBuilder<>; sb.append<values[0]>; sb.append<"℃">;et.setText<sb.toString<>>;break;default:break; } }4.4數(shù)據(jù)存儲 有時候應(yīng)用程序需要有數(shù)據(jù)保存,而且這些數(shù)據(jù)都比較簡單,基本上只是一些簡單的字符串,標量類型的值等。對于這種數(shù)據(jù),Android提供了SharedPreferences進行保存。SharedPreferences主要保存的是一些簡單的key-value對。在本程序中,我首先設(shè)置了一個判斷網(wǎng)絡(luò)狀態(tài)連通情況的方法,返回一個Boolean類型的值,如果網(wǎng)絡(luò)正常連接,則會從網(wǎng)絡(luò)刷新天氣,如果當前網(wǎng)絡(luò)狀態(tài)不好,則會從本地保存的XML文件中讀取緩存的天氣,方便用戶進行查看。判斷網(wǎng)絡(luò)狀態(tài)的方法://判斷網(wǎng)絡(luò)類型是否為3G網(wǎng)絡(luò)publicbooleanisNetwork<>{ ConnectivityManagerconnectivityManager=<ConnectivityManager>this.getSystemService<Context.CONNECTIVITY_SERVICE>; NetworkInfonetworkInfo=connectivityManager.getActiveNetworkInfo<>;if<networkInfo!=null>{returnnetworkInfo.isAvailable<>; }returnfalse; }//判斷是否為WIFI連接publicbooleanisWIFINetwork<>{ ConnectivityManagerconnectivityManager=<ConnectivityManager>this.getSystemService<Context.CONNECTIVITY_SERVICE>;if<connectivityManager==null>{returnfalse; }else{ NetworkInfo[]info=connectivityManager.getAllNetworkInfo<>;if<info!=null>{for<inti=0;i<info.length;i++>{if<info[i].getTypeName<>.equals<"WIFI">&&info[i].isConnected<>>{returntrue; } } } }returnfalse; }在oncreate方法中,首先判斷當前連接情況if<isNetWork<>||isWIFINetwork<>>如果判斷為真,則會從網(wǎng)站更新天氣,如果不為真則會從SharedPreferences保存的數(shù)據(jù)中讀取顯示。5.系統(tǒng)測試5.1測試目的確認軟件的質(zhì)量,確保軟件能正常運行,并且達到了期待中的效果確認信息的正確性。確保從網(wǎng)上下
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商丘職業(yè)技術(shù)學院《女性主義文學名著精讀》2023-2024學年第一學期期末試卷
- 運營實戰(zhàn)產(chǎn)品課程設(shè)計
- 課程設(shè)計全套
- 2024生豬養(yǎng)殖與飼料原料采購合同3篇
- 2025屆廣東省東莞市(莞外、松山湖實驗)達標名校中考生物押題試卷含解析
- 二零二五年度樓房建筑工程竣工驗收合同4篇
- 2025年度教育行業(yè)市場調(diào)研與政策解讀合同4篇
- 2025年冷鏈貨物海運出口訂艙及全程溫控合同3篇
- 二零二五年度生態(tài)旅游區(qū)綠植租賃與景觀美化服務(wù)協(xié)議4篇
- 2025年度場監(jiān)督管理局信息化系統(tǒng)運維服務(wù)合同4篇
- 通用電子嘉賓禮薄
- 2023年浙江省公務(wù)員考試面試真題解析
- GB/T 5796.3-2022梯形螺紋第3部分:基本尺寸
- GB/T 16407-2006聲學醫(yī)用體外壓力脈沖碎石機的聲場特性和測量
- 簡潔藍色科技商業(yè)PPT模板
- 錢素云先進事跡學習心得體會
- 道路客運車輛安全檢查表
- 宋曉峰辣目洋子小品《來啦老妹兒》劇本臺詞手稿
- 附錄C(資料性)消防安全評估記錄表示例
- 噪音檢測記錄表
- 推薦系統(tǒng)之協(xié)同過濾算法
評論
0/150
提交評論