版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
致謝Android平臺3G手機氣象軟件摘要隨著智能手機的快速普及,智能手機操作系統(tǒng)市場風生水起。為了讓智能手機用戶能夠隨時隨地查詢互聯(lián)網(wǎng)所提供的服務,一種高效的辦法就是將應用系統(tǒng)的功能拓展到手機終端上,讓手機能夠通過移動網(wǎng)以及互聯(lián)網(wǎng)訪問Web網(wǎng)站并處理各種各樣的業(yè)務。因此,智能手機的應用軟件及其需要的服務將有廣闊的發(fā)展前景。在如今這個智能手機系統(tǒng)群雄紛爭的時候,2008年Google推出了一款名為Android的開源智能手機操作系統(tǒng),它采用Linux內核,開放手機聯(lián)盟(OHA)成員可以任意使用和修改SDK包,系統(tǒng)的開源性使其具有良好的拓展性。這款軟件包括了操作系統(tǒng)、用戶界面和應用程序,即智能手機工作所需要的全部軟件。Android的最大特點是其開放性體系架構,不僅具有非常好的開發(fā)、調試環(huán)境,而且還支持各種可擴展的用戶體驗,包括豐富的圖形組件、多媒體支持功能以及強大的瀏覽器。因此,對于軟件從業(yè)人員來說,Android平臺具有無限的吸引力。本文就在分析討論Android手機軟件開發(fā)技術原理的基礎上,開發(fā)出能為用戶提供更好的基于Android平臺的3G手機氣象軟件。關鍵字:android;氣象軟件;智能手機平臺AbstractWiththerapidproliferationofsmartphones,smartphoneoperatingsystemmarket,windandwater.InorderforsmartphoneuserstochecktheInternetanytime,anywhereservicesprovidedanefficientwaytoexpandthefunctionofthesystemwillbeappliedtothemobilephoneterminal,themobilephonetoInternetaccessviamobilenetworks,andvarietyofWebsitesandprocessbusiness.Therefore,thesmartphoneapplicationsandtheneedfortheservicewillhavebroadprospectsfordevelopment.Intoday'ssmartphonesystemwhendisputeswarlords,2008,GoogleintroducedasmartphonecalledtheAndroidopensourceoperatingsystem,whichusesLinuxkernel,OpenHandsetAlliance(OHA)memberscanbefreetouseandmodifytheSDKpackage,thesystemIthasagoodopen-sourcenatureoftheexpansionof.Thesoftwareincludestheoperatingsystem,userinterfaceandapplicationsthatneedtoworksmartphonesallthesoftware.Android'sbiggestfeatureisitsopenarchitecture,notonlyhasaverygooddevelopmentanddebuggingenvironment,butalsosupportsavarietyofscalableuserexperience,includingrichgraphicalcomponents,multimediasupport,andpowerfulbrowser.Therefore,forsoftwareprofessionalsis,Androidplatformhasunlimitedappeal.Inthispaper,theanalysisanddiscussionAndroidmobilephonesoftwaredevelopmenttechnologyonthebasisoftheprinciple,developedtoprovideuserswithbetterplatformtothe3GhandsetsbasedonAndroidmeteorologicalsoftware.Keywords:android;weathersoftware;smartphoneplatform第一章 緒論1.1研究內容 Android平臺3G手機氣象軟件是基于Android手機平臺,運用Java語言,從Google上獲取天氣預報信息,開發(fā)出針對使用Android平臺的手機天氣預報系統(tǒng)。1.2研究意義 Android平臺3G手機氣象軟件的開發(fā)可以進一步擴大氣象信息的覆蓋面,讓廣大公眾能夠在第一時間方便且快捷地獲取最新的氣象預報(預警)信息,以便提前預防,把氣象災害造成的損失降到最低。同時也可以強化氣象公共服務的職能,完善公共服務體系、改善公共服務手段、增加公共服務產(chǎn)品、提高公共服務質量,更好地發(fā)揮了氣象事業(yè)對經(jīng)濟社會發(fā)展的現(xiàn)實性作用。1.3研究現(xiàn)狀和發(fā)展趨勢據(jù)Gartner最新數(shù)據(jù)顯示,2010年第二、三季度全球智能手機銷售繼續(xù)大幅增長,其中第三季度安卓占全球智能手機市場的25.5%,僅次于塞班,成為第二大智能手機系統(tǒng)。2010第二、三季度與去年同期相比,增度分別是15.4%及22%,增勢迅猛。而塞班系統(tǒng)較09年的市場份額,盡管終端銷量有大幅度提升,但增勢下滑10%,形勢非常嚴峻。其他操作系統(tǒng)的表現(xiàn)則要平穩(wěn)很多。安卓是首款開源代碼的操作系統(tǒng),采用Linux內核,開放手機聯(lián)盟(OHA)成員可以任意使用和修改安卓的SDK軟件包。系統(tǒng)的開源性使其具有良好的拓展性,一方面,為眾多移動應用開發(fā)者提供了良好的系統(tǒng)性平臺,有利于移動應用的集合;另一方面,終端廠商可以針對自身的特殊需要“定制化開發(fā)”。與此相比,盡管2010年2月,塞班基本完成開源工作,但由于代碼臃腫,用戶界面設計缺失,塞班的開源并無實際意義,錯失發(fā)展良機。據(jù)Informa預測,2012年,安卓手機銷量將超過諾基亞塞班手機,屆時安卓將成為全球最大的智能手機平臺。谷歌表示目前安卓手機每日平均激活量為20萬部,銷售速度加速上漲。我們認為,安卓在全球市場的成長壯大,塞班市場份額不斷下跌已成不爭事實。安卓操作系統(tǒng)發(fā)展迅猛主要得益于免費、開源和良好產(chǎn)業(yè)運作策略,這三點為安卓在智能手機市場贏得更多的發(fā)展機遇。系統(tǒng)的免費讓更多的廠商加入,推動了份額的上升;代碼的開源讓更多的開發(fā)者進入應用開發(fā);應用的豐富吸引了更多用戶選擇,這也是谷歌值得眾多廠商學習的地方。此外,谷歌通過OHA聯(lián)合眾多廠商進行系統(tǒng)研發(fā),不斷更新版本,將系統(tǒng)應用推廣到更多的終端產(chǎn)品中,確保用戶體驗持續(xù)改善。 第二章系統(tǒng)分析2.1研究目標(1) 了解Android應用程序的設計和開發(fā)過程;(2)使用多種組件進行Android平臺3G手機氣象軟件的開發(fā)。本軟件是基于Eclipse的開發(fā)環(huán)境,依托Google氣象數(shù)據(jù)建立氣象信息數(shù)據(jù)庫,開發(fā)出了針對Android平臺的手機天氣預報系統(tǒng)。2.2需求分析本軟件是一個AppWidget應用程序,啟動程序后可以進行城市、更新頻率的設置,可以通過圖片和文字顯示當前和未來的天氣狀況,包括溫度、濕度、風向和雨雪情況等。這些天氣數(shù)據(jù)是通過后臺服務獲取的,這個后臺服務可以按照一定時間間隔,從Google上獲取天氣預報信息,并將天氣信息保存在數(shù)據(jù)庫中。從上面的描述中可以基本了解軟件的功能需求:(1)啟動AppWidget應用程序;(2)設置界面:對要顯示天氣預報的城市及更新頻率進行設置;(3)顯示界面:通過文字和圖片顯示當前的天氣情況,包括日期、時間、城市、最高溫度、最低溫度、當前溫度等。(4)詳細界面:通過文字圖片動畫顯示當前的天氣情況,包括城市當前天氣、溫度、風向、風速、濕度;同時顯示今后四天的天氣情況。2.3性能分析 程序響應速度快、安全性高、信息處理速度快。第三章系統(tǒng)開發(fā)環(huán)境及相關技術3.1Android開發(fā)環(huán)境介紹 Android的上層應用程序是用Java語言開發(fā),同時還需要基于Dalvik虛擬機,所以,Google公司推薦使用主流的Java繼承開發(fā)環(huán)境Eclipse。只有Eclipse還不夠,因為是使用Java語言進行開發(fā),還應該有由SUN公司提供的JavaSDK(其中包括JRE:JavaRuntimeEnvironment)。此外,Android的應用程序開發(fā)和Java開發(fā)有較大區(qū)別的,所以還需要有Google提供的AndroidSDK。同時,還需要在Eclipse安裝ADT,為Android開發(fā)提供開發(fā)工具的升級或者變更,是Eclipse下開發(fā)工具的升級下載的工具。 簡言之,需要以下軟件,才能搭建Android開發(fā)環(huán)境,從而進行Android應用程序的開發(fā)。(1)JavaSDK(2)Eclipse(3)AndroidSDK(4)ADT3.2Android開發(fā)平臺搭建Android開發(fā)平臺搭建步驟:①首先到/downloads/下載Eclipse集成開發(fā)環(huán)境并且解壓,這里推薦下載JavaEE集成版本,可以為平臺的搭建省下不少工作。接著再去/javase/downloads/index.jsp站點下載SDK后安裝,下載/android/android-sdk-windows-1.5_r1.zip,AndroidSDK1.5后解壓。第一步下載工序就結束了。②雙擊Eclipse解壓后目錄中的eclipse.exe然后啟動,選擇Eclipse菜單中的Help->InstallNewSoftware->選項卡上的AvailableSoftware,點擊右側的“Add”輸入/android/eclipse/后確定,然后在“Workwith”下拉菜單中選擇剛才輸入的網(wǎng)址。過一會就會出現(xiàn)一個DeveloperTools選項,勾上以后點擊Next以后Eclipse會自動網(wǎng)上查找Android開發(fā)工具插件,然后找到AndroidDDMS和AndroidDevelopmentTools,選中這兩個點擊Finish,Eclipse就會自動下載并安裝Android插件了,最后會提示重啟Eclipse。③重啟后選擇Eclipse菜單中的Windows->Preferences在左側的Android項目中SDKLocation中填入AndroidSDK解壓后的目錄,然后點擊Apply。④在WindowsXP的系統(tǒng)變量中的path變量中添加一個值,該值指向解壓后的AndroidSDK目錄下的tools文件夾。第四章程序設計4.1用戶界面設計根據(jù)需求分析可以知道,應用程序應包含三個主要的用戶界面,這里需要進一步分析每個用戶界面中應該包括哪些顯示內容。在“設置頁面”中,需要對要顯示天氣預報的城市及更新頻率進行設置。在“顯示頁面”中,顯示當前的天氣狀況,包括城市名稱、溫度、濕度、風向、雨雪情況和獲取數(shù)據(jù)時間等信息。在“詳細頁面”動態(tài)顯示當前天氣情況,還要顯示未來四天的天氣情況。根據(jù)對用戶界面顯示內容的分析,繪制出用戶界面的草圖,如圖4-1所示。圖4-1用戶界面草圖4.2數(shù)據(jù)庫設計 本軟件中有兩部分數(shù)據(jù)需要存儲,一個是顯示頁面的數(shù)據(jù),另一個詳細頁面的數(shù)據(jù)。因此選擇SQLite數(shù)據(jù)庫作為存儲數(shù)據(jù)的方法,建立數(shù)據(jù)庫forcasts.db,并且建立兩張表weather_forcastt和weather_widget,分別存儲顯示頁面的數(shù)據(jù)和詳細頁面的數(shù)據(jù)。表4-1詳細頁面的數(shù)據(jù)庫表weather_forcast的結構屬性數(shù)據(jù)類型說明_idinteger自動增加的主鍵widgetIdinteger組件的ID號dayOfWeektext周幾lowinteger最低溫度hightinteger最高溫度icontext顯示天氣的圖標conditiontext未來天氣情況表4-2顯示頁面的數(shù)據(jù)庫表weather_widget的結構屬性數(shù)據(jù)類型說明_idinteger存儲Widget組件idcitytext進行天氣信息查詢的城市名updateMilistext進行天氣信息查詢的頻率,單位為分/次isConfiguredtext是否設置postalCodetext城市標記forecastDateinteger預報日期conditiontext當前天氣情況tempFinteger最高溫度tempCinteger最低溫度humiditytext當前濕度icontext天氣圖標windConditiontext風向風速情況lastUpdateTimeinteger最后一次更新時間4.3程序模塊設計 從功能需求上分析可以看出,整個應用程序應劃分為4個模塊,分別是程序啟動、用戶界面、后臺服務和數(shù)據(jù)庫適配器,各模塊之間的關系如圖4-2所示。 從模塊結構圖中不難看出,后臺服務是整個應用程序的核心,主要是“數(shù)據(jù)獲取模塊”,負責周期性的從Google獲取天氣信息。后臺服務在程序啟動時就由AppWidgetProvider啟動,也可由用戶界面通過startService()進行啟動,啟動后的后臺服務將一直保持運行狀態(tài)。 用戶界面從數(shù)據(jù)庫中獲取天氣信息,而沒有直接通過網(wǎng)絡訪問Google的天氣數(shù)據(jù)。之所以這么實際,一方面可以避免因網(wǎng)絡通信不暢造成界面失去響應;另一方面,后臺服務可以及時更新數(shù)據(jù),以保證數(shù)據(jù)的準確性。 數(shù)據(jù)庫適配器封裝了所有對SQLite數(shù)據(jù)庫操作的方法,用戶界面和后臺服務會調用它來實現(xiàn)數(shù)據(jù)庫操作。 在完成用戶界面設計、數(shù)據(jù)庫設計和模塊設計后,至此程序設計階段基本完成。第五章 程序開發(fā)5.1文件結構與用途在程序開發(fā)階段,首先確定“Android平臺3G手機氣象軟件”的工程名為ty-weather,據(jù)程序模塊設計的內容,建立ty-weather工程。Weather工程源代碼的結構如圖5.1所示。圖5.1ty-weather工程的源代碼文件為了使源代碼文件的結構更加清晰,Weather工程設置了多個命名空間,分別用來保存用戶界面、數(shù)據(jù)庫、后臺服務和工具實體的源代碼文件,源代碼文件的名稱以及說明如表5.1所示。表5.1ty-weather工程的文件用途說明包名稱文件名說明com.ty.weatherConfigureActivity.java“設置頁面”的Activitycom.ty.weatherDetailForecastActivity.java“詳細頁面”的Activitycom.ty.weatherForecastProvider.java天氣預報相關數(shù)據(jù)提供者,操作數(shù)據(jù)庫com.ty.weatherForecastService.java后臺進程內服務com.ty.weatherForecastTimeService.java后臺時間服務com.ty.weatherForecastWidget.java實現(xiàn)AppWidget組件,并啟動服務com.ty.weatherWebServiceHelper.java網(wǎng)絡數(shù)據(jù)獲取模塊com.ty.weather.utilForecastEntity.java未來天氣信息的類com.ty.weather.utilForecastUtil.java天氣信息工具類com.ty.weather.utilWidgetEntity.java當前天氣信息的類Android的資源文件保存在/res的子目錄中。其中、/res/anim目錄中保存的是產(chǎn)生動畫效果的XML文件,/res/drawable/目錄中保存的是圖像文件,/res/values目錄中保存的是用來自定義字符串和顏色的文件,/res/xml目錄中保存的是XML格式的數(shù)據(jù)文件。所有在程序開發(fā)階段可以被調用的資源都保存在這些目錄中,具體每個資源文件的用途可以參考表5.2:表5.2資源文件名稱與用途資源目錄文件說明animrotatecurrentweather.xml漸變透明度動畫效果translatecloudleft.xml畫面轉換位置移動動畫效果(從左至右)translatecloudright.xml畫面轉換位置移動動畫效果(從右至左)translaterain01.xml畫面轉換位置移動動畫效果(從上至下)translaterain02.xml畫面轉換位置移動動畫效果(從上至下)translaterain03.xml畫面轉換位置移動動畫效果(從上至下)translaterain04.xml畫面轉換位置移動動畫效果(從上至下)translaterain05.xml畫面轉換位置移動動畫效果(從上至下)drawablecloudy.png這個文件夾里是工程里所用的圖片,如有表示天氣狀況、數(shù)字等,此處不贅述。dots.pngnumber_7_tahoma.pngweather_sunny.pnglayoutconfigure.xml設置城市、天氣更新頻率的布局weather.xml“顯示頁面”的布局detail.xml“詳細顯示”頁面上邊的顯示當前天氣的布局detailitems.xml“詳細顯示”頁面下邊的顯示未來天氣的布局valuescolor.xml保存顏色的XML文件strings.xml保存字符串的XML的文件xmlweatherwidget.xmlAppWidget的屬性文件5.2數(shù)據(jù)提供者 數(shù)據(jù)提供者ForecastProvider繼承ContentProvider,是在應用程序間共享數(shù)據(jù)的一種接口機制。應用程序在不同的進程中運行,因此,數(shù)據(jù)和文件在不同的應用程序之間是不能夠直接進行訪問的。而CotentProvider為程序員提供了較高級的數(shù)據(jù)共享方法,應用程序可以指定需要共享的數(shù)據(jù),而其他應用程序則可以在不知數(shù)據(jù)來源、路徑的情況下,對共享數(shù)據(jù)進行查詢、添加、刪除和更新等操作。在介紹ForecastProvider的核心代碼前,首先了解一下WidgetEntity.java(當前天氣信息的類)和ForecastEntity.java(未來天氣信息的類)。(1)WidgetEntity.java的部分代碼:publicclassWidgetEntity{ privateArrayList<ForecastEntity>details=newArrayList<ForecastEntity>();//ForecastEntity對象privateIntegerid;//編號 privateIntegerupdateMilis;//更新頻率 privateStringcity;//城市 privateStringpostalCode;//城市標記 privateLongforecastDate;//預報時間 privateStringcondition;//天氣情況 privateIntegertempF;//華氏溫度 privateIntegertempC;//攝氏溫度 privateStringhumidity;//濕度 privateStringicon;//天氣圖標 privateStringwindCondition;//風力風向 privateLonglastUpdateTime;//最后更新時間 privateIntegerisConfigured;//是否已設置 ......}從代碼中可以看出,除ForecastEntity的對象details,WidgetEntity類中有以上公有靜態(tài)屬性id、updateMilis、updateMilis、postalCode、forecastDate、condition、tempF、tempC、humidity、icon、windCondition、lastUpdateTime、isConfigured,完全對應數(shù)據(jù)庫中weather_widget的表。ForecastEntity.java的部分代碼:publicclassForecastEntity{ privateIntegerid;//編號 privateStringdayOfWeek;//星期 privateIntegerlow;//最低溫度 privateIntegerhight;//最高溫度 privateStringicon;//天氣圖標 privateStringcondition;//天氣情況 privateIntegerwidgetId;//組件id從代碼中可以看出,WidgetEntity類中有以上公有靜態(tài)屬性id、dayOfWeek、low、hight、icon、condition、widgetId,完全對應數(shù)據(jù)庫中weather_forcast的表。 在創(chuàng)建ForecastProvider時,首先需要使用數(shù)據(jù)庫、文件系統(tǒng)或網(wǎng)絡實現(xiàn)底層存儲功能,這里我們采用數(shù)據(jù)庫建立了數(shù)據(jù)庫設計中的兩張表,從而實現(xiàn)了底層存儲功能。然后在繼承ContentProvider的類中實現(xiàn)基本數(shù)據(jù)操作的接口函數(shù),包括添加、刪除、查找和更新等功能。下面就核心代碼進行分析。創(chuàng)建數(shù)據(jù)庫:DatabaseHelper類繼承SQLiteOpenHelper,SQLiteOpenHelper這個類可以輔助建立、更新和打開數(shù)據(jù)庫。DatabaseHelper在建立數(shù)據(jù)庫時,同時建立了兩個數(shù)據(jù)庫表weather_widget和weather_forcast,并對保存配置信息的表進行了初始化。具體代碼如下所示:privatestaticclassDatabaseHelperextendsSQLiteOpenHelper{ //數(shù)據(jù)庫名稱 privatestaticfinalStringDATABASE_NAME="forecasts.db"; //數(shù)據(jù)庫版本 privatestaticfinalintDATABASE_VERSION=2; //構造方法,重載父類構造 publicDatabaseHelper(Contextcontext){ super(context,DATABASE_NAME,null,DATABASE_VERSION); } publicvoidonCreate(SQLiteDatabasedb){ //創(chuàng)建weather_widget表 publicvoidonCreate(SQLiteDatabasedb){ //創(chuàng)建weather_widget表 db.execSQL("CREATETABLE"+TABLE_WIDGET+"(" ......); //創(chuàng)建weather_forecast表 db.execSQL("CREATETABLE"+TABLE_FORECAST+"(" ......); } } //重寫onUpgrade()方法 @Override publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){ ...... } } }URI設置:ContentProvider可以提供多個數(shù)據(jù)集,調用者使用URI(通用資源標識符)對不同的數(shù)據(jù)集的數(shù)據(jù)進行操作。URI用來地位任何遠程或本地的可用資源。ContentProvider使用的URI語法結構content://<authority>/<data_path>/<id>。因此,我們就需要先來對URI進行設置。代碼如下:publicstaticclassWeatherWidgetsimplementsBaseColumns{ //繼承BaseColumns可以提供自動生成的ID //聲明CONTENT_URI publicstaticfinalUriCONTENT_URI=Uri.parse("content://" +AUTHORITY+"/widgets"); publicstaticfinalStringFORECAST_END="forecasts"; //指操作多條數(shù)據(jù) publicstaticfinalStringCONTENT_TYPE="vnd.android.cursor.dir/awidget"; //指操作單條數(shù)據(jù) publicstaticfinalStringCONTENT_ITEM_TYPE="vnd.android.cursor.item/widget"; }查詢功能:首先我們先了解一下SQLiteQueryBuilder的query()方法。query(SQLiteDatabasedb,String[]projectionIn,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringsortOrder,Stringlimit),參數(shù)說明如表5.3:參數(shù)說明SQLiteDatabasedb要查詢的數(shù)據(jù)庫實例String[]projectionIn是一個字符串數(shù)組,里邊的每一項代表了需要返回的列名Stringselection相當于SQL語句中的where部分String[]selectionArgs是一個字符串數(shù)組,里邊的每一項依次替代在第三個參數(shù)中出現(xiàn)的問號(?)StringgroupBy相當于SQL語句當中的groupby部分Stringhaving相當于SQL語句當中的having部分StringsortOrder描述是怎么進行排序Stringlimit相當于SQL當中的limit部分,控制返回的數(shù)據(jù)的個數(shù)查詢功能的核心代碼如下:publicCursorquery(Uriuri,String[]projection,Stringselection, String[]selectionArgs,StringsortOrder){ //getReadableDatabase()這個函數(shù)會數(shù)據(jù)庫是否存在、版本號和是否可讀等情況, //決定在返回數(shù)據(jù)庫對象前,是否需要數(shù)據(jù)庫。返回一個可讀的數(shù)據(jù)庫對象。 SQLiteDatabasedb=dbHelper.getReadableDatabase(); //聲明了一個SQLiteQueryBuilder對象,該對象利用傳入的參數(shù)生成一個完整的 //sqlite查詢語句,還可以完成查詢工作并返回結果集(Cursor)。 SQLiteQueryBuilderqb=newSQLiteQueryBuilder(); Stringlimit=null; //通過一個switch語句,完成了通過uri種類的辨別來生成不通的SQLiteQueryBuilder對象的工作。 switch(uriMatcher.match(uri)){ caseWIDGETS:{qb.setTables(TABLE_WIDGET);break;}caseWIDGETS_ID:{StringappWidgetId=uri.getPathSegments().get(1);qb.setTables(TABLE_WIDGET);qb.appendWhere(BaseColumns._ID+"="+appWidgetId);break;}caseWIDGETS_FORECASTS:{//Pickalltheforecastsforgivenwidget,sortedbydateand//importance //獲得appWidgetIdStringappWidgetId=uri.getPathSegments().get(1);//為該SQLiteQueryBuilder對象設置它查詢工作將針對的表qb.setTables(TABLE_FORECAST);//qb的where條件qb.appendWhere(ForecastEntity.WIDGET_ID+"="+appWidgetId);//按照BaseColumns._ID進行排序sortOrder=BaseColumns._ID+"ASC";break;}caseFORECASTS:{ qb.setTables(TABLE_FORECAST); break; } caseFORECASTS_ID:{ StringforecastId=uri.getPathSegments().get(1); qb.setTables(TABLE_FORECAST); qb.appendWhere(BaseColumns._ID+"="+forecastId); break; } } returnqb.query(db,projection,selection,selectionArgs,null,null,sortOrder,limit); }添加、刪除、更新功能由于核心代碼類似,此處不一一贅述。添加功能:publicUriinsert(Uriuri,ContentValuesvalues){}刪除功能:publicintdelete(Uriuri,Stringselection,String[]selectionArgs){}更新功能:publicintupdate(Uriuri,ContentValuesvalues,Stringselection, String[]selectionArgs){}類型匹配:增刪改查通過switch判斷,進行不同的操作,因而還需要對關鍵字進行類型匹配。核心代碼如下:/*getType()函數(shù)用來返回指定URI的MIME數(shù)據(jù)類型 *CONTENT_TYPE表示URI是多條數(shù)據(jù) *CONTENT_ITEM_TYPE表示是單條數(shù)據(jù) */ @Override publicStringgetType(Uriuri){ //TODOAuto-generatedmethodstub switch(uriMatcher.match(uri)){caseWIDGETS:returnWeatherWidgets.CONTENT_TYPE;caseWIDGETS_ID:returnWeatherWidgets.CONTENT_ITEM_TYPE;caseWIDGETS_FORECASTS:returnWeatherDetails.CONTENT_TYPE; caseFORECASTS: returnWeatherDetails.CONTENT_TYPE; caseFORECASTS_ID: returnWeatherDetails.CONTENT_ITEM_TYPE; } thrownewIllegalStateException(); }//構造無匹配方式的uriMatcher privatestaticfinalUriMatcheruriMatcher=newUriMatcher( UriMatcher.NO_MATCH); privatestaticfinalintWIDGETS=101; privatestaticfinalintWIDGETS_ID=102; privatestaticfinalintWIDGETS_FORECASTS=103; privatestaticfinalintFORECASTS=201; privatestaticfinalintFORECASTS_ID=202; //聲明了uriMatcher的匹配方式和返回代碼 static{ uriMatcher.addURI(AUTHORITY,"widgets",WIDGETS); uriMatcher.addURI(AUTHORITY,"widgets/#",WIDGETS_ID); uriMatcher.addURI(AUTHORITY,"widgets/#/forecasts",WIDGETS_FORECASTS); uriMatcher.addURI(AUTHORITY,"forecasts",FORECASTS); uriMatcher.addURI(AUTHORITY,"forecasts/#",FORECASTS_ID); }}5.3后臺服務后臺服務是ty-weather工程的核心模塊,在用戶啟動后持續(xù)在后臺運行,直到用戶停止服務。后臺服務主要有三個功能,一是周期性的獲取Google的天氣數(shù)據(jù)并存儲到SQLite,二是從SQLite讀取出要顯示的數(shù)據(jù),三是定時更新“顯示頁面”的時間。5.3.1獲取天氣數(shù)據(jù)天氣數(shù)據(jù)的獲取天氣數(shù)據(jù)分為以下三個步驟:從Google提供的WebService中獲取的天氣數(shù)據(jù),數(shù)據(jù)的獲取地址是:/ig/api?weather=%s&hl=zh-cn。核心代碼如下:publicstaticWidgetEntityqueryWebservice(StringpostalCode) throwsForecastParseException{ //編碼出錯 if(postalCode==null){ thrownewForecastParseException("cannotcoverttoentity"); } ReaderresponseReader; WidgetEntitywidgetEntity=null; //通過HttpClient創(chuàng)建Http連接 HttpClientclient=newDefaultHttpClient(); //創(chuàng)建HttpGet請求 HttpGetrequest=newHttpGet(String.format(WEBSERVICE_URL,postalCode)); try{ Log.d(TAG,"getgoogle'sweatherinfomation"); //發(fā)出請求 HttpResponseresponse=client.execute(request); StatusLinestatus=response.getStatusLine(); Log.d(TAG,"Requestreturnedstatus"+status); //取出回復信息 HttpEntityentity=response.getEntity(); responseReader=newInputStreamReader(entity.getContent(),"GB2312"); }catch(IOExceptione){ thrownewForecastParseException("ProblemcallingforecastAPI",e); } if(responseReader!=null){ widgetEntity=parseResponse(responseReader); } returnwidgetEntity; }調用輕量級XML解析器XmlPullParser對從網(wǎng)絡上獲取的字節(jié)流數(shù)據(jù)進行解析,并且將解析結果保存在WidgetEntity對象中。核心代碼如下://返回類型為WidgetEntityprivatestaticWidgetEntityparseResponse(ReaderresponseReader) throwsForecastParseException{...... try{ //使用工廠類XmlPullParserFactory來創(chuàng)建解析器XmlPullParser XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance(); XmlPullParserxpp=factory.newPullParser(); StringtagName=null; xpp.setInput(responseReader); inteventType=xpp.getEventType(); while(eventType!=XmlPullParser.END_DOCUMENT){ if(eventType==XmlPullParser.START_TAG){ tagName=xpp.getName(); //根據(jù)不同的標簽做不同的解析 if(PROBLEM_CAUSE.equals(tagName)){ thrownewForecastParseException( "thecityisnoncorrect!"); }elseif(FORECAST_INFORMATION.equals(tagName)){ dealWithInfomation(tagName,widgetEntity,xpp); }elseif(CURRENT_CONDITIONS.equals(tagName)){ dealWithCurrentConditions(tagName,widgetEntity,xpp); }elseif(FORECAST_CONDITIONS.equals(tagName)){ dealWithForecastConditions(tagName,widgetEntity,xpp); } } eventType=xpp.next(); } }catch(IOExceptione){ ...... } returnwidgetEntity; }將解析好的數(shù)據(jù)存儲到SQLite數(shù)據(jù)庫中。其過程是:使用ContentResolver對象,通過URI間接調用ContentProvider,使用ContentResolver對象與ContentProvider進行交互,而ContentResolver則通過URI確定需要訪問的ContentProvider的數(shù)據(jù)集。核心代碼如下,調用關系如圖5.1所示。圖5.1ContentProvider調用關系ContentResolverresolver=context.getContentResolver();resolver.delete(forecastUri,null,null);ContentValuesvalues=newContentValues();for(ForecastEntityforecast:widgetEntity.getDetails()){ values.clear(); values.put(ForecastEntity.DAYOFWEEK,forecast.getDayOfWeek()); ...... resolver.insert(forecastUri,values); }注意:for(ForecastEntityforecast:widgetEntity.getDetails())相當于foreach語句,在widgetEntity.getDetails()集合里打印出所有類型為ForecastEntity的forecast變量。5.3.2讀取天氣數(shù)據(jù)實例 通過WebServiceHelper.getWidgetEntity()方法操作數(shù)據(jù)庫取出所需要的數(shù)據(jù),這一部分與上一節(jié)的“將解析好的數(shù)據(jù)存儲到SQLite數(shù)據(jù)庫中”的關鍵點相同,為節(jié)約篇幅,此處不贅述。5.3.3定時更新時間。AppWidget一啟動就會啟動ForcastTimeService這個后臺服務,此服務設置了每隔20秒刷新一次時間,“顯示頁面”通過這個后臺服務獲取系統(tǒng)時間從而顯示。核心代碼如下:AlarmManageralarmManager=(AlarmManager)getSystemService(Context.ALARM_SERVICE);alarmManager.set(AlarmManager.RTC_WAKEUP,now+updateMilis,pendingIntent);至此,后臺服務介紹完畢,最后還需要在AndroidManifest.xml文件中注冊后臺服務。<serviceandroid:name="ForecastService"></service><serviceandroid:name="ForecastTimeService"></service>5.4用戶界面在用戶界面設計上,采用了AppWidget框架結構,提供直觀的交互操作。三個用戶界面風格簡約、操作簡便,用戶體驗將非常好。5.4.1程序入口類ForecastWidgetForecastWidget在設計上采用了AppWidget框架結構,AppWidget就是HomeScreen上顯示的小部件,通過在HomeScreen空白處長按,在彈出的對話框中選擇Widget部件來進行創(chuàng)建。此外,長按部件后并拖動到垃圾箱里進行刪除。創(chuàng)建AppWidget需要以下四個步驟:定義Widget布局文件,此文件是res/layout/weather.xml,采用AbsoluteLayout方式進行布局需要注意的是在這個文件中所使用的組件必須是RemoteViews所支持的。定義Widget的基本屬性文件,此文件是/res/xml/weatherwidget.xml。代碼如下:<?xmlversion="1.0"encoding="utf-8"?><appwidget-providerxmlns:android=/apk/res/androidandroid:initialLayout="@layout/weather"http://Widget的布局文件//在啟動前首先要啟動ConfigureActivity進行設置android:configure="com.ty.weather.ConfigureActivity"android:minWidth="292dip"http://定義Widget組件的寬度android:minHeight="144dip"http://定義Widget組件的高度android:updatePeriodMillis="0">//更新的時間周期</appwidget-provider>創(chuàng)建ForecastWidget.java類,此類繼承自AppWidgetProvider,主要的功能有:獲取需要更新的桌面小控件;啟動獲取天氣預報信息的服務;啟動時間信息的服務;更新桌面小控件顯示內容;更新時間信息。核心代碼如下:publicclassForecastWidgetextendsAppWidgetProvider{ @OverridepublicvoidonUpdate(Contextcontext,AppWidgetManagerappWidgetManager,int[]appWidgetIds){ super.onUpdate(context,appWidgetManager,appWidgetIds); //獲取需要更新的桌面小控件 ForecastService.addWidgetIDs(appWidgetIds); //啟動獲取天氣預報信息的服務context.startService(newIntent(context,ForecastService.class)); //啟動時間信息的服務context.startService(newIntent(context,ForecastTimeService.class)); } //更新桌面小空間顯示內容publicstaticRemoteViewsupdateViews(Contextcontext,Uriuri){ } //更新時間信息publicstaticRemoteViewsupdateTime(Contextcontex
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年秋季小學數(shù)學北京課改版五年級數(shù)學(北京版)-總復習:解決長方體和正方體實際問題-1教案
- 高校科教融匯的實施路徑
- 電動自行車以舊換新營銷策略與推廣方案
- 小班樹葉戶外課程設計
- 方程式課程設計
- 商務談判的策略與技巧
- 拍攝剪輯教學 課程設計
- 如何幫助孩子樹立正確的人際關系觀
- 企業(yè)年報匯報制作流程及要點解析
- 船舶制造業(yè)綠色轉型策略與實際操作方案
- 滬科黔科版《綜合實踐活動》5上農(nóng)業(yè)小當家 活動一《花壇小暖棚》課件
- 知識圖譜構建實踐建設方案
- 2024年度跨國業(yè)務代理合同3篇
- 內科危重患者的護理
- 紀念抗日救亡一二九運動弘揚愛國精神宣傳課件
- 青少年足球培訓
- 【MOOC】寄生人體的惡魔-醫(yī)學寄生蟲學-南方醫(yī)科大學 中國大學慕課MOOC答案
- 大學生心理健康(上海交通大學)知到智慧樹章節(jié)答案
- 16大家排好隊 說課稿-2024-2025學年道德與法治一年級上冊統(tǒng)編版
- 2025人教版九年級英語全冊知識點清單
- 醫(yī)院緊急情況一鍵報警制度建設
評論
0/150
提交評論