版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
目錄需求分 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開發(fā)及?運(yùn)行環(huán)^888888888^8^8:-88境.88數(shù)據(jù)庫.設(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ù)庫文 ::件 8件實(shí)現(xiàn)可伸縮性列表的的構(gòu)建與過 濾GPS定位功能的實(shí) 現(xiàn)widget窗體小部件的更功能新J8888888888888888888試::8:8:8::88-18 論.8論.8 23摘要Window操作系統(tǒng)的誕生成就了微軟帝國,同時(shí)也造就7PC時(shí)代的繁榮,然而如今,以Android和iPhone手機(jī)為代表的智能移動設(shè)備的發(fā)明與互聯(lián)網(wǎng)云技術(shù)的興起卻敲響了PC時(shí)代的喪鐘!這也預(yù)示著移動互聯(lián)網(wǎng)時(shí)代(3G)已經(jīng)來臨。在這個(gè)互聯(lián)網(wǎng)繁榮的時(shí)代,有一顆超新星,以它獨(dú)特性能優(yōu)勢與人性化的UI設(shè)計(jì)使它在短短的幾年迅速的占領(lǐng)了智能移動設(shè)備的市場份額,它就是Google的Android!這也意味著Google在移動互聯(lián)網(wǎng)時(shí)代開始搶跑并領(lǐng)跑。Android是基于Linux平臺完全開源的手機(jī)操作系統(tǒng),同時(shí)開發(fā)語言為Java,這對于Java開發(fā)的我們是何等的誘人,程序員的技術(shù)要與時(shí)代同行,因此我選擇了以Android為平臺的手機(jī)天氣預(yù)報(bào)系統(tǒng)來作為我的畢業(yè)設(shè)計(jì),選擇手機(jī)天氣預(yù)報(bào)系統(tǒng)不僅可以提升技術(shù),同時(shí)也很實(shí)用,為人們時(shí)刻了解天氣狀況和出行帶來了方便。需求分析一、 開發(fā)背景近幾年來隨著3G技術(shù)成熟和智能手機(jī)的不斷普及,移動應(yīng)用的需求與日俱增,移動應(yīng)用開發(fā)成為當(dāng)下最熱門的技術(shù)之一。在Google和Android手機(jī)聯(lián)盟的共同推動下,Android在眾多移動應(yīng)用開發(fā)平臺中脫穎而出。Android是一個(gè)真正意義上的開源智能手機(jī)操作系統(tǒng),該系統(tǒng)一經(jīng)推出立即受到全球移動設(shè)備廠商和開發(fā)者的熱捧。為順應(yīng)潮流,本設(shè)計(jì)旨在搭載Android的移動設(shè)備上運(yùn)行,實(shí)現(xiàn)天氣狀況的實(shí)時(shí)動態(tài)更新與顯示,方便人們的出行與生活。二、 項(xiàng)目需求分析根據(jù)功能的需求,分析此項(xiàng)目的主要功能應(yīng)具備以下幾點(diǎn):精確查詢定位全國各地城市未來幾天內(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)模塊功能如下:.天氣顯示界面模塊顯示指定城市三天內(nèi)的天氣狀況,包括日期、城市名稱、溫度、風(fēng)力與當(dāng)日的建議,用戶可通過按菜單鍵來顯示菜單更新當(dāng)前天氣與設(shè)置天氣顯示的界面背景,以及跳轉(zhuǎn)至設(shè)置預(yù)報(bào)城市界面來更換預(yù)報(bào)城市。.預(yù)報(bào)城市設(shè)置模塊由自動設(shè)置預(yù)報(bào)城市與手動設(shè)置二部分組成,自動設(shè)置實(shí)現(xiàn)GPS定位功能,自動確定當(dāng)前用戶所在地;而手動設(shè)置則通過可伸展性下拉列表單擊選擇系統(tǒng)數(shù)據(jù)庫中預(yù)存的城市來進(jìn)行設(shè)置,同時(shí)為了方便用戶查找,支持以輸入框的形式來過濾查詢預(yù)報(bào)城市。當(dāng)單擊選中城市時(shí)跳轉(zhuǎn)至天氣顯示界面,來顯示該城市當(dāng)三天內(nèi)的天氣狀況;第一次運(yùn)行時(shí)自動跳到該界面。.Widget桌面小部件模塊為了方便用戶實(shí)時(shí)了解天氣狀況,特別添加在Android系統(tǒng)桌面上顯示當(dāng)前天氣與時(shí)間的天氣小部件,使用戶拿起手機(jī)的第一時(shí)刻就能了解天氣,同時(shí)當(dāng)用戶單擊小部件時(shí),自動跳轉(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用戶可以通過單擊選擇“定位當(dāng)前城市”的方式調(diào)用系統(tǒng)GPS功能自動定位預(yù)報(bào)城市:
1.3用戶可通過輸入框過濾查詢當(dāng)前系統(tǒng)中預(yù)存的城市:天氣顯示界面:2.1選擇了預(yù)報(bào)城市后,系統(tǒng)跳轉(zhuǎn)至天氣顯示界面,顯示該城市三天內(nèi)的實(shí)時(shí)天氣:乏01?年12月W7日(星期二) 辛卯年武漢 整
2.2在天氣界面中用戶可通過按菜單鍵來調(diào)出菜單,選擇城市,更新天氣與更換背景:Widget桌面小部件界面:方便用戶第一時(shí)間了解天氣動態(tài),添加widget顯示功能界面:
設(shè)計(jì)目標(biāo)設(shè)計(jì)完成一個(gè)實(shí)用穩(wěn)定的天氣預(yù)報(bào)系統(tǒng),同時(shí)要廉價(jià)使其能滿足大部分用戶的需求,因此針對上述要求,本設(shè)計(jì)應(yīng)滿足:系統(tǒng)能及時(shí)的返反饋指定預(yù)報(bào)城市的天氣情況自動定位用戶所在城市,支持GPS定位節(jié)省流量開銷,規(guī)定在指定的時(shí)間間隔內(nèi)才更新天氣,其它時(shí)段顯示緩存的天氣操作方便快捷,使用簡單,界面設(shè)計(jì)美觀大方,支持widget系統(tǒng)設(shè)計(jì)、開發(fā)及運(yùn)行環(huán)境JDK1.6.10Eclipse3.5AndroidDevelopmentToolkit(ADT)15.0.0Android2.2及以上WindowsXP及以上二、數(shù)據(jù)庫設(shè)計(jì)由于在本系統(tǒng)中是通過中央氣象臺的WebService提供的API訪問得到的天氣預(yù)報(bào),在查詢指定城市的天氣時(shí),需要用到它提供的城市碼,而城市碼相對穩(wěn)定不變,所以在構(gòu)建系統(tǒng)時(shí)將其事先通過Android的網(wǎng)絡(luò)訪問技術(shù)將其緩沖到本地SQLite數(shù)據(jù)庫進(jìn)行保存起來,方便以后的查詢,同時(shí)節(jié)省了流量開銷。綜上所述在本地建立db_weather.db的數(shù)據(jù)庫,其中的表結(jié)構(gòu)如下:provinces,idIN7ZJUt/stprovinces,idIN7Oprovince_dINTiiameTECT。匚i1y_iiLimTEXT其中只存在兩個(gè)表:provices和citysCity中存在city_num用天氣的查詢,同時(shí)還存在外鍵province_id與provices表形成1對n的關(guān)系。三、 主要方法及步驟搭建Android開發(fā)環(huán)境,并建立一個(gè)android2.2版本名為WeatherSystem項(xiàng)目首先編寫網(wǎng)絡(luò)訪問代碼,訪問/data5/city.xml中央氣象站解析得到所有城市碼并導(dǎo)出保存得到的db_weather.db數(shù)據(jù)文件在程序第一次運(yùn)行時(shí),將db_weatcher.db數(shù)據(jù)庫文件導(dǎo)入到應(yīng)用程序數(shù)據(jù)庫中建立設(shè)置城市界面,讀取數(shù)據(jù)庫文件,獲取省份,城市以及對應(yīng)的城市碼。接收用戶選擇的城市碼,訪問:/data/<城市碼>.html得到天氣信息解析天氣信息,將城市碼及天氣信息緩沖下來,并為其設(shè)置有效時(shí)間,方便下次啟動時(shí)直接得到天氣信息,過期則從網(wǎng)上更新定時(shí)由保存的城市碼更新天氣信息四、 主要方法及技術(shù)Android手機(jī)的界面UI設(shè)計(jì)Android的網(wǎng)絡(luò)通信Android的廣播GPS調(diào)用解析Widget小部件編程XML與JSON解析SQLite數(shù)據(jù)庫操作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ù)庫文件獲取全國各地的城市碼,是通過訪問中央氣象局網(wǎng)從省份直轄市到城鎮(zhèn)一級一級深入得到的,獲得一個(gè)地區(qū)的城市碼總共需要訪問4次網(wǎng)絡(luò),分別如下:訪問/data5/city.xml得到省份直轄市列表與它的編號:01|北京,02|上海,03|天津,04|重慶,05|黑龍江,06|吉林,07|遼寧,08|內(nèi)蒙古,…訪問/data5/city<省份編號>.xml得到該省份直轄市的城市編號(如訪問山東:/data5/city12.xml)1201|濟(jì)南,1202|青島,1203|淄博,12041德州,1205|煙臺,1206|濰、、坊, 、、 、、、訪問/data5/city<城市編號>.xml得到該城市的縣區(qū)編號(如訪問濟(jì)南:/data5/city1201.xml)120101|濟(jì)南,120102|長清,120103|商河,120104|章丘,120105|平陰,….訪問/data5/city〈縣區(qū)編號>.xml得到該縣區(qū)的城市碼(如訪問長清:http://m.weather./data5/city120102.xml)120102101120102120102101120102首先實(shí)現(xiàn)上述功能需使用Android的網(wǎng)絡(luò)訪問技術(shù),故編寫工具類WebAccessTools類如下:/***根據(jù)給定的url地址訪問網(wǎng)絡(luò),得到響應(yīng)內(nèi)容(這里為GET方式訪問)@paramurl指定的url地址?returnweb服務(wù)器響應(yīng)的內(nèi)容,為<code>String</code>類型,當(dāng)訪問失敗時(shí),返回為null*/publicStringgetWebContent(Stringurl)(//創(chuàng)建一個(gè)http請求對象HttpGetrequest=newHttpGet(url);//創(chuàng)建HttpParams以用來設(shè)置HTTP參數(shù)HttpParamsparams二newBasicHttpParams();//設(shè)置連接超時(shí)或響應(yīng)超時(shí)HttpConnectionParams.setConnectionTimeout(params,3000);HttpConnectionParams.setSoTimeout(params,5000);//創(chuàng)建一個(gè)網(wǎng)絡(luò)訪問處理對象HttpClienthttpClient=newDefaultHttpClient(params);try(//執(zhí)行請求參數(shù)項(xiàng)HttpResponseresponse=httpClient.execute(request);〃判斷是否請求成功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ò)訪問失敗,請檢查您機(jī)器的聯(lián)網(wǎng)設(shè)備!",Toast.LENGTH_LONG).show();}}catch(Exceptione)(e.printStackTrace();}finally(〃釋放網(wǎng)絡(luò)連接資源httpClient.getConnectionManager().shutdown();}returnnull;}由上面訪問的可知,得到的編碼與名稱都是“編碼I名稱”的形式,因此在這也編寫一個(gè)解析得到城市碼的工具類WeatherInfoParser,用于解析從服務(wù)器中得到的城市碼:/***通過解析content,得到一個(gè)一維為城市編號,二維為城市名的二維數(shù)組*解析的字符串的形式為:<code>編號|城市名,編號|城市名,.....</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ù)器端用程序遍歷得到全國各地的城市名與城市碼,并將它們分別的保存在String口口provinces數(shù)組,String口口childs數(shù)組與String口口cityCode中:WebAccessToolswebTools=newWebAccessTools(this);//得到訪問網(wǎng)絡(luò)的內(nèi)容StringwebContent二webTools.getWebContent(〃/data5/city.xml〃);〃第一次解析得到的為省份或一級直轄市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];〃由省份碼來得到城市碼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++)(〃由城市碼來得到地方碼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;}接下來就是將得到的上面的三個(gè)數(shù)組建立數(shù)據(jù)庫文件db_weather.db保存起來,用到android.database.sqlite.SQLiteDatabase類的靜態(tài)方法:SQLiteDatabaseopenOrCreateDatabase(Stringpath,CursorFactoryfactory)來創(chuàng)建一個(gè)數(shù)據(jù)庫文件,其中的path表示數(shù)據(jù)庫存放的路徑,而factory中游標(biāo)工廠,這里可將它設(shè)為空,從而得到SQLiteDatabase對象,則再調(diào)用它的execSQL(Stringsql)方法來執(zhí)行保存數(shù)據(jù)庫的操作,從而將上面的三個(gè)數(shù)組轉(zhuǎn)換為數(shù)據(jù)庫中的數(shù)據(jù),最后使用ADT插件中的DDMS工具將得到的數(shù)據(jù)庫文件從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ù)庫的導(dǎo)入實(shí)際是Java中文件的復(fù)制。實(shí)現(xiàn)可伸縮性列表的的構(gòu)建與過濾實(shí)現(xiàn)可伸縮性列表是通過繼承android.widget.BaseExpandableListAdapter適配器實(shí)現(xiàn)的,其中主要實(shí)現(xiàn)它的publicViewgetGroupView()得列表的一級列表和publicvoidgetChildView()得到列表的二級子列表實(shí)現(xiàn)的,在這里由于只是實(shí)現(xiàn)文本顯示功能,故用TextView組件來填充就行了,如果要構(gòu)造這個(gè)自定義的適配器,則只需在提供存放省份直轄市的一級列表的數(shù)組String口groups和存放對應(yīng)的城鎮(zhèn)的二級列表的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é)果對象方法,另一個(gè)是根據(jù)得到的FilterResults對象更新適配器的publishResults()方法。其中的performFiltering(CharSequenceconstraint)方法的實(shí)現(xiàn)是通過constraint這個(gè)關(guān)鍵字以省份直轄市為單位進(jìn)行匹配,如果匹配成功,則添加該省份以下的所有城市,如果匹配不成功,則再逐一與這個(gè)省份的下的城市配匹,則只添加匹配的城市,其中匹配的結(jié)果放在Map<Integer,ArrayList<Integer>>values這樣的向量中,再由新建的FilterResults封裝返回,(具體實(shí)現(xiàn)如下):首先是對關(guān)鍵字進(jìn)行判斷是否為空,如為空則由values添加所有省份與城
市,其中的allGroups和allChilds保存的是所有的省份與對應(yīng)的城市:〃當(dāng)過濾條件為空時(shí),返回所有的省份與城市if(constraint==null||constraint.length()==0)(for(inti=0;i<allGroups.length;i++)(ArrayList<Integer>index=newArrayList<Integer>();〃添加所有與之對應(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>();〃添加所有與之對應(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對象來得到新的String]]groups與String口口Childs數(shù)組,再調(diào)用BaseExpandableListAdapter父類的notifyDataSetChanged()方法來更新列表,從而實(shí)現(xiàn)過濾后結(jié)果的顯示(具體實(shí)現(xiàn)如下):首先將參數(shù)FiltersResuls對象轉(zhuǎn)換為Map<Integer,ArrayList<Integer>>filterResult,然后來判斷過濾后的結(jié)果長度時(shí)否為0,如果長度為0則說明過濾后的結(jié)果為空,則調(diào)用父類的notifyDataSetInvalidated()方法來阻止列表的更新:如果長度不為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對象,再調(diào)用Filter對象的filter(String)方法實(shí)現(xiàn)的,在本系統(tǒng)中才用的時(shí)觸發(fā)文本輸入框EditText的TextChangedListener事件時(shí)調(diào)用從而實(shí)現(xiàn)手動選擇預(yù)報(bào)城市的過濾查詢。GPS定位功能的實(shí)現(xiàn)Android中調(diào)用GPS功能,首先要獲取GPS定位管理器LocationManager,獲取LocationManager后就是獲取LocationProvider,可以通過Criteria對象設(shè)置過濾條件來獲得最符合用戶需求的LocationProvider,得到LocationProvider后就可通過調(diào)用LocationMananger對象的getLastKnownLocation()方法來獲取Location地址封裝對象,最后由實(shí)例化的Geocoder將Location中的經(jīng)度和緯度反編譯為地址信息集合List對象,從而由List對象來得到當(dāng)前用戶地址名。在開發(fā)過程中通過Eclipse中的ADT插件的DDMS可以為Android模擬器指定任意地址,如下:LeedtionCentreIsManualGPX|KML■碩Decimal.SexagesimalLongitude104.0665762Latitude30.659269Send當(dāng)在模擬器控制面板中指定經(jīng)緯度后,則會在模擬器中出現(xiàn)GPS的標(biāo)志:但在實(shí)際開發(fā)調(diào)用GPS功能過程時(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(];后來通過網(wǎng)上搜索得知在Android2.2模擬器中調(diào)用Geocoder需要backend服務(wù):”TheGeocoderclassrequiresabackendservicethatisnotincludedinthecoreandroidframework.TheGeocoderquerymethodswillreturnanemptylistiftherenobackendserviceintheplatform.“但并有說此服務(wù)要怎么得到,這看起來像是Android2.2模擬器的一個(gè)Bug,故而在本設(shè)計(jì)中采用訪問[/maps/geo?output=xml&q二經(jīng)度,緯度]的形式來得到詳備的地址信息(來源于:/problems/69517),如下訪問/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)過程如下:得到LocationManager系統(tǒng)定位服務(wù)管理者:LocationManagerlocationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);設(shè)置Geocoder對象,過濾得到符合條件的LocationProvider,再由LocationProvider得到封裝經(jīng)緯度信息的Location對象://設(shè)置一個(gè)Criteria標(biāo)準(zhǔn)用于過濾LocationProviderCriteriacriteria=newCriteria();//設(shè)置不需要高度信息criteria.setAltitudeRequired(false);//設(shè)置不需要方位信息criteria.setBearingRequired(false);//得到最好的可用的ProviderStringprovider=locationManager.getBestProvider(criteria,true);//得到當(dāng)前的位置對象Locationlocation=locationManager.getLastKnownLocation(provider);doublelatitude=location.getLatitude();//得到經(jīng)度doublelongitude=location.getLongitude();//得到緯度得到經(jīng)緯度后再訪問/maps/geo來得到含地址信息的
XML文本內(nèi)容,并用自定義的LocationXMParser工具類解析封裝得到此經(jīng)緯度對應(yīng)的城市名:〃根據(jù)經(jīng)緯度得到詳細(xì)的地址信息//定義的一個(gè)網(wǎng)絡(luò)訪問工具類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對象來確定如何讀取XML輸入InputSourcesource=newInputSource(read);〃開始解析reader.parse(source);〃判斷是否存在地址if(handler.hasAddress())returnhandler.getDetailAddress();}catch(Exceptione)(e.printStackTrace();上面代碼中的getDetailAdress()方法返回的是一個(gè)Map對象,其中封裝了從XML中解析得到的國家、省份、縣區(qū)和城市四個(gè)信息,在得到這些信息后,系統(tǒng)將與數(shù)據(jù)庫中預(yù)存的省份城市相比較,最終匹配得到該地區(qū)的城市碼完成GPS自動定位功能的實(shí)現(xiàn)。Widget窗體小部件的更新由于widget中的時(shí)鐘關(guān)系,需要對widget顯示進(jìn)行時(shí)刻的更新用來保持與系統(tǒng)中時(shí)間的一致。實(shí)現(xiàn)這個(gè)功能需要用到AlarmManager類,這個(gè)類專門用來設(shè)定在某個(gè)指定的時(shí)間去完成指定的事件。設(shè)計(jì)思路是在Widget的onUpdate方法中啟動一個(gè)自定義更新后臺服務(wù),更新widget,并設(shè)定下一分鐘再次調(diào)用此服務(wù)。具體實(shí)現(xiàn)過步驟如下:首先自定義一個(gè)后臺運(yùn)行服務(wù)類繼承至Service類,實(shí)現(xiàn)它的服務(wù)開始運(yùn)行調(diào)用的onStart()方法:super.onStart(intent,startId);//得到widget的布局對象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í)同樣會運(yùn)行//第二個(gè)參數(shù)是下一次啟動service時(shí)間alarm.set(AlarmManager.RTC_WAKEUP,now+unit,pintent);然后在實(shí)現(xiàn)AppWidgetProvider的widget類的onUpdate方法中啟動這個(gè)自定義的服務(wù)://啟動一個(gè)自定義更新widget的后臺服務(wù)context.startService(newIntent(context,UpdateWidgetService.class));除了啟動這個(gè)服務(wù)是不夠的,當(dāng)用戶刪除widget部件時(shí),后臺服務(wù)也必須停止,這樣就必須實(shí)現(xiàn)Service類中的另一個(gè)方法onDestroy()方法,該方法在Service停止時(shí)調(diào)用,在這里用于取消AlarmManager設(shè)置的警報(bào)服務(wù)://當(dāng)widget中通過調(diào)用context.stopService方法來指定銷毀service時(shí),被調(diào)用publicvoidonDestroy()(//取消定時(shí)管理if(alarm!二null)(alarm.cancel(pintent);}super.onDestroy();}則在widget類的onDisabled()方法中調(diào)用stopService方法來停止后臺服務(wù),其中的onDisabled方法在widget被用戶刪除時(shí)由系統(tǒng)自動調(diào)用:publicvoidonDisabled(Contextcontext)(super.onDisabled(context);〃關(guān)閉后臺服務(wù)context.stopService(newIntent(
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 旅游景區(qū)防疫管理及應(yīng)急預(yù)案
- 城市國防教育志愿者活動方案
- IT企業(yè)員工入職流程與管理制度
- 餐飲行業(yè)疫情防控工作總結(jié)與運(yùn)營策略
- 水利工程路面施工方案
- 培訓(xùn)機(jī)構(gòu)教師年度工作總結(jié)
- 蘇教版三年級數(shù)學(xué)上冊教學(xué)計(jì)劃
- 教務(wù)崗位職責(zé)
- 青島大學(xué)《中國傳統(tǒng)圖式研習(xí)》2023-2024學(xué)年第一學(xué)期期末試卷
- 青島港灣職業(yè)技術(shù)學(xué)院《三維道具角色設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 傳承家風(fēng)家訓(xùn)PPT弘揚(yáng)傳統(tǒng)文化PPT課件(帶內(nèi)容)
- 2.0MWp屋頂太陽能分布式光伏發(fā)電項(xiàng)目監(jiān)理大綱2
- PDCA降低I類切口感染發(fā)生率
- 《幻方》 教學(xué)課件
- 自律-主題班會課件(共33張)
- 灌入式復(fù)合路面施工指南
- 人體經(jīng)絡(luò)和穴位歌訣
- 2023級高數(shù)(上)試卷及答案
- 農(nóng)民工考勤表(模板)
- 高中數(shù)學(xué)公開課優(yōu)質(zhì)課1.3.0探究與發(fā)現(xiàn)“楊輝三角”中的一些秘密【市一等獎】優(yōu)質(zhì)課
- 小米物聯(lián)網(wǎng)業(yè)務(wù)布局研究報(bào)告
評論
0/150
提交評論