天氣預(yù)報(bào)APP論文_第1頁
天氣預(yù)報(bào)APP論文_第2頁
天氣預(yù)報(bào)APP論文_第3頁
天氣預(yù)報(bào)APP論文_第4頁
天氣預(yù)報(bào)APP論文_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

目錄摘要.................................................................................................................................................1需求分析........................................................................................................................................2一、開發(fā)背景...............................................................................................................................2二、工程需求分析.......................................................................................................................2總體設(shè)計(jì)........................................................................................................................................2一、系統(tǒng)規(guī)劃...............................................................................................................................2二、系統(tǒng)功能界面.......................................................................................................................31.設(shè)置預(yù)報(bào)城市界面:.....................................................................................................32.天氣顯示界面:............................................................................................................43.Widget桌面小部件界面:.............................................................................................5三.設(shè)計(jì)目標(biāo)...............................................................................................................................6系統(tǒng)設(shè)計(jì)........................................................................................................................................6一、開發(fā)及運(yùn)行環(huán)境...................................................................................................................6二、數(shù)據(jù)庫(kù)設(shè)計(jì)...........................................................................................................................6三、主要方法及步驟...................................................................................................................7四、主要方法及技術(shù)...................................................................................................................7主要模塊........................................................................................................................................7一、工程框架...............................................................................................................................7二、主要功能實(shí)現(xiàn).......................................................................................................................81.獲取城市碼db_weather.db數(shù)據(jù)庫(kù)文件..........................................................................82.實(shí)現(xiàn)可伸縮性列表的的構(gòu)建與過濾...............................................................................123.GPS定位功能的實(shí)現(xiàn).....................................................................................................154.Widget窗體小部件的更新............................................................................................18功能測(cè)試......................................................................................................................................19結(jié)論...............................................................................................................................................23摘要Window操作系統(tǒng)的誕生成就了微軟帝國(guó),同時(shí)也造就了PC時(shí)代的繁榮,然而如今,以Android和iPhone為代表的智能移動(dòng)設(shè)備的創(chuàng)造與互聯(lián)網(wǎng)云技術(shù)的興起卻敲響了PC時(shí)代的喪鐘!這也預(yù)示著移動(dòng)互聯(lián)網(wǎng)時(shí)代(3G)已經(jīng)來臨。在這個(gè)互聯(lián)網(wǎng)繁榮的時(shí)代,有一顆超新星,以它獨(dú)特性能優(yōu)勢(shì)與人性化的UI設(shè)計(jì)使它在短短的幾年迅速的占領(lǐng)了智能移動(dòng)設(shè)備的市場(chǎng)份額,它就是Google的Android!這也意味著Google在移動(dòng)互聯(lián)網(wǎng)時(shí)代開始搶跑并領(lǐng)跑。Android是基于Linux平臺(tái)完全開源的操作系統(tǒng),同時(shí)開發(fā)語言為Java,這對(duì)于Java開發(fā)的我們是何等的誘人,程序員的技術(shù)要與時(shí)代同行,因此我選擇了以Android為平臺(tái)的天氣預(yù)報(bào)系統(tǒng)來作為我的畢業(yè)設(shè)計(jì),選擇天氣預(yù)報(bào)系統(tǒng)不僅可以提升技術(shù),同時(shí)也很實(shí)用,為人們時(shí)刻了解天氣狀況和出行帶來了方便。需求分析一、開發(fā)背景近幾年來隨著3G技術(shù)成熟和智能的不斷普及,移動(dòng)應(yīng)用的需求與日俱增,移動(dòng)應(yīng)用開發(fā)成為當(dāng)下最熱門的技術(shù)之一。在Google和Android聯(lián)盟的共同推動(dòng)下,Android在眾多移動(dòng)應(yīng)用開發(fā)平臺(tái)中脫穎而出。Android是一個(gè)真正意義上的開源智能操作系統(tǒng),該系統(tǒng)一經(jīng)推出立即受到全球移動(dòng)設(shè)備廠商和開發(fā)者的熱捧。為順應(yīng)潮流,本設(shè)計(jì)旨在搭載Android的移動(dòng)設(shè)備上運(yùn)行,實(shí)現(xiàn)天氣狀況的實(shí)時(shí)動(dòng)態(tài)更新與顯示,方便人們的出行與生活。二、工程需求分析根據(jù)功能的需求,分析此工程的主要功能應(yīng)具備以下幾點(diǎn):精確查詢定位全國(guó)各地城市未來幾天內(nèi)的實(shí)時(shí)天氣狀況系統(tǒng)要具的實(shí)用性,符合用戶查看信息習(xí)慣,界面設(shè)計(jì)優(yōu)美系統(tǒng)要具有穩(wěn)定性,且在一定程度上節(jié)省流量的開銷總體設(shè)計(jì)一、系統(tǒng)規(guī)劃由上述的需求,現(xiàn)將系統(tǒng)分為三大模塊:天氣顯示界面模塊、預(yù)報(bào)城市設(shè)置模塊與Widget桌面小部件模塊。各系統(tǒng)模塊功能如下:1).天氣顯示界面模塊顯示指定城市三天內(nèi)的天氣狀況,包括日期、城市名稱、溫度、風(fēng)力與當(dāng)日的建議,用戶可通過按菜單鍵來顯示菜單更新當(dāng)前天氣與設(shè)置天氣顯示的界面背景,以及跳轉(zhuǎn)至設(shè)置預(yù)報(bào)城市界面來更換預(yù)報(bào)城市。2).預(yù)報(bào)城市設(shè)置模塊由自動(dòng)設(shè)置預(yù)報(bào)城市與手動(dòng)設(shè)置二局部組成,自動(dòng)設(shè)置實(shí)現(xiàn)GPS定位功能,自動(dòng)確定當(dāng)前用戶所在地;而手動(dòng)設(shè)置那么通過可伸展性下拉列表單擊選擇系統(tǒng)數(shù)據(jù)庫(kù)中預(yù)存的城市來進(jìn)行設(shè)置,同時(shí)為了方便用戶查找,支持以輸入框的形式來過濾查詢預(yù)報(bào)城市。當(dāng)單擊選中城市時(shí)跳轉(zhuǎn)至天氣顯示界面,來顯示該城市當(dāng)三天內(nèi)的天氣狀況;第一次運(yùn)行時(shí)自動(dòng)跳到該界面。3).Widget桌面小部件模塊為了方便用戶實(shí)時(shí)了解天氣狀況,特別添加在Android系統(tǒng)桌面上顯示當(dāng)前天氣與時(shí)間的天氣小部件,使用戶拿起的第一時(shí)刻就能了解天氣,同時(shí)當(dāng)用戶單擊小部件時(shí),自動(dòng)跳轉(zhuǎn)至天氣顯示界面,顯示三天內(nèi)的詳細(xì)天氣。二、系統(tǒng)功能界面1.設(shè)置預(yù)報(bào)城市界面:1.1當(dāng)?shù)谝淮芜\(yùn)行程序時(shí),跳轉(zhuǎn)至城市設(shè)置界面進(jìn)行預(yù)報(bào)城市的選擇:1.2用戶可以通過單擊選擇“定位當(dāng)前城市〞的方式調(diào)用系統(tǒng)GPS功能自動(dòng)定位預(yù)報(bào)城市:1.3用戶可通過輸入框過濾查詢當(dāng)前系統(tǒng)中預(yù)存的城市:2.天氣顯示界面:2.1選擇了預(yù)報(bào)城市后,系統(tǒng)跳轉(zhuǎn)至天氣顯示界面,顯示該城市三天內(nèi)的實(shí)時(shí)天氣:2.2在天氣界面中用戶可通過按菜單鍵來調(diào)出菜單,選擇城市,更新天氣與更換背景:3.Widget桌面小部件界面:方便用戶第一時(shí)間了解天氣動(dòng)態(tài),添加widget顯示功能界面:三.設(shè)計(jì)目標(biāo)設(shè)計(jì)完成一個(gè)實(shí)用穩(wěn)定的天氣預(yù)報(bào)系統(tǒng),同時(shí)要廉價(jià)使其能滿足大局部用戶的需求,因此針對(duì)上述要求,本設(shè)計(jì)應(yīng)滿足:系統(tǒng)能及時(shí)的返反應(yīng)指定預(yù)報(bào)城市的天氣情況自動(dòng)定位用戶所在城市,支持GPS定位節(jié)省流量開銷,規(guī)定在指定的時(shí)間間隔內(nèi)才更新天氣,其它時(shí)段顯示緩存的天氣操作方便快捷,使用簡(jiǎn)單,界面設(shè)計(jì)美觀大方,支持widget系統(tǒng)設(shè)計(jì)一、開發(fā)及運(yùn)行環(huán)境JDK1.6.10Eclipse3.5AndroidDevelopmentToolkit(ADT)15.0.0Android2.2及以上WindowsXP及以上二、數(shù)據(jù)庫(kù)設(shè)計(jì)由于在本系統(tǒng)中是通過中央氣象臺(tái)的WebService提供的API訪問得到的天氣預(yù)報(bào),在查詢指定城市的天氣時(shí),需要用到它提供的城市碼,而城市碼相對(duì)穩(wěn)定不變,所以在構(gòu)建系統(tǒng)時(shí)將其事先通過Android的網(wǎng)絡(luò)訪問技術(shù)將其緩沖到本地SQLite數(shù)據(jù)庫(kù)進(jìn)行保存起來,方便以后的查詢,同時(shí)節(jié)省了流量開銷。綜上所述在本地建立db_weather.db的數(shù)據(jù)庫(kù),其中的表結(jié)構(gòu)如下:其中只存在兩個(gè)表:provices和citysCity中存在city_num用天氣的查詢,同時(shí)還存在外鍵province_id與provices表形成1對(duì)n的關(guān)系。三、主要方法及步驟搭建Android開發(fā)環(huán)境,并建立一個(gè)android2.2版本名為WeatherSystem工程首先編寫網(wǎng)絡(luò)訪問代碼,訪問中央氣象站解析得到所有城市碼并導(dǎo)出保存得到的db_weather.db數(shù)據(jù)文件在程序第一次運(yùn)行時(shí),將db_weatcher.db數(shù)據(jù)庫(kù)文件導(dǎo)入到應(yīng)用程序數(shù)據(jù)庫(kù)中建立設(shè)置城市界面,讀取數(shù)據(jù)庫(kù)文件,獲取省份,城市以及對(duì)應(yīng)的城市碼。接收用戶選擇的城市碼,訪問:://m.weather/data/<城市碼>.html得到天氣信息解析天氣信息,將城市碼及天氣信息緩沖下來,并為其設(shè)置有效時(shí)間,方便下次啟動(dòng)時(shí)直接得到天氣信息,過期那么從網(wǎng)上更新定時(shí)由保存的城市碼更新天氣信息四、主要方法及技術(shù)Android的界面UI設(shè)計(jì)Android的網(wǎng)絡(luò)通信Android的播送GPS調(diào)用解析Widget小部件編程XML與JSON解析SQLite數(shù)據(jù)庫(kù)操作Android文件操作主要模塊一、工程框架在裝有ADT插件的Eclipse中新建一個(gè)名為WeatherSystem的Android2.2版本的工程,工程主要文件結(jié)構(gòu)如下:WeatherSystem|__src||_com.weather.app|||_MainActivity.java|||_SetCityActivity.java|||_UpdateWidgetService.java|||_WeatherWidget.java||_com.weatherp|||_GPSListAdapter.java|||_MyListAdpater.java||_com.weather.dao|||_DBHelper.java||_com.weaher.utils||_LocationXMParser.java||_WeatherInfoParser.java||_WebAccessTools.java|__res||_drawable|||_(略)||_layout|||_gps.xml|||_main.xml|||_widget_layout.xml|||_set_city.xml||_menu|||_configure_menu.xml||_raw|||_db_weather.db||_values|||_color.xml|||_strings.xml||_xml||_weather_widget.xml||_AndroidManifest.xml二、主要功能實(shí)現(xiàn)1.獲取城市碼db_weather.db數(shù)據(jù)庫(kù)文件獲取全國(guó)各地的城市碼,是通過訪問中央氣象局網(wǎng)從省份直轄市到城鎮(zhèn)一級(jí)一級(jí)深入得到的,獲得一個(gè)地區(qū)的城市碼總共需要訪問4次網(wǎng)絡(luò),分別如下:訪問得到省份直轄市列表與它的編號(hào):01|北京,02|上海,03|天津,04|重慶,05|黑龍江,06|吉林,07|遼寧,08|內(nèi)蒙古,…訪問://m.weather/data5/city<省份編號(hào)>.xml得到該省份直轄市的城市編號(hào)(如訪問山東:)1201|濟(jì)南,1202|青島,1203|淄博,1204|德州,1205|煙臺(tái),1206|濰坊,……訪問://m.weather/data5/city<城市編號(hào)>.xml得到該城市的縣區(qū)編號(hào)(如訪問濟(jì)南:)120231|濟(jì)南,120232|長(zhǎng)清,120233|商河,120234|章丘,120235|平陰,….訪問://m.weather/data5/city<縣區(qū)編號(hào)>.xml得到該縣區(qū)的城市碼(如訪問長(zhǎng)清:) 120232|101120232首先實(shí)現(xiàn)上述功能需使用Android的網(wǎng)絡(luò)訪問技術(shù),故編寫工具類WebAccessTools類如下:/**根據(jù)給定的 url地址訪問網(wǎng)絡(luò),得到響應(yīng)內(nèi)容(這里為GET方式訪問)@param url指定的url地址@return web效勞器響應(yīng)的內(nèi)容,為<code>String</code>類型,當(dāng)訪問失敗時(shí),返回為null*/publicStringgetWebContent(Stringurl){//創(chuàng)立一個(gè)請(qǐng)求對(duì)象Getrequest=newGet(url);//創(chuàng)立Params以用來設(shè)置參數(shù)Paramsparams=newBasicParams();//設(shè)置連接超時(shí)或響應(yīng)超時(shí)ConnectionParams.setConnectionTimeout(params,3000);ConnectionParams.setSoTimeout(params,5000);//創(chuàng)立一個(gè)網(wǎng)絡(luò)訪問處理對(duì)象ClientClient=newDefaultClient(params);try{//執(zhí)行請(qǐng)求參數(shù)項(xiàng)Responseresponse=Client.execute(request);//判斷是否請(qǐng)求成功if(response.getStatusLine().getStatusCode()==Status.SC_OK){//獲得響應(yīng)信息Stringcontent=EntityUtils.toString(response.getEntity());returncontent;}else{//網(wǎng)連接失敗,使用Toast顯示提示信息Toast.makeText(context,"網(wǎng)絡(luò)訪問失敗,請(qǐng)檢查您機(jī)器的聯(lián)網(wǎng)設(shè)備!",Toast.LENGTH_LONG).show();}}catch(Exceptione){e.printStackTrace();}finally{//釋放網(wǎng)絡(luò)連接資源Client.getConnectionManager().shutdown();}returnnull;} 由上面訪問的可知,得到的編碼與名稱都是“編碼|名稱〞的形式,因此在這也編寫一個(gè)解析得到城市碼的工具類WeatherInfoParser,用于解析從效勞器中得到的城市碼:/**通過解析content,得到一個(gè)一維為城市編號(hào),二維為城市名的二維數(shù)組解析的字符串的形式為:<code>編號(hào)|城市名,編號(hào)|城市名,.....</code>@paramcontent需要解析的字符串@return封裝有城市編碼與名稱的二維數(shù)組*/publicstaticString[][]parseCity(Stringcontent){//判斷content不為空if(content!=null&&content.trim().length()!=0){StringTokenizerst=newStringTokenizer(content,",");intcount=st.countTokens();String[][]citys=newString[count][2];inti=0,index=0;while(st.hasMoreTokens()){Stringcity=st.nextToken();index=city.indexOf('|');citys[i][0]=city.substring(0,index);citys[i][1]=city.substring(index+1);i=i+1;}returncitys;}returnnull;}編寫這兩個(gè)類后現(xiàn)在就是編寫從效勞器端用程序遍歷得到全國(guó)各地的城市名與城市碼,并將它們分別的保存在String[][]provinces數(shù)組,String[][]childs數(shù)組與String[][]cityCode中:WebAccessToolswebTools= newWebAccessTools(this);//得到訪問網(wǎng)絡(luò)的內(nèi)容 StringwebContent=webTools .getWebContent("://m.weather/data5/city.xml");//第一次解析得到的為省份或一級(jí)直轄市 String[][]provinces= WeaterInfoParser.parseCity(webContent);String[]groups= newString[provinces.length];String[][]childs= newString[provinces.length][];String[][]cityCode= newString[provinces.length][];for(inti=0;i<provinces.length;i++){groups[i]=provinces [i][1];//由省份碼來得到城市碼 StringBufferurlBuilder= newStringBuffer("://m.weather/data5/city");urlBuilder.append(provinces[i][0]); urlBuilder.append( ".xml");webContent=webTools.getWebContent(urlBuilder.toString()); String[][]citys=WeaterInfo Parser.parseCity(webContent);//用于保存所的有 townsString[][][]towns= newString[citys.length][][];//計(jì)算總的城鎮(zhèn)數(shù) intsum=0;for(intj=0;j<citys.length;j++){//由城市碼來得到地方碼urlBuilder= newStringBuffer("://m.weather/data5/city");urlBuilder.append(city s[j][0]);urlBuilder.append( ".xml");webContent=webTools.getWebContent(urlBuilder.toString()); towns[j]=WeaterInfoParser. parseCity(webContent);sum=sum+towns[j]. length;}childs[i]= newString[sum];cityCode[i]= newString[sum];sum=0;for(intj=0;j<citys.length;j++){for(intn=0;n<towns[j].length;n++){if(n==0)childs[i][sum]=towns[j][n][1];elsechilds[i][sum]=towns[j][0][1]+"."+towns[j][n][1];urlBuilder=newStringBuffer("://m.weather/data5/city");urlBuilder.append(towns[j][n][0]);urlBuilder.append(".xml");webContent=webTools.getWebContent(urlBuilder.toString());String[][]code=WeaterInfoParser.parseCity(webContent);cityCode[i][sum]=code[0][1];sum=sum+1;}}urlBuilder= null;} 接下來就是將得到的上面的三個(gè)數(shù)組建立數(shù)據(jù)庫(kù)文件db_weather.db保存起來,用到android.database.sqlite.SQLiteDatabase類的靜態(tài)方法:SQLiteDatabaseopenOrCreateDatabase(Stringpath,CursorFactoryfactory)來創(chuàng)立一個(gè)數(shù)據(jù)庫(kù)文件,其中的path表示數(shù)據(jù)庫(kù)存放的路徑,而factory中游標(biāo)工廠,這里可將它設(shè)為空,從而得到SQLiteDatabase對(duì)象,那么再調(diào)用它的execSQL(Stringsql)方法來執(zhí)行保存數(shù)據(jù)庫(kù)的操作,從而將上面的三個(gè)數(shù)組轉(zhuǎn)換為數(shù)據(jù)庫(kù)中的數(shù)據(jù),最后使用ADT插件中的DDMS工具將得到的數(shù)據(jù)庫(kù)文件從Android模擬器中導(dǎo)出,最終就得到了db_weather.db文件。以后上述的代碼就可以不使用,直接將db_weather.db文件放入資源文件夾res目錄中的raw目錄中,那么在程序第一次運(yùn)行時(shí)導(dǎo)入到目錄中就行了,其中關(guān)于數(shù)據(jù)庫(kù)的導(dǎo)入實(shí)際是Java中文件的復(fù)制。2.實(shí)現(xiàn)可伸縮性列表的的構(gòu)建與過濾實(shí)現(xiàn)可伸縮性列表是通過繼承android.widget.BaseExpandableListAdapter適配器實(shí)現(xiàn)的,其中主要實(shí)現(xiàn)它的publicViewgetGroupView()得列表的一級(jí)列表和publicvoidgetChildView()得到列表的二級(jí)子列表實(shí)現(xiàn)的,在這里由于只是實(shí)現(xiàn)文本顯示功能,故用TextView組件來填充就行了,如果要構(gòu)造這個(gè)自定義的適配器,那么只需在提供存放省份直轄市的一級(jí)列表的數(shù)組String[]groups和存放對(duì)應(yīng)的城鎮(zhèn)的二級(jí)列表的String[][]childs就行了。同時(shí)為了兼具過濾功能,還要需再實(shí)現(xiàn)android.widget.Filterable接口,這個(gè)接口有一個(gè)getFilter()返回Filter過濾器的列表,故還要提供一個(gè)Filter過濾類,在本系統(tǒng)中,實(shí)現(xiàn)的是一個(gè)內(nèi)部類CityFilter,它繼承android.widget.Filter類,覆蓋實(shí)現(xiàn)了兩個(gè)方法,一個(gè)是performFiltering()得到FilterResults過濾結(jié)果對(duì)象方法,另一個(gè)是根據(jù)得到的FilterResults對(duì)象更新適配器的publishResults()方法。其中的performFiltering(CharSequenceconstraint)方法的實(shí)現(xiàn)是通過constraint這個(gè)關(guān)鍵字以省份直轄市為單位進(jìn)行匹配,如果匹配成功,那么添加該省份以下的所有城市,如果匹配不成功,那么再逐一與這個(gè)省份的下的城市配匹,那么只添加匹配的城市,其中匹配的結(jié)果放在Map<Integer,ArrayList<Integer>>values這樣的向量中,再由新建的FilterResults封裝返回,〔具體實(shí)現(xiàn)如下〕:1.首先是對(duì)關(guān)鍵字進(jìn)行判斷是否為空,如為空那么由values添加所有省份與城市,其中的allGroups和allChilds保存的是所有的省份與對(duì)應(yīng)的城市://當(dāng)過濾條件為空時(shí),返回所有的省份與城市if(constraint==null||constraint.length()==0){for(inti=0;i<allGroups.length;i++){ArrayList<Integer>index=newArrayList<Integer>();//添加所有與之對(duì)應(yīng)的城市for(intj=0;j<allChilds[i].length;j++){index.add(j);}values.put(i,index);}}如果關(guān)鍵字constraint不為空,那么以省份為單位進(jìn)行匹配,省份匹配的添加下面的所在城鎮(zhèn),如果不匹配,那么進(jìn)行步深入匹配城鎮(zhèn),添加符合條件的城鎮(zhèn):StringfilterStr=constraint.toString(); for(inti=0;i<allGroups.length;i++){//查找省名是否包含用戶輸入的字符串if(allGroups[i].contains(filterStr)){ArrayList<Integer>index=newArrayList<Integer>();//添加所有與之對(duì)應(yīng)的城市for(intj=0;j<allChilds[i].length;j++){index.add(j);}values.put(i,index);}else{ArrayList<Integer>index=newArrayList<Integer>();//如果省份名沒有,那么查找它下面的城市名是否包含for(intj=0;j<allChilds[i].length;j++){if(allChilds[i][j].contains(filterStr)){index.add(j);} } //如果添加進(jìn)入了城市,說明存在,那么它的省份也添加進(jìn)去 if(index.size()>0){values.put(i,index); }else{index=null; }}}得到過濾的結(jié)果后將其用FilterResource封裝后返回:FilterResultsresults=newFilterResults();results.values=values;results.count=values.size();另外的publishResults(CharSequenceconstraint,FilterResultsresults)方法就是根據(jù)上面得到的results對(duì)象來得到新的String[]groups與String[][]Childs數(shù)組,再調(diào)用BaseExpandableListAdapter父類的notifyDataSetChanged()方法來更新列表,從而實(shí)現(xiàn)過濾后結(jié)果的顯示(具體實(shí)現(xiàn)如下):首先將參數(shù)FiltersResuls對(duì)象轉(zhuǎn)換為Map<Integer,ArrayList<Integer>>filterResult,然后來判斷過濾后的結(jié)果長(zhǎng)度時(shí)否為0,如果長(zhǎng)度為0那么說明過濾后的結(jié)果為空,那么調(diào)用父類的notifyDataSetInvalidated()方法來阻止列表的更新:如果長(zhǎng)度不為0,那么說明存在過濾結(jié)果,那么將它轉(zhuǎn)換為groups數(shù)組與childs數(shù)組,并調(diào)用notifyDataSetChanged()方法實(shí)再更新:String[]newGroups= newString[count];String[][]newChilds= newString[count][];intindex=0; intlength=0; //得到新的groups和childsfor(inti=0;i<allGroups.length;i++){if(filterResult.containsKey(i)){newGroups[index]=allGroups[i];//符合條件的城市ArrayList<Integer>citys=filterResult.get(i);length=citys.size();newChilds[index]=newString[length];for(intj=0;j<length;j++){newChilds[index][j]=allChilds[i][citys.get(j)];}index=index+1;}} //設(shè)置groups 和childsgroups=newGroups;childs=newChilds;//更新列表notifyDataSetChanged(); //判斷是否展開列表 count=getGroupCount(); if(count<34) {//展開伸縮性列表 for(inti=0;i<count;i++){provinceList.expandGroup(i);}}else{//收縮伸縮性列表 for(inti=0;i<count;i++){provinceList.collapseGroup(i);}} 如上所述那么就實(shí)現(xiàn)了帶有過濾性可伸展性列表適配性的實(shí)現(xiàn),那么在使用時(shí)在XML組件配置文件中使用ExpandableListView列表,并調(diào)用它的setAdapter()方法來,加載自定義的適配器。而在使用它的過濾功能時(shí)那么調(diào)用自定義適配器的getFilter()得到過濾Filter對(duì)象,再調(diào)用Filter對(duì)象的filter(String)方法實(shí)現(xiàn)的,在本系統(tǒng)中才用的時(shí)觸發(fā)文本輸入框EditText的TextChangedListener事件時(shí)調(diào)用從而實(shí)現(xiàn)手動(dòng)選擇預(yù)報(bào)城市的過濾查詢。3.GPS定位功能的實(shí)現(xiàn)Android中調(diào)用GPS功能,首先要獲取GPS定位管理器LocationManager,獲取LocationManager后就是獲取LocationProvider,可以通過Criteria對(duì)象設(shè)置過濾條件來獲得最符合用戶需求的LocationProvider,得到LocationProvider后就可通過調(diào)用LocationMananger對(duì)象的getLastKnownLocation()方法來獲取Location地址封裝對(duì)象,最后由實(shí)例化的Geocoder將Location中的經(jīng)度和緯度反編譯為地址信息集合List對(duì)象,從而由List對(duì)象來得到當(dāng)前用戶地址名。在開發(fā)過程中通過Eclipse中的ADT插件的DDMS可以為Android模擬器指定任意地址,如下:當(dāng)在模擬器控制面板中指定經(jīng)緯度后,那么會(huì)在模擬器中出現(xiàn)GPS的標(biāo)志:但在實(shí)際開發(fā)調(diào)用GPS功能過程時(shí),只能獲取經(jīng)度與緯度,而在使用Geocoder反編譯地址時(shí)報(bào)錯(cuò):使用的調(diào)用代碼如下:后來通過網(wǎng)上搜索得知在Android2.2模擬器中調(diào)用Geocoder需要backend效勞:〞TheGeocoderclassrequiresabackendservicethatisnotincludedinthecoreandroidframework.TheGeocoderquerymethodswillreturnanemptylistiftherenobackendserviceintheplatform.“但并有說此效勞要怎么得到,這看起來像是Android2.2模擬器的一個(gè)Bug,故而在本設(shè)計(jì)中采用訪問[=經(jīng)度,緯度]的形式來得到詳備的地址信息〔來源于:〕,如下訪問://maps.google/maps/geo?output=xml&q=30.659269,104.065762:其中的output參數(shù)指定的是效勞器響應(yīng)的格式,除了XML格式還可以為JSON,CSV等格式。由此可知,為了實(shí)現(xiàn)GPS的定位功能還需要實(shí)現(xiàn)一個(gè)解析XML的工具類,在本系統(tǒng)中由工具類LocationXMParser完成,它繼承至.DefaultHandler類,用于專門用于解析XML文件。上述的GPS功能具體實(shí)現(xiàn)過程如下:得到LocationManager系統(tǒng)定位效勞管理者:LocationManagerlocationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);設(shè)置Geocoder對(duì)象,過濾得到符合條件的LocationProvider,再由LocationProvider得到封裝經(jīng)緯度信息的Location對(duì)象://設(shè)置一個(gè)Criteria標(biāo)準(zhǔn)用于過濾LocationProviderCriteriacriteria=newCriteria();//設(shè)置不需要高度信息criteria.setAltitudeRequired(false);//設(shè)置不需要方位信息criteria.setBearingRequired(false);//得到最好的可用的ProviderStringprovider=locationManager.getBestProvider(criteria,true);//得到當(dāng)前的位置對(duì)象Locationlocation=locationManager.getLastKnownLocation(provider);doublelatitude=location.getLatitude();//得到經(jīng)度doublelongitude=location.getLongitude();//得到緯度3.得到經(jīng)緯度后再訪問來得到含地址信息的XML文本內(nèi)容,并用自定義的LocationXMParser工具類解析封裝得到此經(jīng)緯度對(duì)應(yīng)的城市名://根據(jù)經(jīng)緯度得到詳細(xì)的地址信息 //定義的一個(gè)網(wǎng)絡(luò)訪問工具類 WebAccessToolswebTools= newWebAccessTools(this);StringaddressContext=webTools .getWebContent ("://maps.google/maps/geo?output=xml&q="+ latitude+","+longitude);//解析地址信息 SAXParserFactoryspf=SAXParserFactory. newInstance();try{SAXParserparser=spf.newSAXParser(); XMLReaderreader=parser.getXMLReader(); LocationXMLParserhandler= newLocationXMLParser();reader.setContentHandler(handler); StringReaderread= newStringReader(addressContext);//創(chuàng)立新的輸入源SAX解析器將使用InputSource對(duì)象來確定如何讀取XML輸入InputSourcesource= newInputSource(read);//開始解析 reader.parse(source); //判斷是否存在地址 if(handler.hasAddress())returnhandler.getDetailAddress();}catch(Exceptione){e.printStackTrace(); } 上面代碼中的getDetailAdress()方法返回的是一個(gè)Map對(duì)象,其中封裝了從XML中解析得到的國(guó)家、省份、縣區(qū)和城市四個(gè)信息,在得到這些信息后,系統(tǒng)將與數(shù)據(jù)庫(kù)中預(yù)存的省份城市相比擬,最終匹配得到該地區(qū)的城市碼完成GPS自動(dòng)定位功能的實(shí)現(xiàn)。4.Widget窗體小部件的更新由于widget中的時(shí)鐘關(guān)系,需要對(duì)widget顯示進(jìn)行時(shí)刻的更新用來保持與系統(tǒng)中時(shí)間的一致。實(shí)現(xiàn)這個(gè)功能需要用到AlarmManager類,這個(gè)類專門用來設(shè)定在某個(gè)指定的時(shí)間去完成指定的事件。設(shè)計(jì)思路是在Widget的onUpdate方法中啟動(dòng)一個(gè)自定義更新后臺(tái)效勞,更新widget,并設(shè)定下一分鐘再次調(diào)用此效勞。具體實(shí)現(xiàn)過步驟如下:首先自定義一個(gè)后臺(tái)運(yùn)行效勞類繼承至Service類,實(shí)現(xiàn)它的效勞開始運(yùn)行調(diào)用的onStart()方法:super.onStart(intent,start Id);//得到widget的布局對(duì)象RemoteViewsviews=WeatherWidget. getWeatherView(this);//得到AppWidgetManagerwidget 管理器AppWidgetManagerappWidgetManager=AppWidgetManager. getInstance(this);int[]appids=appWidgetManager.getAppWidgetIds (newComponentName(this, WeatherWidget.class));//得到城市碼,并更新天氣SharedPreferencessp=getSharedPreferences( SetCityActivity.CITY_CODE_FILE, SetCityActivity.MODE_PRIVATE);StringcityCode=sp.getString( "code","");if(cityCode !=null&&cityCode.trim().length()>0){WeatherWidget. updateAppWidget(views,this, appWidgetManager,cityCode);} appWidgetManager.updateAppWidget(appids,views);//獲取當(dāng)前時(shí)間設(shè)置警報(bào)效勞Datedate= newDate();longnow=date.getTime(); longunit=60000; //間隔一分鐘ints=date.getSeconds(); //得到秒數(shù)unit=60000-s*1000;//將時(shí)間精確到秒pintent=PendingIntent.getService(this,0,intent,0);//計(jì)時(shí)器alarm=(AlarmManager)g

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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)論