版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
目錄需求分 88888888888888888888888888888888888888888888888888..二L項(xiàng)目.需求分?.…總體?設(shè)8888888888888..二L項(xiàng)目.需求分?.…總體?設(shè)8888888888888計(jì)一8、88系統(tǒng)規(guī)88^^88^^88劃L系統(tǒng)功能界…?????????M??2,888.2,88設(shè)置預(yù)報(bào)城市界型?天氣顯示界 3 面:Widget桌面小部件界 888888 4三面設(shè)計(jì)目 系統(tǒng)設(shè)8888888888885 計(jì)一、88開(kāi)發(fā)及?運(yùn)行環(huán)^888888888^8^8:-88境.88數(shù)據(jù)庫(kù).設(shè) 6 三^:主要方法及步 S 四、主要方法及技::::::::::::::::::::::::::.6 主要模88888888888888888888888888888.7 888.7,塊一、:8項(xiàng)目?木匡:::::88:::::::::::::::::888:8^888.7,::架i::主要功能實(shí) :::: :::::: 項(xiàng) 78888888888888888888888888888888888888888888888如1:獲取城市?碼:db項(xiàng)泌比如8:曲:數(shù)據(jù)庫(kù)文 ::件 8件實(shí)現(xiàn)可伸縮性列表的的構(gòu)建與過(guò) 濾GPS定位功能的實(shí) 現(xiàn)widget窗體小部件的更功能新J8888888888888888888試::8:8:8::88-18 論.8論.8 23摘要Window操作系統(tǒng)的誕生成就了微軟帝國(guó),同時(shí)也造就7PC時(shí)代的繁榮,然而如今,以Android和iPhone手機(jī)為代表的智能移動(dòng)設(shè)備的發(fā)明與互聯(lián)網(wǎng)云技術(shù)的興起卻敲響了PC時(shí)代的喪鐘!這也預(yù)示著移動(dòng)互聯(lián)網(wǎng)時(shí)代(3G)已經(jīng)來(lái)臨。在這個(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í)代開(kāi)始搶跑并領(lǐng)跑。Android是基于Linux平臺(tái)完全開(kāi)源的手機(jī)操作系統(tǒng),同時(shí)開(kāi)發(fā)語(yǔ)言為Java,這對(duì)于Java開(kāi)發(fā)的我們是何等的誘人,程序員的技術(shù)要與時(shí)代同行,因此我選擇了以Android為平臺(tái)的手機(jī)天氣預(yù)報(bào)系統(tǒng)來(lái)作為我的畢業(yè)設(shè)計(jì),選擇手機(jī)天氣預(yù)報(bào)系統(tǒng)不僅可以提升技術(shù),同時(shí)也很實(shí)用,為人們時(shí)刻了解天氣狀況和出行帶來(lái)了方便。需求分析一、 開(kāi)發(fā)背景近幾年來(lái)隨著3G技術(shù)成熟和智能手機(jī)的不斷普及,移動(dòng)應(yīng)用的需求與日俱增,移動(dòng)應(yīng)用開(kāi)發(fā)成為當(dāng)下最熱門的技術(shù)之一。在Google和Android手機(jī)聯(lián)盟的共同推動(dòng)下,Android在眾多移動(dòng)應(yīng)用開(kāi)發(fā)平臺(tái)中脫穎而出。Android是一個(gè)真正意義上的開(kāi)源智能手機(jī)操作系統(tǒng),該系統(tǒng)一經(jīng)推出立即受到全球移動(dòng)設(shè)備廠商和開(kāi)發(fā)者的熱捧。為順應(yīng)潮流,本設(shè)計(jì)旨在搭載Android的移動(dòng)設(shè)備上運(yùn)行,實(shí)現(xiàn)天氣狀況的實(shí)時(shí)動(dòng)態(tài)更新與顯示,方便人們的出行與生活。二、 項(xiàng)目需求分析根據(jù)功能的需求,分析此項(xiàng)目的主要功能應(yīng)具備以下幾點(diǎn):精確查詢定位全國(guó)各地城市未來(lái)幾天內(nèi)的實(shí)時(shí)天氣狀況系統(tǒng)要具的實(shí)用性,符合用戶查看信息習(xí)慣,界面設(shè)計(jì)優(yōu)美系統(tǒng)要具有穩(wěn)定性,且在一定程度上節(jié)省流量的開(kāi)銷總體設(shè)計(jì)一、系統(tǒng)規(guī)劃由上述的需求,現(xiàn)將系統(tǒng)分為三大模塊:天氣顯示界面模塊、預(yù)報(bào)城市設(shè)置模塊與Widget桌面小部件模塊。各系統(tǒng)模塊功能如下:.天氣顯示界面模塊顯示指定城市三天內(nèi)的天氣狀況,包括日期、城市名稱、溫度、風(fēng)力與當(dāng)日的建議,用戶可通過(guò)按菜單鍵來(lái)顯示菜單更新當(dāng)前天氣與設(shè)置天氣顯示的界面背景,以及跳轉(zhuǎn)至設(shè)置預(yù)報(bào)城市界面來(lái)更換預(yù)報(bào)城市。.預(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è)置則通過(guò)可伸展性下拉列表單擊選擇系統(tǒng)數(shù)據(jù)庫(kù)中預(yù)存的城市來(lái)進(jìn)行設(shè)置,同時(shí)為了方便用戶查找,支持以輸入框的形式來(lái)過(guò)濾查詢預(yù)報(bào)城市。當(dāng)單擊選中城市時(shí)跳轉(zhuǎn)至天氣顯示界面,來(lái)顯示該城市當(dāng)三天內(nèi)的天氣狀況;第一次運(yùn)行時(shí)自動(dòng)跳到該界面。.Widget桌面小部件模塊為了方便用戶實(shí)時(shí)了解天氣狀況,特別添加在Android系統(tǒng)桌面上顯示當(dāng)前天氣與時(shí)間的天氣小部件,使用戶拿起手機(jī)的第一時(shí)刻就能了解天氣,同時(shí)當(dāng)用戶單擊小部件時(shí),自動(dòng)跳轉(zhuǎn)至天氣顯示界面,顯示三天內(nèi)的詳細(xì)天氣。
二、系統(tǒng)功能界面設(shè)置預(yù)報(bào)城市界面:1.1當(dāng)?shù)谝淮芜\(yùn)行程序時(shí),跳轉(zhuǎn)至城市設(shè)置界面進(jìn)行預(yù)報(bào)城市的選擇:1.2用戶可以通過(guò)單擊選擇“定位當(dāng)前城市”的方式調(diào)用系統(tǒng)GPS功能自動(dòng)定位預(yù)報(bào)城市:
1.3用戶可通過(guò)輸入框過(guò)濾查詢當(dāng)前系統(tǒng)中預(yù)存的城市:天氣顯示界面:2.1選擇了預(yù)報(bào)城市后,系統(tǒng)跳轉(zhuǎn)至天氣顯示界面,顯示該城市三天內(nèi)的實(shí)時(shí)天氣:乏01?年12月W7日(星期二) 辛卯年武漢 整
2.2在天氣界面中用戶可通過(guò)按菜單鍵來(lái)調(diào)出菜單,選擇城市,更新天氣與更換背景: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ù)報(bào)城市的天氣情況自動(dòng)定位用戶所在城市,支持GPS定位節(jié)省流量開(kāi)銷,規(guī)定在指定的時(shí)間間隔內(nèi)才更新天氣,其它時(shí)段顯示緩存的天氣操作方便快捷,使用簡(jiǎn)單,界面設(shè)計(jì)美觀大方,支持widget系統(tǒng)設(shè)計(jì)、開(kāi)發(fā)及運(yùn)行環(huán)境JDK1.6.10Eclipse3.5AndroidDevelopmentToolkit(ADT)15.0.0Android2.2及以上WindowsXP及以上二、數(shù)據(jù)庫(kù)設(shè)計(jì)由于在本系統(tǒng)中是通過(guò)中央氣象臺(tái)的WebService提供的API訪問(wèn)得到的天氣預(yù)報(bào),在查詢指定城市的天氣時(shí),需要用到它提供的城市碼,而城市碼相對(duì)穩(wěn)定不變,所以在構(gòu)建系統(tǒng)時(shí)將其事先通過(guò)Android的網(wǎng)絡(luò)訪問(wèn)技術(shù)將其緩沖到本地SQLite數(shù)據(jù)庫(kù)進(jìn)行保存起來(lái),方便以后的查詢,同時(shí)節(jié)省了流量開(kāi)銷。綜上所述在本地建立db_weather.db的數(shù)據(jù)庫(kù),其中的表結(jié)構(gòu)如下:provinces,idIN7ZJUt/stprovinces,idIN7Oprovince_dINTiiameTECT。匚i1y_iiLimTEXT其中只存在兩個(gè)表:provices和citysCity中存在city_num用天氣的查詢,同時(shí)還存在外鍵province_id與provices表形成1對(duì)n的關(guān)系。三、 主要方法及步驟搭建Android開(kāi)發(fā)環(huán)境,并建立一個(gè)android2.2版本名為WeatherSystem項(xiàng)目首先編寫網(wǎng)絡(luò)訪問(wèn)代碼,訪問(wèn)/data5/city.xml中央氣象站解析得到所有城市碼并導(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)的城市碼。接收用戶選擇的城市碼,訪問(wèn):/data/<城市碼>.html得到天氣信息解析天氣信息,將城市碼及天氣信息緩沖下來(lái),并為其設(shè)置有效時(shí)間,方便下次啟動(dòng)時(shí)直接得到天氣信息,過(guò)期則從網(wǎng)上更新定時(shí)由保存的城市碼更新天氣信息四、 主要方法及技術(shù)Android手機(jī)的界面UI設(shè)計(jì)Android的網(wǎng)絡(luò)通信Android的廣播GPS調(diào)用解析Widget小部件編程XML與JSON解析SQLite數(shù)據(jù)庫(kù)操作Android文件操作主要模塊一、項(xiàng)目框架在裝有ADT插件的Eclipse中新建一個(gè)名為WeatherSystem的Android2.2版本的項(xiàng)目,項(xiàng)目主要文件結(jié)構(gòu)如下:WeatherSystemsrc|_com.weather.app| |_MainActivity.java| |_SetCityActivity.java| |_UpdateWidgetService.java| |_WeatherWidget.java||_p| |_GPSListAdapter.java| |_MyListAdpater.java||_com.weather.dao| |_DBHelper.javacom.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)獲取城市碼db_weather.db數(shù)據(jù)庫(kù)文件獲取全國(guó)各地的城市碼,是通過(guò)訪問(wèn)中央氣象局網(wǎng)從省份直轄市到城鎮(zhèn)一級(jí)一級(jí)深入得到的,獲得一個(gè)地區(qū)的城市碼總共需要訪問(wèn)4次網(wǎng)絡(luò),分別如下:訪問(wèn)/data5/city.xml得到省份直轄市列表與它的編號(hào):01|北京,02|上海,03|天津,04|重慶,05|黑龍江,06|吉林,07|遼寧,08|內(nèi)蒙古,…訪問(wèn)/data5/city<省份編號(hào)>.xml得到該省份直轄市的城市編號(hào)(如訪問(wèn)山東:/data5/city12.xml)1201|濟(jì)南,1202|青島,1203|淄博,12041德州,1205|煙臺(tái),1206|濰、、坊, 、、 、、、訪問(wèn)/data5/city<城市編號(hào)>.xml得到該城市的縣區(qū)編號(hào)(如訪問(wèn)濟(jì)南:/data5/city1201.xml)120101|濟(jì)南,120102|長(zhǎng)清,120103|商河,120104|章丘,120105|平陰,….訪問(wèn)/data5/city〈縣區(qū)編號(hào)>.xml得到該縣區(qū)的城市碼(如訪問(wèn)長(zhǎng)清:http://m.weather./data5/city120102.xml)120102101120102120102101120102首先實(shí)現(xiàn)上述功能需使用Android的網(wǎng)絡(luò)訪問(wèn)技術(shù),故編寫工具類WebAccessTools類如下:/***根據(jù)給定的url地址訪問(wèn)網(wǎng)絡(luò),得到響應(yīng)內(nèi)容(這里為GET方式訪問(wèn))@paramurl指定的url地址?returnweb服務(wù)器響應(yīng)的內(nèi)容,為<code>String</code>類型,當(dāng)訪問(wèn)失敗時(shí),返回為null*/publicStringgetWebContent(Stringurl)(//創(chuàng)建一個(gè)http請(qǐng)求對(duì)象HttpGetrequest=newHttpGet(url);//創(chuàng)建HttpParams以用來(lái)設(shè)置HTTP參數(shù)HttpParamsparams二newBasicHttpParams();//設(shè)置連接超時(shí)或響應(yīng)超時(shí)HttpConnectionParams.setConnectionTimeout(params,3000);HttpConnectionParams.setSoTimeout(params,5000);//創(chuàng)建一個(gè)網(wǎng)絡(luò)訪問(wèn)處理對(duì)象HttpClienthttpClient=newDefaultHttpClient(params);try(//執(zhí)行請(qǐng)求參數(shù)項(xiàng)HttpResponseresponse=httpClient.execute(request);〃判斷是否請(qǐng)求成功if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK)(//獲得響應(yīng)信息Stringcontent=EntityUtils.toString(response.getEntity());returncontent;}else(//網(wǎng)連接失敗,使用Toast顯示提示信息Toast.makeText(context,〃網(wǎng)絡(luò)訪問(wèn)失敗,請(qǐng)檢查您機(jī)器的聯(lián)網(wǎng)設(shè)備!",Toast.LENGTH_LONG).show();}}catch(Exceptione)(e.printStackTrace();}finally(〃釋放網(wǎng)絡(luò)連接資源httpClient.getConnectionManager().shutdown();}returnnull;}由上面訪問(wèn)的可知,得到的編碼與名稱都是“編碼I名稱”的形式,因此在這也編寫一個(gè)解析得到城市碼的工具類WeatherInfoParser,用于解析從服務(wù)器中得到的城市碼:/***通過(guò)解析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('l');citys[i][0]=city.substring(0,index);citys[i][1]=city.substring(index+1);i=i+1;}returncitys;}returnnull;}編寫這兩個(gè)類后現(xiàn)在就是編寫從服務(wù)器端用程序遍歷得到全國(guó)各地的城市名與城市碼,并將它們分別的保存在String口口provinces數(shù)組,String口口childs數(shù)組與String口口cityCode中:WebAccessToolswebTools=newWebAccessTools(this);//得到訪問(wèn)網(wǎng)絡(luò)的內(nèi)容StringwebContent二webTools.getWebContent(〃/data5/city.xml〃);〃第一次解析得到的為省份或一級(jí)直轄市String口口provinces=WeaterlnfoParser.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];〃由省份碼來(lái)得到城市碼StringBufferurlBuilder=newStringBuffer(〃/data5/city〃);urlBuilder.append(provinces[i][0]);urlBuilder.append(〃.xml〃);webContent=webTools.getWebContent(urlBuilder.toString());String口口citys=WeaterlnfoParser.parseCity(webContent);//用于保存所的有townsString□口口towns=newString[citys.length]口口;〃計(jì)算總的城鎮(zhèn)數(shù)intsum=0;for(intj=0;j<citys.length;j++)(〃由城市碼來(lái)得到地方碼urlBuilder二newStringBuffer(〃/data5/city〃);urlBuilder.append(citys[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(〃/data5/city〃);urlBuilder.append(towns[j][n][0]);urlBuilder.append(〃.xml〃);webContent=webTools.getWebContent(urlBuilder.toString());String口口code二WeaterlnfoParser.parseCity(webContent);cityCode[i][sum]=code[0][1];sum=sum+1;}}urlBuilder二null;}接下來(lái)就是將得到的上面的三個(gè)數(shù)組建立數(shù)據(jù)庫(kù)文件db_weather.db保存起來(lái),用到android.database.sqlite.SQLiteDatabase類的靜態(tài)方法:SQLiteDatabaseopenOrCreateDatabase(Stringpath,CursorFactoryfactory)來(lái)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)文件,其中的path表示數(shù)據(jù)庫(kù)存放的路徑,而factory中游標(biāo)工廠,這里可將它設(shè)為空,從而得到SQLiteDatabase對(duì)象,則再調(diào)用它的execSQL(Stringsql)方法來(lái)執(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)入到/data/data/com.weather.app/databases目錄中就行了,其中關(guān)于數(shù)據(jù)庫(kù)的導(dǎo)入實(shí)際是Java中文件的復(fù)制。實(shí)現(xiàn)可伸縮性列表的的構(gòu)建與過(guò)濾實(shí)現(xiàn)可伸縮性列表是通過(guò)繼承android.widget.BaseExpandableListAdapter適配器實(shí)現(xiàn)的,其中主要實(shí)現(xiàn)它的publicViewgetGroupView()得列表的一級(jí)列表和publicvoidgetChildView()得到列表的二級(jí)子列表實(shí)現(xiàn)的,在這里由于只是實(shí)現(xiàn)文本顯示功能,故用TextView組件來(lái)填充就行了,如果要構(gòu)造這個(gè)自定義的適配器,則只需在提供存放省份直轄市的一級(jí)列表的數(shù)組String口groups和存放對(duì)應(yīng)的城鎮(zhèn)的二級(jí)列表的String口口childs就行了。同時(shí)為了兼具過(guò)濾功能,還要需再實(shí)現(xiàn)android.widget.Filterable接口,這個(gè)接口有一個(gè)getFilter()返回Filter過(guò)濾器的列表,故還要提供一個(gè)Filter過(guò)濾類,在本系統(tǒng)中,實(shí)現(xiàn)的是一個(gè)內(nèi)部類CityFilter,它繼承android.widget.Filter類,覆蓋實(shí)現(xiàn)了兩個(gè)方法,一個(gè)是performFiltering()得到FilterResults過(guò)濾結(jié)果對(duì)象方法,另一個(gè)是根據(jù)得到的FilterResults對(duì)象更新適配器的publishResults()方法。其中的performFiltering(CharSequenceconstraint)方法的實(shí)現(xiàn)是通過(guò)constraint這個(gè)關(guān)鍵字以省份直轄市為單位進(jìn)行匹配,如果匹配成功,則添加該省份以下的所有城市,如果匹配不成功,則再逐一與這個(gè)省份的下的城市配匹,則只添加匹配的城市,其中匹配的結(jié)果放在Map<Integer,ArrayList<Integer>>values這樣的向量中,再由新建的FilterResults封裝返回,(具體實(shí)現(xiàn)如下):首先是對(duì)關(guān)鍵字進(jìn)行判斷是否為空,如為空則由values添加所有省份與城
市,其中的allGroups和allChilds保存的是所有的省份與對(duì)應(yīng)的城市:〃當(dāng)過(guò)濾條件為空時(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>();〃如果省份名沒(méi)有,則查找它下面的城市名是否包含for(intj=0;j<allChilds[i].length;j++)(if(allChilds[i][j].contains(filterStr))(index.add(j);}}〃如果添加進(jìn)入了城市,說(shuō)明存在,則它的省份也添加進(jìn)去if(index.size()>0)(values.put(i,index);}else(index=null;}}}得到過(guò)濾的結(jié)果后將其用FilterResource封裝后返回:FilterResultsresults=newFilterResults();results.values=values;results.count=values.size();另夕卜的publishResults(CharSequenceconstraint, FilterResultsresults)方法就是根據(jù)上面得到的results對(duì)象來(lái)得到新的String]]groups與String口口Childs數(shù)組,再調(diào)用BaseExpandableListAdapter父類的notifyDataSetChanged()方法來(lái)更新列表,從而實(shí)現(xiàn)過(guò)濾后結(jié)果的顯示(具體實(shí)現(xiàn)如下):首先將參數(shù)FiltersResuls對(duì)象轉(zhuǎn)換為Map<Integer,ArrayList<Integer>>filterResult,然后來(lái)判斷過(guò)濾后的結(jié)果長(zhǎng)度時(shí)否為0,如果長(zhǎng)度為0則說(shuō)明過(guò)濾后的結(jié)果為空,則調(diào)用父類的notifyDataSetInvalidated()方法來(lái)阻止列表的更新:如果長(zhǎng)度不為0,則說(shuō)明存在過(guò)濾結(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();〃判斷是否展開(kāi)列表count=getGroupCount();if(count<34)(//展開(kāi)伸縮性列表for(inti=0;i<count;i++)(provinceList.expandGroup(i);}}else(//收縮伸縮性列表for(inti=0;i<count;i++)(provinceList.collapseGroup(i);}}如上所述則就實(shí)現(xiàn)了帶有過(guò)濾性可伸展性列表適配性的實(shí)現(xiàn),則在使用時(shí)在XML組件配置文件中使用ExpandableListView列表,并調(diào)用它的setAdapter()方法來(lái),加載自定義的適配器。而在使用它的過(guò)濾功能時(shí)則調(diào)用自定義適配器的getFilter()得到過(guò)濾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)城市的過(guò)濾查詢。GPS定位功能的實(shí)現(xiàn)Android中調(diào)用GPS功能,首先要獲取GPS定位管理器LocationManager,獲取LocationManager后就是獲取LocationProvider,可以通過(guò)Criteria對(duì)象設(shè)置過(guò)濾條件來(lái)獲得最符合用戶需求的LocationProvider,得到LocationProvider后就可通過(guò)調(diào)用LocationMananger對(duì)象的getLastKnownLocation()方法來(lái)獲取Location地址封裝對(duì)象,最后由實(shí)例化的Geocoder將Location中的經(jīng)度和緯度反編譯為地址信息集合List對(duì)象,從而由List對(duì)象來(lái)得到當(dāng)前用戶地址名。在開(kāi)發(fā)過(guò)程中通過(guò)Eclipse中的ADT插件的DDMS可以為Android模擬器指定任意地址,如下:LeedtionCentreIsManualGPX|KML■碩Decimal.SexagesimalLongitude104.0665762Latitude30.659269Send當(dāng)在模擬器控制面板中指定經(jīng)緯度后,則會(huì)在模擬器中出現(xiàn)GPS的標(biāo)志:但在實(shí)際開(kāi)發(fā)調(diào)用GPS功能過(guò)程時(shí),只能獲取經(jīng)度與緯度,而在使用Geocoder反編譯地址時(shí)報(bào)錯(cuò):Sys-em.-Erriava.in.ICEitcep-iari:Servicen.a'"AvailableSYS^iL.erEandcoid.laca^ian.'jsocadee.gsyr-jnLL-jea('jEoc<jdeE.javd:117)Syszeia.-Errcom.weather.Hpp.SetCiLy^cTivi7y.geTl.acaT.LonCizylk]ne(SetCityActwity.i...SyszeiL.erra?can.we己th己r.spp.SetCiLykct onl lick(SetCilyActivi?y.javi:S2)使用的調(diào)用代碼如下:偵==newcoder(thisf ;E■:〃捋經(jīng)緯度轉(zhuǎn)換成地址的信息「最后的】表示最大充許的結(jié)果數(shù)LiBt<Addr&BB>addresseB=gc.gerFromLncarinn(larirude,Inngirude,1};lf((]>0]Addressaddress=addresses.e'er.(3];返回定位的城市地址塔if(address? = = (j>0)re-urn (0];J':□□.Lcn( 己)=?.pr^nt.3t.aiskTrace(];后來(lái)通過(guò)網(wǎng)上搜索得知在Android2.2模擬器中調(diào)用Geocoder需要backend服務(wù):”TheGeocoderclassrequiresabackendservicethatisnotincludedinthecoreandroidframework.TheGeocoderquerymethodswillreturnanemptylistiftherenobackendserviceintheplatform.“但并有說(shuō)此服務(wù)要怎么得到,這看起來(lái)像是Android2.2模擬器的一個(gè)Bug,故而在本設(shè)計(jì)中采用訪問(wèn)[/maps/geo?output=xml&q二經(jīng)度,緯度]的形式來(lái)得到詳備的地址信息(來(lái)源于:/problems/69517),如下訪問(wèn)/maps/geo?output=xml&q=30.659269,104.065762:-<LubI>—<Respoose>cname>30.659269:104.065'"62<-<Status><code>20Q<ccde><request>geocode<request><Status>-<Phcemarkid—'pl'^<address>i=h@四J11省成都市青羊區(qū)四川科技館南門<address>—<\ddressDetailsAccuracy='9>-<Couutn^><CounmNameCade>CN<CounrnNameCade>V fa<Countr^Name>§<Counam&>-<ldmLQL5tratiY^Area><\dmiDistrativeAreaXame>E3JI?AdmiDistrativexALreaNa>-<Tocalitx>V<LocalinXamQ成都市<Loc^liuName>一<Depeud^utLocaLi^-><Depend叩tLocalihName>青羊區(qū)VDependentLocalit>Xame>—<Tborou^hfare>cThorougLfareName>四川科技館南口<LTLorouffhfareName><Thoroughfare><AddressLlae>四川科技館南門AddressLioe><DependentLocalit>><.'LocalLrL><AdministrafiveArea><-Countt7_><AddressDetails>—<EitetidedData><LatLoDBox曲汕='也.部腔919"soutb=l30.6490552"eas^"104.0822464"wes^'l04.0502316"><TxtendedData>-<PoLdt><coordiDates>104.0662390:30.55S^940:0<coordinates><^Placemark><.Respons&><kmL>其中的output參數(shù)指定的是服務(wù)器響應(yīng)的格式,除7XML格式還可以為JSON,CSV等格式。由此可知,為了實(shí)現(xiàn)GPS的定位功能還需要實(shí)現(xiàn)一個(gè)解析XML的工具類,在本系統(tǒng)中由工具類LocationXMParser完成,它繼承至org.xml.sax.helpers.DefaultHandler類,用于專門用于解WXML文件。上述的GPS功能具體實(shí)現(xiàn)過(guò)程如下:得到LocationManager系統(tǒng)定位服務(wù)管理者:LocationManagerlocationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);設(shè)置Geocoder對(duì)象,過(guò)濾得到符合條件的LocationProvider,再由LocationProvider得到封裝經(jīng)緯度信息的Location對(duì)象://設(shè)置一個(gè)Criteria標(biāo)準(zhǔn)用于過(guò)濾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();//得到緯度得到經(jīng)緯度后再訪問(wèn)/maps/geo來(lái)得到含地址信息的
XML文本內(nèi)容,并用自定義的LocationXMParser工具類解析封裝得到此經(jīng)緯度對(duì)應(yīng)的城市名:〃根據(jù)經(jīng)緯度得到詳細(xì)的地址信息//定義的一個(gè)網(wǎng)絡(luò)訪問(wèn)工具類WebAccessToolswebTools=newWebAccessTools(this);StringaddressContext=webTools.getWebContent("/maps/geofoutput=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ì)象來(lái)確定如何讀取XML輸入InputSourcesource=newInputSource(read);〃開(kāi)始解析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)。Widget窗體小部件的更新由于widget中的時(shí)鐘關(guān)系,需要對(duì)widget顯示進(jìn)行時(shí)刻的更新用來(lái)保持與系統(tǒng)中時(shí)間的一致。實(shí)現(xiàn)這個(gè)功能需要用到AlarmManager類,這個(gè)類專門用來(lái)設(shè)定在某個(gè)指定的時(shí)間去完成指定的事件。設(shè)計(jì)思路是在Widget的onUpdate方法中啟動(dòng)一個(gè)自定義更新后臺(tái)服務(wù),更新widget,并設(shè)定下一分鐘再次調(diào)用此服務(wù)。具體實(shí)現(xiàn)過(guò)步驟如下:首先自定義一個(gè)后臺(tái)運(yùn)行服務(wù)類繼承至Service類,實(shí)現(xiàn)它的服務(wù)開(kāi)始運(yùn)行調(diào)用的onStart()方法:super.onStart(intent,startId);//得到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)服務(wù)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)getSystemService(Context.ALARM_SERVICE);//AlarmManager.RTC_WAKEUP設(shè)置服務(wù)在系統(tǒng)休眠時(shí)同樣會(huì)運(yùn)行//第二個(gè)參數(shù)是下一次啟動(dòng)service時(shí)間alarm.set(AlarmManager.RTC_WAKEUP,now+unit,pintent);然后在實(shí)現(xiàn)AppWidgetProvider的widget類的onUpdate方法中啟動(dòng)這個(gè)自定義的服務(wù)://啟動(dòng)一個(gè)自定義更新widget的后臺(tái)服務(wù)context.startService(newIntent(context,UpdateWidgetService.class));除了啟動(dòng)這個(gè)服務(wù)是不夠的,當(dāng)用戶刪除widget部件時(shí),后臺(tái)服務(wù)也必須停止,這樣就必須實(shí)現(xiàn)Service類中的另一個(gè)方法onDestroy()方法,該方法在Service停止時(shí)調(diào)用,在這里用于取消AlarmManager設(shè)置的警報(bào)服務(wù)://當(dāng)widget中通過(guò)調(diào)用context.stopService方法來(lái)指定銷毀service時(shí),被調(diào)用publicvoidonDestroy()(//取消定時(shí)管理if(alarm!二null)(alarm.cancel(pintent);}super.onDestroy();}則在widget類的onDisabled()方法中調(diào)用stopService方法來(lái)停止后臺(tái)服務(wù),其中的onDisabled方法在widget被用戶刪除時(shí)由系統(tǒng)自動(dòng)調(diào)用:publicvoidonDisabled(Contextcontext)(super.onDisabled(context);〃關(guān)閉后臺(tái)服務(wù)context.stopService(newIntent(
溫馨提示
- 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ù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建師范大學(xué)《自然災(zāi)害與防治》2023-2024學(xué)年第一學(xué)期期末試卷
- 福建師范大學(xué)《學(xué)校心理健康教育與輔導(dǎo)》2023-2024學(xué)年第一學(xué)期期末試卷
- 福建師范大學(xué)《小學(xué)教育測(cè)量與評(píng)價(jià)》2022-2023學(xué)年第一學(xué)期期末試卷
- 福建師范大學(xué)《體育測(cè)量與評(píng)價(jià)》2023-2024學(xué)年第一學(xué)期期末試卷
- 福建師范大學(xué)《環(huán)境工程原理》2022-2023學(xué)年第一學(xué)期期末試卷
- 福建師范大學(xué)《公共倫理學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 福建師范大學(xué)《燈光及錄音技術(shù)基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 戶用光伏電站合作開(kāi)發(fā)合同(范本)
- 課余時(shí)光英文課件
- 2024屆云南省曲靖市富源六中下學(xué)期高三生物第二次階段檢測(cè)試題考試試卷
- 認(rèn)知行為療法(CBT)實(shí)操講座
- 第九套廣播體操比賽評(píng)分表
- 融資融券知識(shí)測(cè)評(píng)題目+答案
- 企業(yè)宣傳視頻制作方案(技術(shù)方案)
- GB/T 3683-2023橡膠軟管及軟管組合件油基或水基流體適用的鋼絲編織增強(qiáng)液壓型規(guī)范
- 抖音直播商業(yè)模式研究5000字【(論文)】
- 《深刻理解和把握“兩個(gè)結(jié)合”》全文PPT
- 固體酸催化材料1:多金屬氧酸鹽
- 擔(dān)保公司業(yè)務(wù)流程圖
- 湖南省2023年對(duì)口高考計(jì)算機(jī)應(yīng)用類專業(yè)考試大綱
- 2023年特種設(shè)備(承壓類)生產(chǎn)單位安全風(fēng)險(xiǎn)管控(日管控、周排查、月調(diào)度)清單
評(píng)論
0/150
提交評(píng)論