畢業(yè)論文基于Android平臺的3G手機氣象預報軟件設計與實現(xiàn)16000

上傳人:1777****777 文檔編號:37824787 上傳時間:2021-11-04 格式:DOC 頁數:43 大小:950.03KB
收藏 版權申訴 舉報 下載
畢業(yè)論文基于Android平臺的3G手機氣象預報軟件設計與實現(xiàn)16000_第1頁
第1頁 / 共43頁
畢業(yè)論文基于Android平臺的3G手機氣象預報軟件設計與實現(xiàn)16000_第2頁
第2頁 / 共43頁
畢業(yè)論文基于Android平臺的3G手機氣象預報軟件設計與實現(xiàn)16000_第3頁
第3頁 / 共43頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《畢業(yè)論文基于Android平臺的3G手機氣象預報軟件設計與實現(xiàn)16000》由會員分享,可在線閱讀,更多相關《畢業(yè)論文基于Android平臺的3G手機氣象預報軟件設計與實現(xiàn)16000(43頁珍藏版)》請在裝配圖網上搜索。

1、目錄 密級: Android平臺3G手機氣象軟件 摘要 隨著智能手機的快速普及,智能手機操作系統(tǒng)市場風生水起。為了讓智能手機用戶能夠隨時隨地查詢互聯(lián)網所提供的服務,一種高效的辦法就是將應用系統(tǒng)的功能拓展到手機終端上,讓手機能夠通過移動網以及互聯(lián)網訪問Web網站并處理各種各樣的業(yè)務。因此,智能手機的應用軟件及其需要的服務將有廣闊的發(fā)展前景。 在如今這個智能手機系統(tǒng)群雄紛爭的時候,2008年Google推出了一款名為Android的開源智能手機操作系統(tǒng),它采用Linux內核,開放手機聯(lián)盟(OHA)成員可以任意使用和修改SDK包,系統(tǒng)的開源性使其具有良好的拓展性。這

2、款軟件包括了操作系統(tǒng)、用戶界面和應用程序,即智能手機工作所需要的全部軟件。Android的最大特點是其開放性體系架構,不僅具有非常好的開發(fā)、調試環(huán)境,而且還支持各種可擴展的用戶體驗,包括豐富的圖形組件、多媒體支持功能以及強大的瀏覽器。因此,對于軟件從業(yè)人員來說,Android平臺具有無限的吸引力。 本文就在分析討論Android手機軟件開發(fā)技術原理的基礎上,開發(fā)出能為用戶提供更好的基于Android平臺的3G手機氣象軟件。 關鍵字:android;氣象軟件;智能手機平臺 Abstract With the rapid proliferation of

3、 smart phones, smart phone operating system market, wind and water. In order for smart phone users to check the Internet anytime, anywhere services provided an efficient way to expand the function of the system will be applied to the mobile phone terminal, the mobile phone to Internet access via mob

4、ile networks, and variety of Web sites and process business. Therefore, the smart phone applications and the need for the service will have broad prospects for development. In todays smart phone system when disputes warlords, 2008, Google introduced a smart phone called the Android open source ope

5、rating system, which uses Linux kernel, Open Handset Alliance (OHA) members can be free to use and modify the SDK package, the system It has a good open-source nature of the expansion of. The software includes the operating system, user interface and applications that need to work smart phones all t

6、he software. Androids biggest feature is its open architecture, not only has a very good development and debugging environment, but also supports a variety of scalable user experience, including rich graphical components, multimedia support, and powerful browser. Therefore, for software professional

7、s is, Android platform has unlimited appeal. In this paper, the analysis and discussion Android mobile phone software development technology on the basis of the principle, developed to provide users with better platform to the 3G handsets based on Android meteorological software. Keywords:andro

8、id;weather software;smartphone platform 目 錄 摘要 I Abstract II 第一章 緒論 1 1.1 研究內容 1 1.2 研究意義 1 1.3 研究現(xiàn)狀和發(fā)展趨勢 1 第二章 系統(tǒng)分析 3 2.1 研究目標 3 2.2 需求分析 3 2.3 性能分析 3 第三章 系統(tǒng)開發(fā)環(huán)境及相關技術 4 3.1 Android開發(fā)環(huán)境介紹 4 3.2 Android開發(fā)平臺搭建 4 第四章 程序設計 6 4.1 用戶界面設計 6 4.2 數據庫設計 6 4.3 程序模塊設計 7

9、第五章 程序開發(fā) 9 5.1 文件結構與用途 9 5.2 數據提供者 10 5.3 后臺服務 16 5.3.1 獲取天氣數據 16 5.3.2 讀取天氣數據實例 19 5.3.3 定時更新時間。 19 5.4 用戶界面 19 5.4.1 程序入口類ForecastWidget 19 5.4.2 設置頁面ConfigureActivity 21 5.4.3 詳細頁面DetailForecastActivity 22 5.5 動態(tài)特效 23 第六章 系統(tǒng)測試 25 第七章 總結 29 參考文獻 30 致 謝 31 第一章 緒論 第一章

10、緒論 1.1 研究內容 Android平臺3G手機氣象軟件是基于Android手機平臺,運用Java語言,從Google上獲取天氣預報信息,開發(fā)出針對使用Android平臺的手機天氣預報系統(tǒng)。 1.2 研究意義 Android平臺3G手機氣象軟件的開發(fā)可以進一步擴大氣象信息的覆蓋面,讓廣大公眾能夠在第一時間方便且快捷地獲取最新的氣象預報(預警)信息,以便提前預防,把氣象災害造成的損失降到最低。同時也可以強化氣象公共服務的職能,完善公共服務體系、改善公共服務手段、增加公共服務產品、提高公共服務質量,更好地發(fā)揮了氣象事業(yè)對經濟社會發(fā)展的現(xiàn)實性作用。 1.3研究現(xiàn)狀和發(fā)展趨勢 據Ga

11、rtner最新數據顯示,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)性平臺,有利于移動應用的集合;另一方面,終端

12、廠商可以針對自身的特殊需要“定制化開發(fā)”。與此相比,盡管2010年2月,塞班基本完成開源工作,但由于代碼臃腫,用戶界面設計缺失,塞班的開源并無實際意義,錯失發(fā)展良機。 據Informa預測,2012年,安卓手機銷量將超過諾基亞塞班手機,屆時安卓將成為全球最大的智能手機平臺。谷歌表示目前安卓手機每日平均激活量為20萬部,銷售速度加速上漲。   我們認為,安卓在全球市場的成長壯大,塞班市場份額不斷下跌已成不爭事實。安卓操作系統(tǒng)發(fā)展迅猛主要得益于免費、開源和良好產業(yè)運作策略,這三點為安卓在智能手機市場贏得更多的發(fā)展機遇。系統(tǒng)的免費讓更多的廠商加入,推動了份額的上升;代碼的開源讓更多的開發(fā)者進入應

13、用開發(fā);應用的豐富吸引了更多用戶選擇,這也是谷歌值得眾多廠商學習的地方。此外,谷歌通過OHA聯(lián)合眾多廠商進行系統(tǒng)研發(fā),不斷更新版本,將系統(tǒng)應用推廣到更多的終端產品中,確保用戶體驗持續(xù)改善。 第一章 系統(tǒng)分析 第二章 系統(tǒng)分析 2.1 研究目標 (1) 了解Android應用程序的設計和開發(fā)過程; (2) 使用多種組件進行Android 平臺3G手機氣象軟件的開發(fā)。 本軟件是基于Eclipse的開發(fā)環(huán)境,依托Google氣象數據建立氣象信息數據庫,開發(fā)出了針對Android平臺的手機天氣預報系統(tǒng)。 2.2 需求分

14、析 本軟件是一個App Widget應用程序,啟動程序后可以進行城市、更新頻率的設置,可以通過圖片和文字顯示當前和未來的天氣狀況,包括溫度、濕度、風向和雨雪情況等。這些天氣數據是通過后臺服務獲取的,這個后臺服務可以按照一定時間間隔,從Google上獲取天氣預報信息,并將天氣信息保存在數據庫中。 從上面的描述中可以基本了解軟件的功能需求: (1) 啟動App Widget應用程序; (2) 設置界面:對要顯示天氣預報的城市及更新頻率進行設置; (3) 顯示界面:通過文字和圖片顯示當前的天氣情況,包括日期、時間、城市、最高溫度、最低溫度、當前溫度等。 (4) 詳細界面:通過文字圖片動畫

15、顯示當前的天氣情況,包括城市當前天氣、溫度、風向、風速、濕度;同時顯示今后四天的天氣情況。 2.3 性能分析 程序響應速度快、安全性高、信息處理速度快。 第三章 系統(tǒng)開發(fā)環(huán)境及相關技術 第三章 系統(tǒng)開發(fā)環(huán)境及相關技術 3.1 Android開發(fā)環(huán)境介紹 Android的上層應用程序是用Java語言開發(fā),同時還需要基于Dalvik虛擬機,所以,Google公司推薦使用主流的Java繼承開發(fā)環(huán)境Eclipse。只有Eclipse還不夠,因為是使用Java語言進行開發(fā),還應該有由SUN公司提供的Java SDK(其中包括JRE:Java Runtime Env

16、ironment)。此外,Android的應用程序開發(fā)和Java開發(fā)有較大區(qū)別的,所以還需要有Google提供的Android SDK。同時,還需要在Eclipse安裝ADT,為Android開發(fā)提供開發(fā)工具的升級或者變更,是Eclipse下開發(fā)工具的升級下載的工具。 簡言之,需要以下軟件,才能搭建Android開發(fā)環(huán)境,從而進行Android應用程序的開發(fā)。 (1) Java SDK (2) Eclipse (3) Android SDK (4) ADT 3.2 Android開發(fā)平臺搭建 Android開發(fā)平臺搭建步驟: ①首先到http://www.eclipse.o

17、rg/downloads/下載Eclipse集成開發(fā)環(huán)境并且解壓,這里推薦下載Java EE 集成版本,可以為平臺的搭建省下不少工作。接著再去 站點下載SDK后安裝,下載 SDK1.5后解壓。第一步下載工序就結束了。 ②雙擊Eclipse解壓后目錄中的eclipse.exe然后啟動,選擇Eclipse菜單中的Help-> Install New Software-> 選項卡上的Available Software,點擊右側的“Add”輸入http://dl- with”下拉菜單中選擇剛才輸入的網址。過一會就會出現(xiàn)一個Developer Tools選項,勾上以后點擊Next以后Eclipse會

18、自動網上查找Android 開發(fā)工具插件,然后找到Android DDMS和Android Development Tools,選中這兩個點擊Finish,Eclipse就會自動下載并安裝Android插件了,最后會提示重啟Eclipse。 ③重啟后選擇Eclipse菜單中的Windows-> Preferences 在左側的Android項目中SDK Location中填入Android SDK解壓后的目錄,然后點擊Apply。 ④在WindowsXP的系統(tǒng)變量中的path變量中添加一個值,該值指向解壓后的Android SDK目錄下的tools文件夾。

19、 第四章 程序設計 第四章 程序設計 4.1 用戶界面設計 根據需求分析可以知道,應用程序應包含三個主要的用戶界面,這里需要進一步分析每個用戶界面中應該包括哪些顯示內容。 在“設置頁面”中,需要對要顯示天氣預報的城市及更新頻率進行設置。在“顯示頁面”中,顯示當前的天氣狀況,包括城市名稱、溫度、濕度、風向、雨雪情況和獲取數據時間等信息。在“詳細頁面”動態(tài)顯示當前天氣情況,還要顯示未來四天的天氣情況。 根據對用戶界面顯示內容的分析,繪制出用戶界面的草圖,如圖4-1所示。 圖4-1 用戶界面草圖

20、4.2 數據庫設計 本軟件中有兩部分數據需要存儲,一個是顯示頁面的數據,另一個詳細頁面的數據。因此選擇SQLite數據庫作為存儲數據的方法,建立數據庫forcasts.db,并且建立兩張表weather_forcastt和weather_widget,分別存儲顯示頁面的數據和詳細頁面的數據。 表4-1 詳細頁面的數據庫表weather_forcast的結構 屬性 數據類型 說明 _id integer 自動增加的主鍵 widgetId integer 組件的ID號 dayOfWeek text 周幾 low integer 最低溫度 hight in

21、teger 最高溫度 icon text 顯示天氣的圖標 condition text 未來天氣情況 表4-2 顯示頁面的數據庫表weather_widget的結構 屬性 數據類型 說明 _id integer 存儲Widget組件id city text 進行天氣信息查詢的城市名 updateMilis text 進行天氣信息查詢的頻率,單位為分/次 isConfigured text 是否設置 postalCode text 城市標記 forecastDate integer 預報日期 condition text 當前天

22、氣情況 tempF integer 最高溫度 tempC integer 最低溫度 humidity text 當前濕度 icon text 天氣圖標 windCondition text 風向風速情況 lastUpdateTime integer 最后一次更新時間 4.3 程序模塊設計 從功能需求上分析可以看出,整個應用程序應劃分為4個模塊,分別是程序啟動、用戶界面、后臺服務和數據庫適配器,各模塊之間的關系如圖4-2所示。 從模塊結構圖中不難看出,后臺服務是整個應用程序的核心,主要是“數據獲取模塊”,負責周期性的從Google獲取天氣信

23、息。后臺服務在程序啟動時就由AppWidgetProvider啟動,也可由用戶界面通過startService()進行啟動,啟動后的后臺服務將一直保持運行狀態(tài)。 用戶界面從數據庫中獲取天氣信息,而沒有直接通過網絡訪問Google的天氣數據。之所以這么實際,一方面可以避免因網絡通信不暢造成界面失去響應;另一方面,后臺服務可以及時更新數據,以保證數據的準確性。 數據庫適配器封裝了所有對SQLite數據庫操作的方法,用戶界面和后臺服務會調用它來實現(xiàn)數據庫操作。 在完成用戶界面設計、數據庫設計和模塊設計后,至此程序設計階段基本完成。

24、 第五章 程序開發(fā) 第五章 程序開發(fā) 5.1 文件結構與用途 在程序開發(fā)階段,首先確定“Android平臺3G手機氣象軟件”的工程名為ty-weather,據程序模塊設計的內容,建立ty-weather工程。Weather工程源代碼的結構如圖5.1所示。 圖5.1 ty-weather工程的源代碼文件 為了使源代碼文件的結構更加清晰,Weather工程設置了多個命名空間,分別用來保存用戶界面、數據庫、后臺服務和工具實體的源代碼文件,源代碼文件的名稱以及說明如表5.1所示。 表5.1 ty-weather工程的文件用途說明 包 名 稱 文 件 名 說

25、 明 com.ty.weather ConfigureActivity.java “設置頁面”的Activity com.ty.weather DetailForecastActivity.java “詳細頁面”的Activity com.ty.weather ForecastProvider.java 天氣預報相關數據提供者,操作數據庫 com.ty.weather ForecastService.java 后臺進程內服務 com.ty.weather ForecastTimeService.java 后臺時間服務 com.ty.weather Forec

26、astWidget.java 實現(xiàn)AppWidget組件,并啟動服務 com.ty.weather WebServiceHelper.java 網絡數據獲取模塊 com.ty.weather.util ForecastEntity.java 未來天氣信息的類 com.ty.weather.util ForecastUtil.java 天氣信息工具類 com.ty.weather.util WidgetEntity.java 當前天氣信息的類 Android的資源文件保存在/res的子目錄中。其中、/res/anim目錄中保存的是產生動畫效果的XML文件,/res/d

27、rawable/目錄中保存的是圖像文件,/res/values目錄中保存的是用來自定義字符串和顏色的文件,/res/xml目錄中保存的是XML格式的數據文件。所有在程序開發(fā)階段可以被調用的資源都保存在這些目錄中,具體每個資源文件的用途可以參考表5.2: 表5.2 資源文件名稱與用途 資源目錄 文 件 說 明 anim rotatecurrentweather.xml 漸變透明度動畫效果 translatecloudleft.xml 畫面轉換位置移動動畫效果(從左至右) translatecloudright.xml 畫面轉換位置移動動畫效果(從右至左) trans

28、laterain01.xml 畫面轉換位置移動動畫效果(從上至下) translaterain02.xml 畫面轉換位置移動動畫效果(從上至下) translaterain03.xml 畫面轉換位置移動動畫效果(從上至下) translaterain04.xml 畫面轉換位置移動動畫效果(從上至下) translaterain05.xml 畫面轉換位置移動動畫效果(從上至下) drawable cloudy.png 這個文件夾里是工程里所用的圖片,如有表示天氣狀況、數字等,此處不贅述。 dots.png number_7_tahoma.png weather_su

29、nny.png layout configure.xml 設置城市、天氣更新頻率的布局 weather.xml “顯示頁面”的布局 detail.xml “詳細顯示”頁面上邊的顯示當前天氣的布局 detailitems.xml “詳細顯示”頁面下邊的顯示未來天氣的布局 values color.xml 保存顏色的XML文件 strings.xml 保存字符串的XML的文件 xml weatherwidget.xml AppWidget的屬性文件 5.2 數據提供者 數據提供者ForecastProvider繼承ContentProvider,是在應

30、用程序間共享數據的一種接口機制。應用程序在不同的進程中運行,因此,數據和文件在不同的應用程序之間是不能夠直接進行訪問的。而CotentProvider為程序員提供了較高級的數據共享方法,應用程序可以指定需要共享的數據,而其他應用程序則可以在不知數據來源、路徑的情況下,對共享數據進行查詢、添加、刪除和更新等操作。 在介紹ForecastProvider的核心代碼前,首先了解一下WidgetEntity.java(當前天氣信息的類)和ForecastEntity.java(未來天氣信息的類)。 (1) WidgetEntity.java的部分代碼: public class Widg

31、etEntity { private ArrayList details = new ArrayList(); //ForecastEntity對象 private Integer id; //編號 private Integer updateMilis; //更新頻率 private String city; //城市 private String postalCode; //城市標記 private Long forecastDate; //預報時間 private String c

32、ondition; //天氣情況 private Integer tempF; //華氏溫度 private Integer tempC; //攝氏溫度 private String humidity; //濕度 private String icon; //天氣圖標 private String windCondition; //風力風向 private Long lastUpdateTime; //最后更新時間 private Integer isConfigured; //是否已設置 ...... } 從代碼中可以看出,除Forec

33、astEntity 的對象details, WidgetEntity類中有以上公有靜態(tài)屬性id、updateMilis 、updateMilis、postalCode、forecastDate、condition、tempF、tempC、humidity、icon、windCondition、lastUpdateTime、isConfigured,完全對應數據庫中weather_widget的表。 (2) ForecastEntity.java的部分代碼: public class ForecastEntity { private Integer id; //編號 private

34、 String dayOfWeek; //星期 private Integer low; //最低溫度 private Integer hight; //最高溫度 private String icon; //天氣圖標 private String condition; //天氣情況 private Integer widgetId; //組件id 從代碼中可以看出,WidgetEntity類中有以上公有靜態(tài)屬性id、dayOfWeek、low、hight、icon、condition、widgetId,完全對應數據庫中weather_forcast的表。

35、 在創(chuàng)建ForecastProvider時,首先需要使用數據庫、文件系統(tǒng)或網絡實現(xiàn)底層存儲功能,這里我們采用數據庫建立了數據庫設計中的兩張表,從而實現(xiàn)了底層存儲功能。然后在繼承ContentProvider的類中實現(xiàn)基本數據操作的接口函數,包括添加、刪除、查找和更新等功能。下面就核心代碼進行分析。 (1) 創(chuàng)建數據庫:DatabaseHelper類繼承SQLiteOpenHelper,SQLiteOpenHelper這個類可以輔助建立、更新和打開數據庫。DatabaseHelper在建立數據庫時,同時建立了兩個數據庫表weather_widget和weather_forcast,并對保存配

36、置信息的表進行了初始化。具體代碼如下所示: private static class DatabaseHelper extends SQLiteOpenHelper { //數據庫名稱 private static final String DATABASE_NAME = "forecasts.db"; //數據庫版本 private static final int DATABASE_VERSION = 2; //構造方法,重載父類構造 public DatabaseHelper(Context context) { super(context,

37、 DATABASE_NAME, null, DATABASE_VERSION); } public void onCreate(SQLiteDatabase db) { //創(chuàng)建weather_widget表 public void onCreate(SQLiteDatabase db) { //創(chuàng)建weather_widget表 db.execSQL("CREATE TABLE " + TABLE_WIDGET + " (" ......); //創(chuàng)建weather_forecast表 db.execSQL("CREATE

38、 TABLE " + TABLE_FORECAST + " (" ......); } } //重寫onUpgrade()方法 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { ...... } } } (2) URI設置:ContentProvider可以提供多個數據集,調用者使用URI(通用資源標識符)對不同的數據集的數據進行操作。URI用來地位任何遠程或本地的可用資源。ContentProvi

39、der使用的URI語法結構content:////。因此,我們就需要先來對URI進行設置。代碼如下: public static class WeatherWidgets implements BaseColumns { //繼承BaseColumns可以提供自動生成的ID //聲明CONTENT_URI public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/widgets"); public stat

40、ic final String FORECAST_END = "forecasts"; //指操作多條數據 public static final String CONTENT_TYPE = "vnd.android.cursor.dir/awidget"; //指操作單條數據 public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/widget"; } (3) 查詢功能:首先我們先了解一下SQLiteQueryBuilder的query()方法。query(SQLiteDat

41、abase db, String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder, String limit),參數說明如表5.3: 參 數 說 明 SQLiteDatabase db 要查詢的數據庫實例 String[] projectionIn 是一個字符串數組,里邊的每一項代表了需要返回的列名 String selection 相當于SQL語句中的where部分 String[] selectionArg

42、s 是一個字符串數組,里邊的每一項依次替代在第三個參數中出現(xiàn)的問號(?) String groupBy 相當于SQL語句當中的groupby部分 String having 相當于SQL語句當中的having部分 String sortOrder 描述是怎么進行排序 String limit 相當于SQL當中的limit部分,控制返回的數據的個數 查詢功能的核心代碼如下: public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, Str

43、ing sortOrder) { //getReadableDatabase()這個函數會數據庫是否存在、版本號和是否可讀等情況, //決定在返回數據庫對象前,是否需要數據庫。返回一個可讀的數據庫對象。 SQLiteDatabase db = dbHelper.getReadableDatabase(); //聲明了一個SQLiteQueryBuilder對象,該對象利用傳入的參數生成一個完整的 //sqlite查詢語句,還可以完成查詢工作并返回結果集(Cursor)。 SQLiteQueryBuilder qb = new SQLiteQueryBuild

44、er(); String limit = null; //通過一個switch語句,完成了通過uri種類的辨別來生成不通的SQLiteQueryBuilder對象的工作。 switch (uriMatcher.match(uri)) { case WIDGETS: { qb.setTables(TABLE_WIDGET); break; } case WIDGETS_ID: { String appWidgetId = uri.getPathSegments

45、().get(1); qb.setTables(TABLE_WIDGET); qb.appendWhere(BaseColumns._ID + "=" + appWidgetId); break; } case WIDGETS_FORECASTS: { // Pick all the forecasts for given widget, sorted by date and // importance //獲

46、得appWidgetId String appWidgetId = uri.getPathSegments().get(1); //為該SQLiteQueryBuilder對象設置它查詢工作將針對的表 qb.setTables(TABLE_FORECAST); //qb的where條件 qb.appendWhere(ForecastEntity.WIDGET_ID + "=" + appWidgetId); //按照BaseColumns.

47、_ID進行排序 sortOrder = BaseColumns._ID + " ASC"; break; }case FORECASTS: { qb.setTables(TABLE_FORECAST); break; } case FORECASTS_ID: { String forecastId = uri.getPathSegments().get(1); qb.setTables(TABLE_FORECAST); qb.appendWhere(BaseColumns.

48、_ID + "=" + forecastId); break; } } return qb.query(db, projection, selection, selectionArgs, null, null,sortOrder, limit); } (4) 添加、刪除、更新功能由于核心代碼類似,此處不一一贅述。 添加功能: public Uri insert(Uri uri, ContentValues values) {} 刪除功能: public int delete(Uri uri, String selection, String[] se

49、lectionArgs) {} 更新功能: public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {} (5) 類型匹配:增刪改查通過switch判斷,進行不同的操作,因而還需要對關鍵字進行類型匹配。核心代碼如下: /*getType()函數用來返回指定URI的MIME數據類型 * CONTENT_TYPE表示URI是多條數據 * CONTENT_ITEM_TYPE表示是單條數據 */ @Override public Str

50、ing getType(Uri uri) { // TODO Auto-generated method stub switch (uriMatcher.match(uri)) { case WIDGETS: return WeatherWidgets.CONTENT_TYPE; case WIDGETS_ID: return WeatherWidgets.CONTENT_ITEM_TYPE; case WIDGETS_FORECASTS: retur

51、n WeatherDetails.CONTENT_TYPE; case FORECASTS: return WeatherDetails.CONTENT_TYPE; case FORECASTS_ID: return WeatherDetails.CONTENT_ITEM_TYPE; } throw new IllegalStateException(); } //構造無匹配方式的uriMatcher private static final UriMatcher uriMatcher = new UriMatcher( UriMatc

52、her.NO_MATCH); private static final int WIDGETS = 101; private static final int WIDGETS_ID = 102; private static final int WIDGETS_FORECASTS = 103; private static final int FORECASTS = 201; private static final int FORECASTS_ID = 202; //聲明了uriMatcher的匹配方式和返回代碼 static { uriMatche

53、r.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); } }

54、 5.3 后臺服務 后臺服務是ty-weather工程的核心模塊,在用戶啟動后持續(xù)在后臺運行,直到用戶停止服務。后臺服務主要有三個功能,一是周期性的獲取Google的天氣數據并存儲到SQLite,二是從SQLite讀取出要顯示的數據,三是定時更新“顯示頁面”的時間。 5.3.1 獲取天氣數據 天氣數據的獲取天氣數據分為以下三個步驟: (1) 從Google提供的Web Service中獲取的天氣數據,數據的獲取地址是: public static WidgetEntity queryWebservice(String postalCode) throws Forecas

55、tParseException { //編碼出錯 if (postalCode == null) { throw new ForecastParseException("can not covert to entity"); } Reader responseReader; WidgetEntity widgetEntity = null; //通過HttpClient創(chuàng)建Http連接 HttpClient client = new DefaultHttpClient(); //創(chuàng)建Http Get請求 HttpGet request

56、= new HttpGet(String.format(WEBSERVICE_URL, postalCode)); try { Log.d(TAG, "get googles weather infomation"); //發(fā)出請求 HttpResponse response = client.execute(request); StatusLine status = response.getStatusLine(); Log.d(TAG, "Request returned status " + status); //取出回復信息

57、 HttpEntity entity = response.getEntity(); responseReader = new InputStreamReader(entity.getContent(), "GB2312"); } catch (IOException e) { throw new ForecastParseException("Problem calling forecast API", e); } if (responseReader != null) { widgetEntity = parseResponse(responseR

58、eader); } return widgetEntity; } (2) 調用輕量級XML解析器XmlPullParser對從網絡上獲取的字節(jié)流數據進行解析,并且將解析結果保存在WidgetEntity對象中。核心代碼如下: //返回類型為WidgetEntity private static WidgetEntity parseResponse(Reader responseReader) throws ForecastParseException { ...... try { //使用工廠類XmlPullParserFactory來創(chuàng)建解析

59、器XmlPullParser XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xpp = factory.newPullParser(); String tagName = null; xpp.setInput(responseReader); int eventType = xpp.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { if (e

60、ventType == XmlPullParser.START_TAG) { tagName = xpp.getName(); //根據不同的標簽做不同的解析 if (PROBLEM_CAUSE.equals(tagName)) { throw new ForecastParseException( "the city is non correct!"); } else if (FORECAST_INFORMATION.equals(tagName)) { dealWithInfomation(tag

61、Name, widgetEntity, xpp); } else if (CURRENT_CONDITIONS.equals(tagName)) { dealWithCurrentConditions(tagName, widgetEntity, xpp); } else if (FORECAST_CONDITIONS.equals(tagName)) { dealWithForecastConditions(tagName, widgetEntity, xpp); } } eventType = xpp.ne

62、xt(); } } catch (IOException e) { ...... } return widgetEntity; } (3) 將解析好的數據存儲到SQLite數據庫中。其過程是:使用ContentResolver對象,通過URI間接調用ContentProvider,使用ContentResolver對象與ContentProvider進行交互,而ContentResolver則通過URI確定需要訪問的ContentProvider的數據集。核心代碼如下,調用關系如圖5.1所示。 圖5.1 ContentProvider調用關系

63、 ContentResolver resolver = context.getContentResolver(); resolver.delete(forecastUri, null, null); ContentValues values = new ContentValues(); for (ForecastEntity forecast : widgetEntity.getDetails()) { values.clear(); values.put(ForecastEntity.DAYOFWEEK, forecast.getDayOfWeek()); .

64、..... resolver.insert(forecastUri, values); } 注意: for (ForecastEntity forecast : widgetEntity.getDetails())相當于foreach語句,在widgetEntity.getDetails()集合里打印出所有類型為ForecastEntity的forecast變量。 5.3.2 讀取天氣數據實例 通過WebServiceHelper.getWidgetEntity()方法操作數據庫取出所需要的數據,這一部分與上一節(jié)的“將解析好的數據存儲到SQLite數據庫中”的關鍵

65、點相同,為節(jié)約篇幅,此處不贅述。 5.3.3 定時更新時間。 AppWidget一啟動就會啟動ForcastTimeService這個后臺服務,此服務設置了每隔20秒刷新一次時間,“顯示頁面”通過這個后臺服務獲取系統(tǒng)時間從而顯示。核心代碼如下: AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, now + updateMilis, pendingIntent); 至此,后臺服務介紹完畢,最后還需要在AndroidManifest.xml文件中注冊后臺服務。 5.4 用戶界面 在用戶界面設計上,采用了AppWidget框架結構,提供直觀的交互操作。三個用戶界面風格簡約、操作簡便,用戶體驗將非常好。 5.4.1 程序入口類ForecastWidget ForecastWidget在設計上采用了AppWidget框架結構,

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網版權所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對上載內容本身不做任何修改或編輯。若文檔所含內容侵犯了您的版權或隱私,請立即通知裝配圖網,我們立即給予刪除!