

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 密級(jí): </p><p> 學(xué) 士 學(xué) 位 論 文</p><p> THESIS OF BACHELOR</p><p> ?。?007—2011年)</p><p> 題 目:基于Android平臺(tái)的3G氣象軟件</p><p> 學(xué) 院: 軟件學(xué)院 系
2、 計(jì)算機(jī)軟件 </p><p> 專 業(yè): 計(jì)算機(jī)軟件 </p><p> 學(xué) 號(hào): </p><p> 姓 名: </p><p> 指導(dǎo)教師:
3、 </p><p> 起訖日期: 2010年12月至2011年5月 </p><p> Android平臺(tái)3G手機(jī)氣象軟件</p><p> 專 業(yè):計(jì)算機(jī)軟件 學(xué) 號(hào):</p><p> 學(xué)生姓名: 指導(dǎo)老師: &l
4、t;/p><p><b> 摘要</b></p><p> 隨著智能手機(jī)的快速普及,智能手機(jī)操作系統(tǒng)市場(chǎng)風(fēng)生水起。為了讓智能手機(jī)用戶能夠隨時(shí)隨地查詢互聯(lián)網(wǎng)所提供的服務(wù),一種高效的辦法就是將應(yīng)用系統(tǒng)的功能拓展到手機(jī)終端上,讓手機(jī)能夠通過(guò)移動(dòng)網(wǎng)以及互聯(lián)網(wǎng)訪問(wèn)Web網(wǎng)站并處理各種各樣的業(yè)務(wù)。因此,智能手機(jī)的應(yīng)用軟件及其需要的服務(wù)將有廣闊的發(fā)展前景。</p>&
5、lt;p> 在如今這個(gè)智能手機(jī)系統(tǒng)群雄紛爭(zhēng)的時(shí)候,2008年Google推出了一款名為Android的開源智能手機(jī)操作系統(tǒng),它采用Linux內(nèi)核,開放手機(jī)聯(lián)盟(OHA)成員可以任意使用和修改SDK包,系統(tǒng)的開源性使其具有良好的拓展性。這款軟件包括了操作系統(tǒng)、用戶界面和應(yīng)用程序,即智能手機(jī)工作所需要的全部軟件。Android的最大特點(diǎn)是其開放性體系架構(gòu),不僅具有非常好的開發(fā)、調(diào)試環(huán)境,而且還支持各種可擴(kuò)展的用戶體驗(yàn),包括豐富的圖形
6、組件、多媒體支持功能以及強(qiáng)大的瀏覽器。因此,對(duì)于軟件從業(yè)人員來(lái)說(shuō),Android平臺(tái)具有無(wú)限的吸引力。</p><p> 本文就在分析討論Android手機(jī)軟件開發(fā)技術(shù)原理的基礎(chǔ)上,開發(fā)出能為用戶提供更好的基于Android平臺(tái)的3G手機(jī)氣象軟件。</p><p> 關(guān)鍵字:android;氣象軟件;智能手機(jī)平臺(tái)</p><p><b> Abstr
7、act</b></p><p> With the rapid proliferation of smart phones, smart phone operating system market, wind and water. In order for smart phone users to check the Internet anytime, anywhere services provi
8、ded 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 mobile networks, and variety of Web sites and process business. Therefore, t
9、he smart phone applications and the need for the service will have broad prospects for developme</p><p> In today's smart phone system when disputes warlords, 2008, Google introduced a smart phone calle
10、d the Android open source operating 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
11、 software includes the operating system, user interface and applications that need to work smart phones all the software. Android's biggest feature is its open architecture, not only </p><p> In this pa
12、per, 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 soft
13、ware.</p><p> Keywords:android;weather software;smartphone platform</p><p><b> 目 錄</b></p><p><b> 摘要I</b></p><p> AbstractII</p>&
14、lt;p><b> 第一章緒論1</b></p><p> 1.1 研究?jī)?nèi)容1</p><p> 1.2 研究意義1</p><p> 1.3 研究現(xiàn)狀和發(fā)展趨勢(shì)1</p><p> 第二章 系統(tǒng)分析3</p><p> 2.1 研究目標(biāo)3</p>
15、<p> 2.2 需求分析3</p><p> 2.3 性能分析3</p><p> 第三章 系統(tǒng)開發(fā)環(huán)境及相關(guān)技術(shù)4</p><p> 3.1 Android開發(fā)環(huán)境介紹4</p><p> 3.2 Android開發(fā)平臺(tái)搭建4</p><p> 第四章 程序設(shè)計(jì)6</p&g
16、t;<p> 4.1 用戶界面設(shè)計(jì)6</p><p> 4.2 數(shù)據(jù)庫(kù)設(shè)計(jì)6</p><p> 4.3 程序模塊設(shè)計(jì)7</p><p> 第五章程序開發(fā)9</p><p> 5.1 文件結(jié)構(gòu)與用途9</p><p> 5.2 數(shù)據(jù)提供者10</p><
17、;p> 5.3 后臺(tái)服務(wù)16</p><p> 5.3.1 獲取天氣數(shù)據(jù)16</p><p> 5.3.2 讀取天氣數(shù)據(jù)實(shí)例19</p><p> 5.3.3 定時(shí)更新時(shí)間。19</p><p> 5.4 用戶界面19</p><p> 5.4.1 程序入口類ForecastWi
18、dget19</p><p> 5.4.2 設(shè)置頁(yè)面ConfigureActivity21</p><p> 5.4.3 詳細(xì)頁(yè)面DetailForecastActivity22</p><p> 5.5 動(dòng)態(tài)特效23</p><p> 第六章 系統(tǒng)測(cè)試25</p><p><b>
19、第七章總結(jié)29</b></p><p><b> 參考文獻(xiàn)30</b></p><p><b> 致 謝31</b></p><p><b> 第一章緒論</b></p><p><b> 1.1 研究?jī)?nèi)容</b><
20、/p><p> Android平臺(tái)3G手機(jī)氣象軟件是基于Android手機(jī)平臺(tái),運(yùn)用Java語(yǔ)言,從Google上獲取天氣預(yù)報(bào)信息,開發(fā)出針對(duì)使用Android平臺(tái)的手機(jī)天氣預(yù)報(bào)系統(tǒng)。</p><p><b> 1.2 研究意義</b></p><p> Android平臺(tái)3G手機(jī)氣象軟件的開發(fā)可以進(jìn)一步擴(kuò)大氣象信息的覆蓋面,讓廣大公眾能夠在
21、第一時(shí)間方便且快捷地獲取最新的氣象預(yù)報(bào)(預(yù)警)信息,以便提前預(yù)防,把氣象災(zāi)害造成的損失降到最低。同時(shí)也可以強(qiáng)化氣象公共服務(wù)的職能,完善公共服務(wù)體系、改善公共服務(wù)手段、增加公共服務(wù)產(chǎn)品、提高公共服務(wù)質(zhì)量,更好地發(fā)揮了氣象事業(yè)對(duì)經(jīng)濟(jì)社會(huì)發(fā)展的現(xiàn)實(shí)性作用。</p><p> 1.3研究現(xiàn)狀和發(fā)展趨勢(shì)</p><p> 據(jù)Gartner最新數(shù)據(jù)顯示,2010年第二、三季度全球智能手機(jī)銷售繼續(xù)大
22、幅增長(zhǎng),其中第三季度安卓占全球智能手機(jī)市場(chǎng)的25.5%,僅次于塞班,成為第二大智能手機(jī)系統(tǒng)。2010第二、三季度與去年同期相比,增度分別是15.4%及22%,增勢(shì)迅猛。而塞班系統(tǒng)較09年的市場(chǎng)份額,盡管終端銷量有大幅度提升,但增勢(shì)下滑10%,形勢(shì)非常嚴(yán)峻。其他操作系統(tǒng)的表現(xiàn)則要平穩(wěn)很多。</p><p> 安卓是首款開源代碼的操作系統(tǒng),采用Linux內(nèi)核,開放手機(jī)聯(lián)盟(OHA)成員可以任意使用和修改安卓的SDK
23、軟件包。系統(tǒng)的開源性使其具有良好的拓展性,一方面,為眾多移動(dòng)應(yīng)用開發(fā)者提供了良好的系統(tǒng)性平臺(tái),有利于移動(dòng)應(yīng)用的集合;另一方面,終端廠商可以針對(duì)自身的特殊需要“定制化開發(fā)”。與此相比,盡管2010年2月,塞班基本完成開源工作,但由于代碼臃腫,用戶界面設(shè)計(jì)缺失,塞班的開源并無(wú)實(shí)際意義,錯(cuò)失發(fā)展良機(jī)。</p><p> 據(jù)Informa預(yù)測(cè),2012年,安卓手機(jī)銷量將超過(guò)諾基亞塞班手機(jī),屆時(shí)安卓將成為全球最大的智能手
24、機(jī)平臺(tái)。谷歌表示目前安卓手機(jī)每日平均激活量為20萬(wàn)部,銷售速度加速上漲。</p><p> 我們認(rèn)為,安卓在全球市場(chǎng)的成長(zhǎng)壯大,塞班市場(chǎng)份額不斷下跌已成不爭(zhēng)事實(shí)。安卓操作系統(tǒng)發(fā)展迅猛主要得益于免費(fèi)、開源和良好產(chǎn)業(yè)運(yùn)作策略,這三點(diǎn)為安卓在智能手機(jī)市場(chǎng)贏得更多的發(fā)展機(jī)遇。系統(tǒng)的免費(fèi)讓更多的廠商加入,推動(dòng)了份額的上升;代碼的開源讓更多的開發(fā)者進(jìn)入應(yīng)用開發(fā);應(yīng)用的豐富吸引了更多用戶選擇,這也是谷歌值得眾多廠商學(xué)習(xí)的地方
25、。此外,谷歌通過(guò)OHA聯(lián)合眾多廠商進(jìn)行系統(tǒng)研發(fā),不斷更新版本,將系統(tǒng)應(yīng)用推廣到更多的終端產(chǎn)品中,確保用戶體驗(yàn)持續(xù)改善。</p><p><b> 第二章 系統(tǒng)分析</b></p><p><b> 2.1 研究目標(biāo)</b></p><p> (1)了解Android應(yīng)用程序的設(shè)計(jì)和開發(fā)過(guò)程;</p>
26、<p> (2) 使用多種組件進(jìn)行Android 平臺(tái)3G手機(jī)氣象軟件的開發(fā)。</p><p> 本軟件是基于Eclipse的開發(fā)環(huán)境,依托Google氣象數(shù)據(jù)建立氣象信息數(shù)據(jù)庫(kù),開發(fā)出了針對(duì)Android平臺(tái)的手機(jī)天氣預(yù)報(bào)系統(tǒng)。</p><p><b> 2.2 需求分析</b></p><p> 本軟件是一個(gè)App W
27、idget應(yīng)用程序,啟動(dòng)程序后可以進(jìn)行城市、更新頻率的設(shè)置,可以通過(guò)圖片和文字顯示當(dāng)前和未來(lái)的天氣狀況,包括溫度、濕度、風(fēng)向和雨雪情況等。這些天氣數(shù)據(jù)是通過(guò)后臺(tái)服務(wù)獲取的,這個(gè)后臺(tái)服務(wù)可以按照一定時(shí)間間隔,從Google上獲取天氣預(yù)報(bào)信息,并將天氣信息保存在數(shù)據(jù)庫(kù)中。</p><p> 從上面的描述中可以基本了解軟件的功能需求:</p><p> (1) 啟動(dòng)App Widget應(yīng)用程
28、序;</p><p> (2) 設(shè)置界面:對(duì)要顯示天氣預(yù)報(bào)的城市及更新頻率進(jìn)行設(shè)置;</p><p> (3) 顯示界面:通過(guò)文字和圖片顯示當(dāng)前的天氣情況,包括日期、時(shí)間、城市、最高溫度、最低溫度、當(dāng)前溫度等。</p><p> (4) 詳細(xì)界面:通過(guò)文字圖片動(dòng)畫顯示當(dāng)前的天氣情況,包括城市當(dāng)前天氣、溫度、風(fēng)向、風(fēng)速、濕度;同時(shí)顯示今后四天的天氣情況。<
29、/p><p><b> 2.3 性能分析</b></p><p> 程序響應(yīng)速度快、安全性高、信息處理速度快。</p><p> 第三章 系統(tǒng)開發(fā)環(huán)境及相關(guān)技術(shù)</p><p> 3.1 Android開發(fā)環(huán)境介紹</p><p> Android的上層應(yīng)用程序是用Java語(yǔ)言開發(fā),同時(shí)還需
30、要基于Dalvik虛擬機(jī),所以,Google公司推薦使用主流的Java繼承開發(fā)環(huán)境Eclipse。只有Eclipse還不夠,因?yàn)槭鞘褂肑ava語(yǔ)言進(jìn)行開發(fā),還應(yīng)該有由SUN公司提供的Java SDK(其中包括JRE:Java Runtime Environment)。此外,Android的應(yīng)用程序開發(fā)和Java開發(fā)有較大區(qū)別的,所以還需要有Google提供的Android SDK。同時(shí),還需要在Eclipse安裝ADT,為Android
31、開發(fā)提供開發(fā)工具的升級(jí)或者變更,是Eclipse下開發(fā)工具的升級(jí)下載的工具。</p><p> 簡(jiǎn)言之,需要以下軟件,才能搭建Android開發(fā)環(huán)境,從而進(jìn)行Android應(yīng)用程序的開發(fā)。</p><p> (1) Java SDK</p><p> (2) Eclipse</p><p> (3) Android SDK</p
32、><p><b> (4) ADT</b></p><p> 3.2 Android開發(fā)平臺(tái)搭建</p><p> Android開發(fā)平臺(tái)搭建步驟:</p><p> ①首先到http://www.eclipse.org/downloads/下載Eclipse集成開發(fā)環(huán)境并且解壓,這里推薦下載Java EE 集成版
33、本,可以為平臺(tái)的搭建省下不少工作。接著再去http://java.sun.com/javase/downloads/index.jsp 站點(diǎn)下載SDK后安裝,下載http://dl.google.com/android/android-sdk-windows-1.5_r1.zip,Android SDK1.5后解壓。第一步下載工序就結(jié)束了。</p><p> ?、陔p擊Eclipse解壓后目錄中的eclipse.e
34、xe然后啟動(dòng),選擇Eclipse菜單中的Help-> Install New Software-> 選項(xiàng)卡上的Available Software,點(diǎn)擊右側(cè)的“Add”輸入http://dl-ssl.google.com/android/eclipse/后確定,然后在“Work with”下拉菜單中選擇剛才輸入的網(wǎng)址。過(guò)一會(huì)就會(huì)出現(xiàn)一個(gè)Developer Tools選項(xiàng),勾上以后點(diǎn)擊Next以后Eclipse會(huì)自動(dòng)網(wǎng)上查找A
35、ndroid 開發(fā)工具插件,然后找到Android DDMS和Android Development Tools,選中這兩個(gè)點(diǎn)擊Finish,Eclipse就會(huì)自動(dòng)下載并安裝Android插件了,最后會(huì)提示重啟Eclipse。</p><p> ?、壑貑⒑筮x擇Eclipse菜單中的Windows-> Preferences 在左側(cè)的Android項(xiàng)目中SDK Location中填入Android SDK解壓
36、后的目錄,然后點(diǎn)擊Apply。</p><p> ④在WindowsXP的系統(tǒng)變量中的path變量中添加一個(gè)值,該值指向解壓后的Android SDK目錄下的tools文件夾。</p><p><b> 第四章 程序設(shè)計(jì)</b></p><p> 4.1 用戶界面設(shè)計(jì)</p><p> 根據(jù)需求分析可以知道,應(yīng)
37、用程序應(yīng)包含三個(gè)主要的用戶界面,這里需要進(jìn)一步分析每個(gè)用戶界面中應(yīng)該包括哪些顯示內(nèi)容。</p><p> 在“設(shè)置頁(yè)面”中,需要對(duì)要顯示天氣預(yù)報(bào)的城市及更新頻率進(jìn)行設(shè)置。在“顯示頁(yè)面”中,顯示當(dāng)前的天氣狀況,包括城市名稱、溫度、濕度、風(fēng)向、雨雪情況和獲取數(shù)據(jù)時(shí)間等信息。在“詳細(xì)頁(yè)面”動(dòng)態(tài)顯示當(dāng)前天氣情況,還要顯示未來(lái)四天的天氣情況。</p><p> 根據(jù)對(duì)用戶界面顯示內(nèi)容的分析,繪制
38、出用戶界面的草圖,如圖4-1所示。</p><p> 圖4-1 用戶界面草圖</p><p> 4.2 數(shù)據(jù)庫(kù)設(shè)計(jì)</p><p> 本軟件中有兩部分?jǐn)?shù)據(jù)需要存儲(chǔ),一個(gè)是顯示頁(yè)面的數(shù)據(jù),另一個(gè)詳細(xì)頁(yè)面的數(shù)據(jù)。因此選擇SQLite數(shù)據(jù)庫(kù)作為存儲(chǔ)數(shù)據(jù)的方法,建立數(shù)據(jù)庫(kù)forcasts.db,并且建立兩張表weather_forcastt和weather_widg
39、et,分別存儲(chǔ)顯示頁(yè)面的數(shù)據(jù)和詳細(xì)頁(yè)面的數(shù)據(jù)。</p><p> 表4-1 詳細(xì)頁(yè)面的數(shù)據(jù)庫(kù)表weather_forcast的結(jié)構(gòu)</p><p> 表4-2 顯示頁(yè)面的數(shù)據(jù)庫(kù)表weather_widget的結(jié)構(gòu)</p><p> 4.3 程序模塊設(shè)計(jì)</p><p> 從功能需求上分析可以看出,整個(gè)應(yīng)用程序應(yīng)劃分為4個(gè)模塊,分別是
40、程序啟動(dòng)、用戶界面、后臺(tái)服務(wù)和數(shù)據(jù)庫(kù)適配器,各模塊之間的關(guān)系如圖4-2所示。</p><p> 從模塊結(jié)構(gòu)圖中不難看出,后臺(tái)服務(wù)是整個(gè)應(yīng)用程序的核心,主要是“數(shù)據(jù)獲取模塊”,負(fù)責(zé)周期性的從Google獲取天氣信息。后臺(tái)服務(wù)在程序啟動(dòng)時(shí)就由AppWidgetProvider啟動(dòng),也可由用戶界面通過(guò)startService()進(jìn)行啟動(dòng),啟動(dòng)后的后臺(tái)服務(wù)將一直保持運(yùn)行狀態(tài)。</p><p>
41、 用戶界面從數(shù)據(jù)庫(kù)中獲取天氣信息,而沒(méi)有直接通過(guò)網(wǎng)絡(luò)訪問(wèn)Google的天氣數(shù)據(jù)。之所以這么實(shí)際,一方面可以避免因網(wǎng)絡(luò)通信不暢造成界面失去響應(yīng);另一方面,后臺(tái)服務(wù)可以及時(shí)更新數(shù)據(jù),以保證數(shù)據(jù)的準(zhǔn)確性。</p><p> 數(shù)據(jù)庫(kù)適配器封裝了所有對(duì)SQLite數(shù)據(jù)庫(kù)操作的方法,用戶界面和后臺(tái)服務(wù)會(huì)調(diào)用它來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作。</p><p> 在完成用戶界面設(shè)計(jì)、數(shù)據(jù)庫(kù)設(shè)計(jì)和模塊設(shè)計(jì)后,至此程序
42、設(shè)計(jì)階段基本完成。</p><p><b> 第五章程序開發(fā)</b></p><p> 5.1 文件結(jié)構(gòu)與用途</p><p> 在程序開發(fā)階段,首先確定“Android平臺(tái)3G手機(jī)氣象軟件”的工程名為ty-weather,據(jù)程序模塊設(shè)計(jì)的內(nèi)容,建立ty-weather工程。Weather工程源代碼的結(jié)構(gòu)如圖5.1所示。</p&
43、gt;<p> 圖5.1 ty-weather工程的源代碼文件</p><p> 為了使源代碼文件的結(jié)構(gòu)更加清晰,Weather工程設(shè)置了多個(gè)命名空間,分別用來(lái)保存用戶界面、數(shù)據(jù)庫(kù)、后臺(tái)服務(wù)和工具實(shí)體的源代碼文件,源代碼文件的名稱以及說(shuō)明如表5.1所示。</p><p> 表5.1 ty-weather工程的文件用途說(shuō)明</p><p> An
44、droid的資源文件保存在/res的子目錄中。其中、/res/anim目錄中保存的是產(chǎn)生動(dòng)畫效果的XML文件,/res/drawable/目錄中保存的是圖像文件,/res/values目錄中保存的是用來(lái)自定義字符串和顏色的文件,/res/xml目錄中保存的是XML格式的數(shù)據(jù)文件。所有在程序開發(fā)階段可以被調(diào)用的資源都保存在這些目錄中,具體每個(gè)資源文件的用途可以參考表5.2:</p><p> 表5.2 資源文件
45、名稱與用途</p><p> 5.2 數(shù)據(jù)提供者</p><p> 數(shù)據(jù)提供者ForecastProvider繼承ContentProvider,是在應(yīng)用程序間共享數(shù)據(jù)的一種接口機(jī)制。應(yīng)用程序在不同的進(jìn)程中運(yùn)行,因此,數(shù)據(jù)和文件在不同的應(yīng)用程序之間是不能夠直接進(jìn)行訪問(wèn)的。而CotentProvider為程序員提供了較高級(jí)的數(shù)據(jù)共享方法,應(yīng)用程序可以指定需要共享的數(shù)據(jù),而其他應(yīng)用程序則
46、可以在不知數(shù)據(jù)來(lái)源、路徑的情況下,對(duì)共享數(shù)據(jù)進(jìn)行查詢、添加、刪除和更新等操作。 </p><p> 在介紹ForecastProvider的核心代碼前,首先了解一下WidgetEntity.java(當(dāng)前天氣信息的類)和ForecastEntity.java(未來(lái)天氣信息的類)。</p><p> (1) WidgetEntity.java的部分代碼:</p>&l
47、t;p> public class WidgetEntity {</p><p> private ArrayList<ForecastEntity> details = </p><p> new ArrayList<ForecastEntity>(); //ForecastEntity對(duì)象</p><p> privat
48、e Integer id; //編號(hào)</p><p> private Integer updateMilis; //更新頻率</p><p> private String city; //城市</p><p> private String postalCode; //城市標(biāo)記</p><p> private Long
49、 forecastDate; //預(yù)報(bào)時(shí)間</p><p> private String condition; //天氣情況</p><p> private Integer tempF; //華氏溫度</p><p> private Integer tempC; //攝氏溫度</p><p> private Strin
50、g humidity; //濕度</p><p> private String icon; //天氣圖標(biāo)</p><p> private String windCondition; //風(fēng)力風(fēng)向</p><p> private Long lastUpdateTime; //最后更新時(shí)間</p><p> private
51、Integer isConfigured; //是否已設(shè)置</p><p><b> ......</b></p><p><b> }</b></p><p> 從代碼中可以看出,除ForecastEntity 的對(duì)象details, WidgetEntity類中有以上公有靜態(tài)屬性id、updateMilis 、
52、updateMilis、postalCode、forecastDate、condition、tempF、tempC、humidity、icon、windCondition、lastUpdateTime、isConfigured,完全對(duì)應(yīng)數(shù)據(jù)庫(kù)中weather_widget的表。</p><p> ForecastEntity.java的部分代碼:</p><p> public cla
53、ss ForecastEntity {</p><p> private Integer id; //編號(hào)</p><p> private String dayOfWeek; //星期</p><p> private Integer low; //最低溫度</p><p> private Integer hight; /
54、/最高溫度</p><p> private String icon; //天氣圖標(biāo)</p><p> private String condition; //天氣情況</p><p> private Integer widgetId; //組件id</p><p> 從代碼中可以看出,WidgetEntity類中有以上公有靜
55、態(tài)屬性id、dayOfWeek、low、hight、icon、condition、widgetId,完全對(duì)應(yīng)數(shù)據(jù)庫(kù)中weather_forcast的表。</p><p> 在創(chuàng)建ForecastProvider時(shí),首先需要使用數(shù)據(jù)庫(kù)、文件系統(tǒng)或網(wǎng)絡(luò)實(shí)現(xiàn)底層存儲(chǔ)功能,這里我們采用數(shù)據(jù)庫(kù)建立了數(shù)據(jù)庫(kù)設(shè)計(jì)中的兩張表,從而實(shí)現(xiàn)了底層存儲(chǔ)功能。然后在繼承ContentProvider的類中實(shí)現(xiàn)基本數(shù)據(jù)操作的接口函數(shù),包括
56、添加、刪除、查找和更新等功能。下面就核心代碼進(jìn)行分析。</p><p> 創(chuàng)建數(shù)據(jù)庫(kù):DatabaseHelper類繼承SQLiteOpenHelper,SQLiteOpenHelper這個(gè)類可以輔助建立、更新和打開數(shù)據(jù)庫(kù)。DatabaseHelper在建立數(shù)據(jù)庫(kù)時(shí),同時(shí)建立了兩個(gè)數(shù)據(jù)庫(kù)表weather_widget和weather_forcast,并對(duì)保存配置信息的表進(jìn)行了初始化。具體代碼如下所示:</
57、p><p> private static class DatabaseHelper extends SQLiteOpenHelper {</p><p><b> //數(shù)據(jù)庫(kù)名稱</b></p><p> private static final String DATABASE_NAME = "forecasts.db"
58、;</p><p><b> //數(shù)據(jù)庫(kù)版本</b></p><p> private static final int DATABASE_VERSION = 2;</p><p> //構(gòu)造方法,重載父類構(gòu)造</p><p> public DatabaseHelper(Context context) {&l
59、t;/p><p> super(context, DATABASE_NAME, null, DATABASE_VERSION);</p><p><b> }</b></p><p> public void onCreate(SQLiteDatabase db) {</p><p> //創(chuàng)建weather_wid
60、get表</p><p> public void onCreate(SQLiteDatabase db) {</p><p> //創(chuàng)建weather_widget表</p><p> db.execSQL("CREATE TABLE " + TABLE_WIDGET + " (" </p><p&
61、gt;<b> ......);</b></p><p> //創(chuàng)建weather_forecast表</p><p> db.execSQL("CREATE TABLE " + TABLE_FORECAST + " (" </p><p><b> ......);</b>
62、</p><p><b> }</b></p><p><b> }</b></p><p> //重寫onUpgrade()方法</p><p><b> @Override</b></p><p> public void onUpgrad
63、e(SQLiteDatabase db, int oldVersion, int newVersion) {</p><p><b> ......</b></p><p><b> }</b></p><p><b> }</b></p><p><b>
64、}</b></p><p> URI設(shè)置:ContentProvider可以提供多個(gè)數(shù)據(jù)集,調(diào)用者使用URI(通用資源標(biāo)識(shí)符)對(duì)不同的數(shù)據(jù)集的數(shù)據(jù)進(jìn)行操作。URI用來(lái)地位任何遠(yuǎn)程或本地的可用資源。ContentProvider使用的URI語(yǔ)法結(jié)構(gòu)content://<authority>/<data_path>/<id>。因此,我們就需要先來(lái)對(duì)URI進(jìn)行設(shè)置。代碼
65、如下:</p><p> public static class WeatherWidgets implements BaseColumns {</p><p> //繼承BaseColumns可以提供自動(dòng)生成的ID</p><p> //聲明CONTENT_URI</p><p> public static final Uri C
66、ONTENT_URI = Uri.parse("content://"</p><p> + AUTHORITY + "/widgets");</p><p> public static final String FORECAST_END = "forecasts";</p><p><b
67、> //指操作多條數(shù)據(jù)</b></p><p> public static final String CONTENT_TYPE = "vnd.android.cursor.dir/awidget";</p><p><b> //指操作單條數(shù)據(jù)</b></p><p> public static
68、 final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/widget";</p><p><b> }</b></p><p> 查詢功能:首先我們先了解一下SQLiteQueryBuilder的query()方法。query(SQLiteDatabase db, String[]
69、projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder, String limit),參數(shù)說(shuō)明如表5.3:</p><p> 查詢功能的核心代碼如下:</p><p> public Cursor query(Uri uri, Stri
70、ng[] projection, String selection,</p><p> String[] selectionArgs, String sortOrder) {</p><p> //getReadableDatabase()這個(gè)函數(shù)會(huì)數(shù)據(jù)庫(kù)是否存在、版本號(hào)和是否可讀等情況,</p><p> //決定在返回?cái)?shù)據(jù)庫(kù)對(duì)象前,是否需要數(shù)據(jù)庫(kù)。返回一個(gè)
71、可讀的數(shù)據(jù)庫(kù)對(duì)象。</p><p> SQLiteDatabase db = dbHelper.getReadableDatabase();</p><p> //聲明了一個(gè)SQLiteQueryBuilder對(duì)象,該對(duì)象利用傳入的參數(shù)生成一個(gè)完整的</p><p> //sqlite查詢語(yǔ)句,還可以完成查詢工作并返回結(jié)果集(Cursor)。</p>
72、;<p> SQLiteQueryBuilder qb = new SQLiteQueryBuilder();</p><p> String limit = null;</p><p> //通過(guò)一個(gè)switch語(yǔ)句,完成了通過(guò)uri種類的辨別來(lái)生成不通的SQLiteQueryBuilder對(duì)象的工作。</p><p> switch (ur
73、iMatcher.match(uri)) {</p><p> case WIDGETS: {</p><p> qb.setTables(TABLE_WIDGET);</p><p><b> break;</b></p><p><b> }</b></p><p&g
74、t; case WIDGETS_ID: {</p><p> String appWidgetId = uri.getPathSegments().get(1);</p><p> qb.setTables(TABLE_WIDGET);</p><p> qb.appendWhere(BaseColumns._ID + "=" + app
75、WidgetId);</p><p><b> break;</b></p><p><b> }</b></p><p> case WIDGETS_FORECASTS: {</p><p> // Pick all the forecasts for given widget, sort
76、ed by date and</p><p> // importance</p><p> //獲得appWidgetId</p><p> String appWidgetId = uri.getPathSegments().get(1);</p><p> //為該SQLiteQueryBuilder對(duì)象設(shè)置它查詢工作將針對(duì)的表
77、</p><p> qb.setTables(TABLE_FORECAST);</p><p> //qb的where條件</p><p> qb.appendWhere(ForecastEntity.WIDGET_ID + "=" + appWidgetId);</p><p> //按照BaseColumns.
78、_ID進(jìn)行排序</p><p> sortOrder = BaseColumns._ID + " ASC";</p><p><b> break;</b></p><p> }case FORECASTS: {</p><p> qb.setTables(TABLE_FORECAST);&l
79、t;/p><p><b> break;</b></p><p><b> }</b></p><p> case FORECASTS_ID: {</p><p> String forecastId = uri.getPathSegments().get(1);</p><
80、p> qb.setTables(TABLE_FORECAST);</p><p> qb.appendWhere(BaseColumns._ID + "=" + forecastId);</p><p><b> break;</b></p><p><b> }</b></p>
81、;<p><b> }</b></p><p> return qb.query(db, projection, selection, selectionArgs, null, null,sortOrder, limit);</p><p><b> }</b></p><p> 添加、刪除、更新功能
82、由于核心代碼類似,此處不一一贅述。</p><p><b> 添加功能:</b></p><p> public Uri insert(Uri uri, ContentValues values) {} </p><p><b> 刪除功能:</b></p><p> public int
83、delete(Uri uri, String selection, String[] selectionArgs) {}</p><p><b> 更新功能:</b></p><p> public int update(Uri uri, ContentValues values, String selection,</p><p> S
84、tring[] selectionArgs) {}</p><p> 類型匹配:增刪改查通過(guò)switch判斷,進(jìn)行不同的操作,因而還需要對(duì)關(guān)鍵字進(jìn)行類型匹配。核心代碼如下:</p><p> /*getType()函數(shù)用來(lái)返回指定URI的MIME數(shù)據(jù)類型</p><p> * CONTENT_TYPE表示URI是多條數(shù)據(jù)</p><p>
85、; * CONTENT_ITEM_TYPE表示是單條數(shù)據(jù)</p><p><b> */</b></p><p><b> @Override</b></p><p> public String getType(Uri uri) {</p><p> // TODO Auto-gener
86、ated method stub</p><p> switch (uriMatcher.match(uri)) {</p><p> case WIDGETS:</p><p> return WeatherWidgets.CONTENT_TYPE;</p><p> case WIDGETS_ID:</p><
87、p> return WeatherWidgets.CONTENT_ITEM_TYPE;</p><p> case WIDGETS_FORECASTS:</p><p> return WeatherDetails.CONTENT_TYPE;</p><p> case FORECASTS:</p><p> return W
88、eatherDetails.CONTENT_TYPE;</p><p> case FORECASTS_ID:</p><p> return WeatherDetails.CONTENT_ITEM_TYPE;</p><p><b> }</b></p><p> throw new IllegalStateE
89、xception();</p><p><b> }</b></p><p> //構(gòu)造無(wú)匹配方式的uriMatcher</p><p> private static final UriMatcher uriMatcher = new UriMatcher(</p><p> UriMatcher.NO_MAT
90、CH);</p><p> private static final int WIDGETS = 101;</p><p> private static final int WIDGETS_ID = 102;</p><p> private static final int WIDGETS_FORECASTS = 103;</p><p
91、> private static final int FORECASTS = 201;</p><p> private static final int FORECASTS_ID = 202;</p><p> //聲明了uriMatcher的匹配方式和返回代碼</p><p><b> static {</b></p&g
92、t;<p> uriMatcher.addURI(AUTHORITY, "widgets", WIDGETS);</p><p> uriMatcher.addURI(AUTHORITY, "widgets/#", WIDGETS_ID);</p><p> uriMatcher.addURI(AUTHORITY, "w
93、idgets/#/forecasts", WIDGETS_FORECASTS);</p><p> uriMatcher.addURI(AUTHORITY, "forecasts", FORECASTS);</p><p> uriMatcher.addURI(AUTHORITY, "forecasts/#", FORECASTS_ID
94、);</p><p><b> }</b></p><p><b> }</b></p><p><b> 5.3 后臺(tái)服務(wù)</b></p><p> 后臺(tái)服務(wù)是ty-weather工程的核心模塊,在用戶啟動(dòng)后持續(xù)在后臺(tái)運(yùn)行,直到用戶停止服務(wù)。后臺(tái)服務(wù)主要有三個(gè)功能,
95、一是周期性的獲取Google的天氣數(shù)據(jù)并存儲(chǔ)到SQLite,二是從SQLite讀取出要顯示的數(shù)據(jù),三是定時(shí)更新“顯示頁(yè)面”的時(shí)間。</p><p> 5.3.1 獲取天氣數(shù)據(jù)</p><p> 天氣數(shù)據(jù)的獲取天氣數(shù)據(jù)分為以下三個(gè)步驟:</p><p> 從Google提供的Web Service中獲取的天氣數(shù)據(jù),數(shù)據(jù)的獲取地址是: http://www.go
96、ogle.com/ig/api?weather=%s&hl=zh-cn。核心代碼如下:</p><p> public static WidgetEntity queryWebservice(String postalCode)</p><p> throws ForecastParseException {</p><p><b> //編
97、碼出錯(cuò)</b></p><p> if (postalCode == null) {</p><p> throw new ForecastParseException("can not covert to entity");</p><p> }Reader responseReader;</p><p
98、> WidgetEntity widgetEntity = null;</p><p> //通過(guò)HttpClient創(chuàng)建Http連接</p><p> HttpClient client = new DefaultHttpClient();</p><p> //創(chuàng)建Http Get請(qǐng)求</p><p> HttpGet r
99、equest = new HttpGet(String.format(WEBSERVICE_URL, postalCode));</p><p><b> try {</b></p><p> Log.d(TAG, "get google's weather infomation");</p><p><b
100、> //發(fā)出請(qǐng)求</b></p><p> HttpResponse response = client.execute(request);</p><p> StatusLine status = response.getStatusLine();</p><p> Log.d(TAG, "Request returned st
101、atus " + status);</p><p><b> //取出回復(fù)信息</b></p><p> HttpEntity entity = response.getEntity();</p><p> responseReader = new InputStreamReader(entity.getContent(), &
102、quot;GB2312");</p><p> } catch (IOException e) {</p><p> throw new ForecastParseException("Problem calling forecast API", e);</p><p><b> }</b></p>
103、;<p> if (responseReader != null) {</p><p> widgetEntity = parseResponse(responseReader);</p><p><b> }</b></p><p> return widgetEntity;</p><p>&l
104、t;b> }</b></p><p> 調(diào)用輕量級(jí)XML解析器XmlPullParser對(duì)從網(wǎng)絡(luò)上獲取的字節(jié)流數(shù)據(jù)進(jìn)行解析,并且將解析結(jié)果保存在WidgetEntity對(duì)象中。核心代碼如下:</p><p> //返回類型為WidgetEntity</p><p> private static WidgetEntity parseResp
105、onse(Reader responseReader)</p><p> throws ForecastParseException {</p><p><b> ......</b></p><p><b> try {</b></p><p> //使用工廠類XmlPullParserF
106、actory來(lái)創(chuàng)建解析器XmlPullParser</p><p> XmlPullParserFactory factory = XmlPullParserFactory.newInstance();</p><p> XmlPullParser xpp = factory.newPullParser();</p><p> String tagName =
107、 null;</p><p> xpp.setInput(responseReader);</p><p> int eventType = xpp.getEventType();</p><p> while (eventType != XmlPullParser.END_DOCUMENT) {</p><p> if (event
108、Type == XmlPullParser.START_TAG) {</p><p> tagName = xpp.getName();</p><p> //根據(jù)不同的標(biāo)簽做不同的解析</p><p> if (PROBLEM_CAUSE.equals(tagName)) {</p><p> throw new ForecastP
109、arseException(</p><p> "the city is non correct!");</p><p> } else if (FORECAST_INFORMATION.equals(tagName)) {</p><p> dealWithInfomation(tagName, widgetEntity, xpp);&l
110、t;/p><p> } else if (CURRENT_CONDITIONS.equals(tagName)) {</p><p> dealWithCurrentConditions(tagName, widgetEntity, xpp);</p><p> } else if (FORECAST_CONDITIONS.equals(tagName)) {&l
111、t;/p><p> dealWithForecastConditions(tagName, widgetEntity, xpp);</p><p><b> }</b></p><p><b> }</b></p><p> eventType = xpp.next();</p>
112、<p><b> }</b></p><p> } catch (IOException e) {</p><p><b> ......</b></p><p><b> }</b></p><p> return widgetEntity;</p&
113、gt;<p><b> }</b></p><p> 將解析好的數(shù)據(jù)存儲(chǔ)到SQLite數(shù)據(jù)庫(kù)中。其過(guò)程是:使用ContentResolver對(duì)象,通過(guò)URI間接調(diào)用ContentProvider,使用ContentResolver對(duì)象與ContentProvider進(jìn)行交互,而ContentResolver則通過(guò)URI確定需要訪問(wèn)的ContentProvider的數(shù)據(jù)集。核
114、心代碼如下,調(diào)用關(guān)系如圖5.1所示。</p><p> 圖5.1 ContentProvider調(diào)用關(guān)系</p><p> ContentResolver resolver = context.getContentResolver(); </p><p> resolver.delete(forecastUri, null, null);</p>
115、<p> ContentValues values = new ContentValues();</p><p> for (ForecastEntity forecast : widgetEntity.getDetails()) {</p><p> values.clear();</p><p> values.put(ForecastEn
116、tity.DAYOFWEEK, forecast.getDayOfWeek());</p><p><b> ......</b></p><p> resolver.insert(forecastUri, values);</p><p><b> }</b></p><p><b&g
117、t; 注意:</b></p><p> for (ForecastEntity forecast : widgetEntity.getDetails())相當(dāng)于foreach語(yǔ)句,在widgetEntity.getDetails()集合里打印出所有類型為ForecastEntity的forecast變量。</p><p> 5.3.2 讀取天氣數(shù)據(jù)實(shí)例</p>
118、;<p> 通過(guò)WebServiceHelper.getWidgetEntity()方法操作數(shù)據(jù)庫(kù)取出所需要的數(shù)據(jù),這一部分與上一節(jié)的“將解析好的數(shù)據(jù)存儲(chǔ)到SQLite數(shù)據(jù)庫(kù)中”的關(guān)鍵點(diǎn)相同,為節(jié)約篇幅,此處不贅述。</p><p> 5.3.3 定時(shí)更新時(shí)間。</p><p> AppWidget一啟動(dòng)就會(huì)啟動(dòng)ForcastTimeService這個(gè)后臺(tái)服務(wù),此服務(wù)
119、設(shè)置了每隔20秒刷新一次時(shí)間,“顯示頁(yè)面”通過(guò)這個(gè)后臺(tái)服務(wù)獲取系統(tǒng)時(shí)間從而顯示。核心代碼如下:</p><p> AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);</p><p> alarmManager.set(AlarmManager.RTC_WAKEUP, now
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于android平臺(tái)的3g氣象軟件
- 基于android平臺(tái)的3g氣象軟件
- 基于android平臺(tái)的3g氣象軟件-畢業(yè)論文
- 基于Android平臺(tái)的3G氣象軟件.doc
- android平臺(tái)3g手機(jī)氣象軟件——畢業(yè)論文
- 基于Android平臺(tái)的3G氣象軟件的開發(fā).pdf
- 畢業(yè)論文范文——android平臺(tái)3g手機(jī)氣象軟件
- 基于Android平臺(tái)的3G移動(dòng)學(xué)習(xí)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于Android平臺(tái)的3G移動(dòng)航空訂票系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 《3g手機(jī)軟件開發(fā)》課程設(shè)計(jì)--android平臺(tái)數(shù)獨(dú)游戲的設(shè)計(jì)與實(shí)現(xiàn)
- 基于3G網(wǎng)絡(luò)的氣象手機(jī)客戶端服務(wù)平臺(tái)研究.pdf
- 基于android平臺(tái)的聊天軟件設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)論文
- 基于QUALCOMM平臺(tái)的3G手機(jī)硬件設(shè)計(jì).pdf
- 基于android平臺(tái)的聊天軟件設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)論文
- 基于BREW平臺(tái)的3G手機(jī)軟件開發(fā)研討.pdf
- 基于3g手機(jī)的移動(dòng)學(xué)習(xí)資源平臺(tái)的設(shè)計(jì)
- 基于3G的家庭智能網(wǎng)關(guān)軟件設(shè)計(jì).pdf
- 基于android平臺(tái)的飛機(jī)游戲畢業(yè)設(shè)計(jì)
- 基于android平臺(tái)的飛機(jī)游戲畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)(論文)--3g時(shí)代手機(jī)通訊的風(fēng)險(xiǎn)
評(píng)論
0/150
提交評(píng)論