版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
合肥學(xué)院2013屆畢業(yè)論文(設(shè)計)論文(設(shè)計)題目基于Android的手機(jī)天氣預(yù)報系統(tǒng)院系名稱計算機(jī)科學(xué)與技術(shù)系專業(yè)(班級)計算機(jī)科學(xué)與技術(shù)2009級本科3班姓名(學(xué)號)丁同飛(0904013004)指導(dǎo)教師屠菁系負(fù)責(zé)人袁暋完成時間2013-06-02第一章緒論1.1引言手機(jī)是已經(jīng)成為了生活中不可少的通信設(shè)備,沒有手機(jī)有時會讓人覺得寸步難行,手機(jī)將脫離傳統(tǒng)的打電話,發(fā)短信等基本功能,而基于智能手機(jī)的處理能力和可擴(kuò)展能力,基于3G網(wǎng)絡(luò)高速數(shù)據(jù)傳輸,越來越多的功能和業(yè)務(wù)將被開發(fā)出來并大規(guī)模的應(yīng)用。正基于此,當(dāng)全世界的目光聚集在此的時候,Google于2007年11月5日宣布推出基于linux平臺的開源手機(jī)操作系統(tǒng),號稱首個為移動終端打造的真正開發(fā)和完整的移動軟析android[1]?,F(xiàn)有的3G技術(shù)和移動互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,智能手機(jī)功能的不斷增強(qiáng),讓基于Android平臺的查詢需求越來越多。本軟件就是利用現(xiàn)有的網(wǎng)絡(luò)快速獲取網(wǎng)絡(luò)上的天氣信息并顯示到手機(jī)終端上,為用戶提供實時的天氣查詢和近期天氣查詢服務(wù),為工作、出行等帶來便利。1.2系統(tǒng)開發(fā)的背景介紹Android是基于Linux內(nèi)核的軟件平臺和操作系統(tǒng),早期由Google開發(fā),后由開放手機(jī)聯(lián)盟(OpenhandsetAlliance)開發(fā)。它采用了軟件層(Softwarestack)的構(gòu)架,主要分為三個部分。底層以Linux為內(nèi)核作為基礎(chǔ),由C語言開發(fā),只提供基礎(chǔ)功能,中間層次包話函數(shù)庫和虛擬機(jī),由C++開發(fā)。最上層是各種應(yīng)用軟件,包話通話程序,短信程序。應(yīng)用軟件由各公司自行開發(fā),以JAVA編寫[2]。Android這個平臺對于Google對于大眾的意義不在于手機(jī)本身,Android存在的目的也不在于挑起手機(jī)操作系統(tǒng)之間的混戰(zhàn),而在于推動移動互聯(lián)網(wǎng)產(chǎn)業(yè)鏈的迅速成型。以Google,蘋果和諾基亞為中心各自形成的生態(tài)鏈將以原來數(shù)倍的速度推動移動互聯(lián)網(wǎng)的發(fā)展,這正是Google發(fā)布Android平臺的意義,也是Android平臺存在的使命所在,而作為Android平臺成員之一的中國移動也投資成立了一家通訊公司,專門從事Google手機(jī)平臺上添加飛信,輸入法等一系列符合國內(nèi)用戶使用特色的功能。國內(nèi)眾多個業(yè)也將目光投入了Android上面,并啟動了相關(guān)的計劃來深入地理解并發(fā)展Android。更多的手機(jī)軟件開發(fā)企業(yè)已經(jīng)或者籌備著將公司進(jìn)行轉(zhuǎn)型,從其主向的開發(fā)轉(zhuǎn)向到Android的開發(fā)?;诖耍覀冇斜匾ㄟ^進(jìn)行相關(guān)的研究來了解Android平臺,來了解開發(fā)Android的那一大批人的先進(jìn)的理念和思想,并通過這些來了解手機(jī)軟件行業(yè),進(jìn)而了解未來移動互聯(lián)網(wǎng)的發(fā)展趨勢,從而更好的適應(yīng)時代的需要。1.3系統(tǒng)開發(fā)的目的在科技日益發(fā)達(dá)的今天,社會競爭越來越激烈,這要求人們不斷的攝取信息,同時手機(jī)發(fā)展到現(xiàn)在已經(jīng)成為廣大人民群眾的日常使用的通讀工具,手機(jī)的功能也日趨完善。我國的通讀移動通訊功能同樣得到了很大的提高。手機(jī)軟件可以安裝在手機(jī)上的軟件,完善原始系統(tǒng)的不足與個性化。隨著科技的發(fā)展,現(xiàn)在手機(jī)的功能也越來越多,越來越強(qiáng)大。經(jīng)濟(jì)發(fā)展和社會進(jìn)步,人們的出行更加頻繁,對于天氣的關(guān)注更加強(qiáng)烈,基于這種原因我們開發(fā)了一種運用在Android系統(tǒng)上的手機(jī)天氣預(yù)報軟件系統(tǒng),本系統(tǒng)通過選擇城市來獲得天氣,風(fēng)向,風(fēng)向,溫度等信息。基于手機(jī)的天氣預(yù)報系統(tǒng)軟件可以使用戶對于各地的天氣情況的實時掌握,極大的方便了用戶的出行和行程安排,避免了不必要的麻煩。本次設(shè)計在Android手機(jī)系統(tǒng)可以準(zhǔn)確預(yù)測包括:時間,溫度,風(fēng)向等,并顯示在手機(jī)界面上,方便準(zhǔn)確地了解天氣信息。1.4項目開發(fā)的意義Android平臺3G手機(jī)氣象軟件的開發(fā)可以進(jìn)一步擴(kuò)大氣象信息的覆蓋面,讓廣大公眾能夠在第一時間方便且快捷地獲取最新的氣象預(yù)報(預(yù)警)信息,以便提前預(yù)防,把氣象災(zāi)害造成的損失降到最低。同時也可以強(qiáng)化氣象公共服務(wù)的職能,完善公共服務(wù)體系、改善公共服務(wù)手段、增加公共服務(wù)產(chǎn)品、提高公共服務(wù)質(zhì)量,更好地發(fā)揮了氣象事業(yè)對經(jīng)濟(jì)社會發(fā)展的現(xiàn)實性作用。
第二章系統(tǒng)分析2.1研究目標(biāo)1)了解Android應(yīng)用程序的設(shè)計和開發(fā)過程;2)使用多種組件進(jìn)行Android平臺的手機(jī)氣象軟件的開發(fā)。本軟件是基于Eclipse的開發(fā)環(huán)境,依托國家氣象局提供的氣象數(shù)據(jù)接口建立氣象信息數(shù)據(jù)庫,開發(fā)出了針對Android平臺的手機(jī)天氣預(yù)報系統(tǒng)。2.2需求分析設(shè)計完成一個實用穩(wěn)定的天氣預(yù)報系統(tǒng),同時要廉價使其能滿足大部分用戶的需求,因此針對上述要本設(shè)計應(yīng)滿足:1)加載界面程序開始運行時顯示加載界面,此界面是應(yīng)用程序最先展現(xiàn)的窗口,應(yīng)盡量保持界面信息簡潔。2)天氣顯示界面顯示指定城市三天內(nèi)的天氣狀況,包括日期、城市名稱、溫度、風(fēng)力與當(dāng)日的建議,用戶可通過按菜單鍵來顯示更新當(dāng)前天氣與設(shè)置天氣顯示的界面背景,以及跳轉(zhuǎn)至設(shè)置預(yù)報城市界面來更換預(yù)報城市。3)預(yù)報城市設(shè)置由自動設(shè)置預(yù)報城市與手動設(shè)置兩部分組成,自動設(shè)置實現(xiàn)GPS定位功能,自動確定當(dāng)前用戶所在地;而手動設(shè)置則通過可伸展性下拉列表單擊選擇系統(tǒng)數(shù)據(jù)庫中預(yù)存的城市來進(jìn)行設(shè)置,同時為了方便用戶查找,支持以輸入框的形式來過濾查詢預(yù)報城市。當(dāng)單擊選中城市時跳轉(zhuǎn)至天氣顯示界面,來顯示該城市三天內(nèi)的天氣狀況;在天氣界面用戶可通過菜單鍵選擇城市,更新天氣與更換背景,第一次運行時自動跳到該界面。4)Widget桌面小部件為了方便用戶實時了解天氣狀況,特別添加在Android系統(tǒng)桌面上顯示當(dāng)前天氣與時間的小部件,使用戶拿起手機(jī)第一刻就能了解當(dāng)前天氣與時間的小部件,使用戶拿起手機(jī)第一刻就能了解天氣,同時當(dāng)用戶單機(jī)小部件時,自動跳轉(zhuǎn)至天氣顯示界面,顯示三天內(nèi)的詳細(xì)天氣。2.3系統(tǒng)研究內(nèi)容1)數(shù)據(jù)源的選取2)界面的設(shè)計3)代碼的設(shè)計4)程序的測試5)產(chǎn)品的發(fā)布2.4項目需求分析根據(jù)功能的需求,分析此項目的主要功能應(yīng)該具有以下幾點:1)系統(tǒng)比較穩(wěn)定,具有實用性和通用性2)系統(tǒng)設(shè)計界面應(yīng)盡量美觀得體,操作簡便明了,便于人們使用3)可以較好的查詢出人們需要查詢的有關(guān)天氣的相關(guān)信息,包括天氣,風(fēng)力,溫度,建議等等。4)可以進(jìn)行對使用者所在城市的定位以及對其他城市的天氣查詢5)個性化的widget桌面部件第三章系統(tǒng)架構(gòu)分析Android是一種以Linux為基礎(chǔ)的開放源代碼操作系統(tǒng),主要使用于便攜設(shè)備。目前尚未有統(tǒng)一中文名稱,中國大陸地區(qū)較多人使用“安卓”或“安致”。Android操作系統(tǒng)最初由AndyRubin開發(fā),最初主要支持手機(jī)。2005年由Google收購注資,并組建開放手機(jī)聯(lián)盟開發(fā)改良,逐漸擴(kuò)展到平板電腦及其他領(lǐng)域上。Android的主要競爭對手是蘋果公司的iOS以及RIM的BlackberryOS。2011年第一季度,Android在全球的市場份額首次超過塞班系統(tǒng),躍居全球第一。2012年2月數(shù)據(jù),Android占據(jù)全球智能手機(jī)操作系統(tǒng)市場52.5%的份額,中國市場占有率為68.4%[3]。Android是一個移動設(shè)備的軟件平臺,是由Linux+Java構(gòu)成的開源軟件,它提供包括SDK、KeyApps、Middleware、LinuxKernel四個部分在內(nèi)的全套手機(jī)軟件方案。它開放了基于Linux內(nèi)核以上的開發(fā)工具,從而保證了內(nèi)容的可移植性和多樣性。Android平臺為我們開發(fā)應(yīng)用程序提供了一套很好的框架,我們可以在這個平臺的基礎(chǔ)上開發(fā)不同的應(yīng)用程序,也可以開發(fā)新的組件供應(yīng)用程序調(diào)用[4]。3.1Android系統(tǒng)的特點1)開放性。Google與開放性手機(jī)聯(lián)盟合作開發(fā)了android,Google通過與動行商,通過與運營商,設(shè)備制造商,開發(fā)商和其他有關(guān)各方結(jié)成深層次的合作伙伴關(guān)系,希望借助建立標(biāo)準(zhǔn)化,開放式的移動電話軟件平臺,在移動產(chǎn)業(yè)內(nèi)形成一個開放式生態(tài)系統(tǒng)。2)應(yīng)用程序無界限。Android上的應(yīng)用可以通過標(biāo)準(zhǔn)API訪問核心移動設(shè)備功能。通過互聯(lián)網(wǎng),應(yīng)用程序可以聲明它們的功能可提供其它應(yīng)用程序使用。3)應(yīng)用程序是在平等的條件下創(chuàng)建的,移動設(shè)備上的應(yīng)用程序可以被替換或擴(kuò)展,即使是撥號或主屏幕這樣的核心組件。4)應(yīng)用程序可以輕松地嵌入網(wǎng)絡(luò)。應(yīng)用程序可以輕松地嵌入HTML,javascript和樣式表,還可以通過Webview顯示內(nèi)容。5)應(yīng)用程序可以并行運行。Android是一種完整的多任務(wù)環(huán)境,應(yīng)用程序可以在其中并行運行,在后臺運行時,應(yīng)用程序可以生成通知引起注意[5]。3.2Android的功能1)支持虛擬鍵盤。虛擬鍵盤的出現(xiàn)意味著基于Android1.5或以上的版本的移動設(shè)備可以同時支持特理鍵盤和虛擬鍵盤。2)使用widget實現(xiàn)桌面的個性化??梢杂脀idget修飾自已的桌面。大多數(shù)小的Web應(yīng)用都是從網(wǎng)絡(luò)上獲得實時數(shù)據(jù)并展示給用戶的,android預(yù)裝了5個桌機(jī)Widget,包括數(shù)字時鐘,日歷,音樂播放器,相框。3)用在線文件快速瀏覽數(shù)數(shù),類似于OSXLeopard的Quicklook特征,Android的在線文件夾可顯示的數(shù)據(jù)條目,比如聯(lián)系人,喜歡的應(yīng)用,E-mail信息,播放列表,書簽,RSS源等,并不需要運行系統(tǒng)程序處理特定的數(shù)據(jù)條目。4)視頻錄制和分享。Android還有錄制和分享視頻的功能,對回放和MPEG-4,3GP等視頻也有了更好的支持??梢酝ㄟ^E-mail,MMS或直接上傳到y(tǒng)outube等方式來分享視頻。5)更快,更兼容的瀏覽器,Android的基于Webkit內(nèi)核的瀏覽器帶來了重要的調(diào)速半置,這得益于新的Wenkit渲染引擎和優(yōu)化的JAVA腳本編譯器。6)Voicesearch語音搜索。帶有語音識別技術(shù)的Google手機(jī)已于2008年11月面世,它支持語音搜索功能,該功能增強(qiáng)了默認(rèn)的搜索能力,已超過了純文本搜索。7)立體藍(lán)牙和免提電話。除了增強(qiáng)的免提電話體驗,Android還支持立體藍(lán)牙(A2Dphe和AVCRP),并有自動配對功能。8)強(qiáng)大的GPS技術(shù).Android內(nèi)部提供了大量的GPS組件,我們可以很輕松地獲得設(shè)備當(dāng)前的位置等信息,讓導(dǎo)航等功能更加完善。9)Android系統(tǒng)硬件檢測,android可自動檢測和修復(fù)SD卡的文件系統(tǒng),允許第三方應(yīng)用顯示Android系統(tǒng)的硬件特征,為了讓用戶下載到與自已的設(shè)備匹配的應(yīng)用,我們可以檢測用戶設(shè)備的硬件信息,讓滿足應(yīng)用要求的設(shè)備安裝該程序,當(dāng)更多的android設(shè)備建立在不同的硬件上時,這個功能顯得很實用[6]。3.3Android架構(gòu)Android的系統(tǒng)架構(gòu)和其它操作系統(tǒng)一樣,采用了分層的架構(gòu)。android分為四個層,從高層到低層分別是應(yīng)用程序?qū)?、?yīng)用程序框架層、系統(tǒng)運行庫層和linux核心層。圖3-1Android架構(gòu)Android是以Linux為核心的手機(jī)操作平臺,作為一款開放式的操作系統(tǒng),隨著Android的快速發(fā)展,如今已允許開發(fā)者使用多種編程語言來開發(fā)Android應(yīng)用程序,而不再是以前只能使用Java開發(fā)Android應(yīng)用程序的單一局面,因而受到眾多開發(fā)者的歡迎,成為真正意義上的開放式操作系統(tǒng)[7]。3.3.1LinuxKernelAndroid基于Linux2.6提供核心系統(tǒng)服務(wù),例如:安全、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)堆棧、驅(qū)動模型。LinuxKernel也作為硬件和軟件之間的抽象層,它隱藏具體硬件細(xì)節(jié)而為上層提供統(tǒng)一的服務(wù)。如果你學(xué)過計算機(jī)網(wǎng)絡(luò)知道OSI/RM,就會知道分層的好處就是使用下層提供的服務(wù)而為上層提供統(tǒng)一的服務(wù),屏蔽本層及以下層的差異,當(dāng)本層及以下層發(fā)生了變化不會影響到上層。也就是說各層各盡其職,各層提供固定的SAP(ServiceAccessPoint),專業(yè)點可以說是高內(nèi)聚、低耦合。如果你只是做應(yīng)用開發(fā),就不需要深入了解LinuxKernel層。3.3.2AndroidRuntimeAndroid包含一個核心庫的集合,提供大部分在Java編程語言核心類庫中可用的功能。每一個Android應(yīng)用程序是Dalvik虛擬機(jī)中的實例,運行在他們自己的進(jìn)程中。Dalvik虛擬機(jī)設(shè)計成,在一個設(shè)備可以高效地運行多個虛擬機(jī)。Dalvik虛擬機(jī)可執(zhí)行文件格式是.dex,dex格式是專為Dalvik設(shè)計的一種壓縮格式,適合內(nèi)存和處理器速度有限的系統(tǒng)。大多數(shù)虛擬機(jī)包括JVM都是基于棧的,而Dalvik虛擬機(jī)則是基于寄存器的。兩種架構(gòu)各有優(yōu)劣,一般而言,基于棧的機(jī)器需要更多指令,而基于寄存器的機(jī)器指令更大。dx是一套工具,可以將Java.class轉(zhuǎn)換成.dex格式。一個dex文件通常會有多個.class。由于dex有時必須進(jìn)行最佳化,會使文件大小增加1-4倍,以O(shè)DEX結(jié)尾。Dalvik虛擬機(jī)依賴于Linux內(nèi)核提供基本功能,如線程和底層內(nèi)存管理。3.3.3LibraryAndroid包含一個C/C++庫的集合,供Android系統(tǒng)的各個組件使用。這些功能通過Android的應(yīng)用程序框架(applicationframework)暴露給開發(fā)者。下面列出一些核心庫:系統(tǒng)C庫——標(biāo)準(zhǔn)C系統(tǒng)庫(libc)的BSD衍生,調(diào)整為基于嵌入式Linux設(shè)備媒體庫——基于PacketVideo的OpenCORE。這些庫支持播放和錄制許多流行的音頻和視頻格式,以及靜態(tài)圖像文件,包括MPEG4、H.264、MP3、AAC、AMR、JPG、PNG界面管理——管理訪問顯示子系統(tǒng)和無縫組合多個應(yīng)用程序的二維和三維圖形層LibWebCore——新式的Web瀏覽器引擎,驅(qū)動Android瀏覽器和內(nèi)嵌的web視圖SGL——基本的2D圖形引擎3D庫——基于OpenGLES1.0APIs的實現(xiàn)。庫使用硬件3D加速或包含高度優(yōu)化的3D軟件光柵FreeType——位圖和矢量字體渲染SQLite——所有應(yīng)用程序都可以使用的強(qiáng)大而輕量級的關(guān)系數(shù)據(jù)庫引擎。3.3.4ApplicationFramework通過提供開放的開發(fā)平臺,Android使開發(fā)者能夠編制極其豐富和新穎的應(yīng)用程序。開發(fā)者可以自由地利用設(shè)備硬件優(yōu)勢、訪問位置信息、運行后臺服務(wù)、設(shè)置鬧鐘、向狀態(tài)欄添加通知等等,很多很多。開發(fā)者可以完全使用核心應(yīng)用程序所使用的框架APIs。應(yīng)用程序的體系結(jié)構(gòu)旨在簡化組件的重用,任何應(yīng)用程序都能發(fā)布他的功能且任何其他應(yīng)用程序可以使用這些功能(需要服從框架執(zhí)行的安全限制)。這一機(jī)制允許用戶替換組件。所有的應(yīng)用程序其實是一組服務(wù)和系統(tǒng),包括:視圖(View)——豐富的、可擴(kuò)展的視圖集合,可用于構(gòu)建一個應(yīng)用程序。包括包括列表、網(wǎng)格、文本框、按鈕,甚至是內(nèi)嵌的網(wǎng)頁瀏覽器內(nèi)容提供者(ContentProviders)——使應(yīng)用程序能訪問其他應(yīng)用程序(如通訊錄)的數(shù)據(jù),或共享自己的數(shù)據(jù)資源管理器(ResourceManager)——提供訪問非代碼資源,如本地化字符串、圖形和布局文件通知管理器(NotificationManager)——使所有的應(yīng)用程序能夠在狀態(tài)欄顯示自定義警告活動管理器(ActivityManager)——管理應(yīng)用程序生命周期,提供通用的導(dǎo)航回退功能。3.3.5ApplicationAndroid裝配一個核心應(yīng)用程序集合,包括電子郵件客戶端、SMS程序、日歷、地圖、瀏覽器、聯(lián)系人和其他設(shè)置。所有應(yīng)用程序都是用Java編程語言寫的。更加豐富的應(yīng)用程序有待我們?nèi)ラ_發(fā)!從上面我們知道Android的架構(gòu)是分層的,非常清晰,分工很明確。Android本身是一套軟件堆疊(SoftwareStack),或稱為「軟件疊層架構(gòu)」,疊層主要分成三層:操作系統(tǒng)、中間件、應(yīng)用程序。從上面我們也看到了開源的力量,一個個熟悉的開源軟件在這里貢獻(xiàn)了自己的一份力量。3.4系統(tǒng)組件Android開發(fā)四大組件分別是:活動(Activity):用于表現(xiàn)功能。服務(wù)(Service):后臺運行服務(wù),不提供界面呈現(xiàn)。廣播接收器(BroadcastReceiver):用于接收廣播。內(nèi)容提供商(ContentProvider):支持在多個應(yīng)用中存儲和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫[8]。3.4.1Activity應(yīng)用程序的顯示層。每一個畫面對應(yīng)于你的應(yīng)用程序,將會是Activity類的擴(kuò)展。Activity使用Views去構(gòu)建UI來顯示信息和響應(yīng)用戶的行為。就桌面開發(fā)而言,一個Activity相當(dāng)于一張F(tuán)orm。一個Activity通常展現(xiàn)為一個可視化的用戶界面。例如,一個Activity可能展現(xiàn)為一個用戶可以選擇的菜單項列表或者展現(xiàn)一些圖片以及圖片的標(biāo)題。一個消息服務(wù)應(yīng)用程序可能包含一個顯示聯(lián)系人列表的Activity,一個編寫信息的Activity,以及其它一些查看信息和修改應(yīng)用程序設(shè)置的Activity。雖然這些Activity一起工作,共同組成了一個應(yīng)用程序,但每一個Activity都是相對獨立的。每一個Activity都是Activity(android.app.Activity)的子類。3.4.2ServiceAndroid應(yīng)用程序中不可見的“工人”。Service組件運行時不可見,但它負(fù)責(zé)更新的數(shù)據(jù)源和可見的Activity,以及觸發(fā)通知。它們常用來執(zhí)行一些需要持續(xù)運行的處理,當(dāng)你的Activity已經(jīng)不處于激活狀態(tài)或不可見。Service沒有用戶界面,但它會在后臺一直運行。例如,Service可能在用戶處理其它事情的時候播放背景音樂,或者從網(wǎng)絡(luò)上獲取數(shù)據(jù),或者執(zhí)行一些運算,并把運算結(jié)構(gòu)提供給Activity展示給用戶。每個Service都擴(kuò)展自類Serivce。應(yīng)用程序可以連接到一個正在運行中的Service。當(dāng)連接到一個Service后,可以使用這個Service向外暴露的接口與這個Service進(jìn)行通信。對于上面提到的播放音樂的Service,這個接口可能允許用戶暫停,停止或重新播放音樂。與activity以及其它組件一樣,Service同樣運行在應(yīng)用程序進(jìn)程的主線程中。所以它們不能阻塞其它組件或用戶界面,通常需要為這些Service派生一個線程執(zhí)行耗時的任務(wù)。3.4.3BroadcastReceiverIntent廣播的“消費者”。通過創(chuàng)建和注冊一個BroadcastReceiver,應(yīng)用程序可以監(jiān)聽符合特定條件的廣播的Intent。BroadcastReceiver會自動的啟動你的Android應(yīng)用程序去響應(yīng)新來的Intent。BroadcastReceiver是事件驅(qū)動程序的理想手段。BroadcaseReceiver不執(zhí)行任何任務(wù),僅僅是接受并響應(yīng)廣播通知的一類組件。大部分廣播通知是由系統(tǒng)產(chǎn)生的,例如改變時區(qū),電池電量低,用戶選擇了一幅圖片或者用戶改變了語言首選項。應(yīng)用程序同樣也可以發(fā)送廣播通知,例如通知其他應(yīng)用程序某些數(shù)據(jù)已經(jīng)被下載到設(shè)備上可以使用。3.4.4ContentProvider提供共享的數(shù)據(jù)存儲。ContentProvider(內(nèi)容提供器)用來管理和共享應(yīng)用程序的數(shù)據(jù)庫。在應(yīng)用程序間,ContentProvider是共享數(shù)據(jù)的首選方式。這意味著,你可以配置自己的ContentProvider去存取其他的應(yīng)用程序或者通過其他應(yīng)用程序暴露的ContentProvider去存取它們的數(shù)據(jù)。Android設(shè)備本身包含了幾個ContentProvider來訪問像聯(lián)系人信息等有用的數(shù)據(jù)庫。應(yīng)用程序可以通過ContentProvider訪問其它應(yīng)用程序的一些私有數(shù)據(jù),這是Android提供的一種標(biāo)準(zhǔn)的共享數(shù)據(jù)的機(jī)制。共享的數(shù)據(jù)可以是存儲在文件系統(tǒng)中、SQLite數(shù)據(jù)庫中或其它的一些媒體中。ContentProvider擴(kuò)展自ContentProvider類,通過實現(xiàn)此類的一組標(biāo)準(zhǔn)的接口可以使其它應(yīng)用程序存取由它控制的數(shù)據(jù)。然而應(yīng)用程序并不會直接調(diào)用ContentProvider中的方法,而是通過類ContentResolver。ContentResolver能夠與任何一個ContentProvider通信,它與ContentProvider合作管理進(jìn)程間的通信。
第四章系統(tǒng)開發(fā)及其相關(guān)技術(shù)4.1Android開發(fā)環(huán)境介紹Android的上層應(yīng)用程序是用Java語言開發(fā),同時還需要基于Dalvik虛擬機(jī),所以,Google公司推薦使用主流的Java繼承開發(fā)環(huán)境Eclipse。只有Eclipse還不夠,因為是使用Java語言進(jìn)行開發(fā),還應(yīng)該有由SUN公司提供的JavaSDK(其中包括JRE:JavaRuntimeEnvironment)。此外,Android的應(yīng)用程序開發(fā)和Java開發(fā)有較大區(qū)別的,所以還需要有Google提供的AndroidSDK。同時,還需要在Eclipse安裝ADT,為Android開發(fā)提供開發(fā)工具的升級或者變更,是Eclipse下開發(fā)工具的升級下載的工具。簡言之,需要以下軟件,才能搭建Android開發(fā)環(huán)境,從而進(jìn)行Android應(yīng)用程序的開發(fā)。1)JavaSDK2)Eclipse3)AndroidSDK4)ADT日前,GoogleAndroidStudio1.0開發(fā)環(huán)境的推出,無疑給Android軟件開發(fā)帶來了極大的便捷。4.2Android開發(fā)平臺搭建Android開發(fā)平臺搭建步驟:1)首先到/downloads/下載Eclipse集成開發(fā)環(huán)境并且解壓,這里推薦下載JavaEE集成版本,可以為平臺的搭建省下不少工作。接著再去/javase/downloads/index.jsp站點下載/android/android-sdk-windows-1.5_r1.zip,AndroidSDK1.5后解壓。第一步下載工序就結(jié)束了。2)雙擊Eclipse解壓后目錄中的eclipse.exe然后啟動,選擇Eclipse菜單中的Help->InstallNewSoftware->選項卡上的AvailableSoftware,點擊右側(cè)的“Add”輸入/android/eclipse/后確定,然后在“Workwith”下拉菜單中選擇剛才輸入的網(wǎng)址。過一會就會出現(xiàn)一個DeveloperTools選項,勾上以后點擊Next以后Eclipse會自動網(wǎng)上查找Android開發(fā)工具插件,然后找到AndroidDDMS和AndroidDevelopmentTools,選中這兩個點擊Finish,Eclipse就會自動下載并安裝Android插件了,最后會提示重啟Eclipse。3)重啟后選擇Eclipse菜單中的Windows->Preferences在左側(cè)的Android項目中SDKLocation中填入AndroidSDK解壓后的目錄,然后點擊Apply。4)在WindowsXP的系統(tǒng)變量中的path變量中添加一個值,該值指向解壓后的AndroidSDK目錄下的tools文件夾。4.3SQlite4.3.1SQlite簡介SQLite,是一款輕型的數(shù)據(jù)庫,是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng),它的設(shè)計目標(biāo)是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用資源非常的低,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時能夠跟很多程序語言相結(jié)合,比如Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源世界著名的數(shù)據(jù)庫管理系統(tǒng)來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生于2000年5月。至今已經(jīng)有12個年頭,SQLite也迎來了一個版本SQLite3已經(jīng)發(fā)布。不像常見的客戶-服務(wù)器范例,SQLite引擎不是個程序與之通信的獨立進(jìn)程,而是連接到程序中成為它的一個主要部分。所以主要的通信協(xié)議是在編程語言內(nèi)的直接API調(diào)用。這在消耗總量、延遲時間和整體簡單性上有積極的作用。整個數(shù)據(jù)庫(定義、表、索引和數(shù)據(jù)本身)都在宿主主機(jī)上存儲在一個單一的文件中。它的簡單的設(shè)計是通過在開始一個事務(wù)的時候鎖定整個數(shù)據(jù)文件而完成的[9]。4.3.2SQlite特性1)比一些流行的數(shù)據(jù)庫在大部分普通數(shù)據(jù)庫操作要快2)簡單,輕松的API3)包含TCL綁定,同時通過Wrapper支持其他語言的綁定4)良好注釋的源代碼,并且有著90%以上的測試覆蓋率5)獨立:沒有額外依賴6)Source完全的Open,你可以用于任何用途,包括出售它7)支持多種開發(fā)語言,C,PHP,Perl,Java,C#,Python,Ruby4.3.3SQlite功能SQLite雖然很小巧,但是支持的SQL語句不會遜色于其他開源數(shù)據(jù)庫,它支持的SQL包括:ATTACHDATABASEBEGINTRANSACTIONCOMMENTCOMMITTRANSACTION等等。同時它還支持事務(wù)處理功能等等。也有人說它象Microsoft的Access,有時候真的覺得有點象,但是事實上它們區(qū)別很大。比如SQLite支持跨平臺,操作簡單,能夠使用很多語言直接創(chuàng)建數(shù)據(jù)庫,而不象Access一樣需要Office的支持。如果你是個很小型的應(yīng)用,或者你想做嵌入式開發(fā),沒有合適的數(shù)據(jù)庫系統(tǒng),那么你可以考慮使用SQLite。目前它的最新版本是3.7.8。它的官方網(wǎng)站是:http://www.sqlite.org或者h(yuǎn)ttp://www.sqlite.com.cn,能在上面獲得源代碼和文檔。同時因為數(shù)據(jù)庫結(jié)構(gòu)簡單,系統(tǒng)源代碼也不是很多,也適合想研究數(shù)據(jù)庫系統(tǒng)開發(fā)的專業(yè)人士[10]。4.3.4SQlite類型SQLite的數(shù)據(jù)類型,首先你會接觸到一個讓你驚訝的名詞:Typelessness(無類型)。對!SQLite是無類型的.這意味著你可以保存任何類型的數(shù)據(jù)到你所想要保存的任何表的任何列中,無論這列聲明的數(shù)據(jù)類型是什么(只有在一種情況下不是,稍后解釋)。對于SQLite來說對字段不指定類型是完全有效的。如:CreateTableex1(a,b,c);誠然SQLite允許忽略數(shù)據(jù)類型,但是仍然建議在你的CreateTable語句中指定數(shù)據(jù)類型。因為數(shù)據(jù)類型對于你和其他的程序員交流,或者你準(zhǔn)備換掉你的數(shù)據(jù)庫引擎時能起到一個提示或幫助的作用[11]。第五章系統(tǒng)的設(shè)計與實現(xiàn)5.1技術(shù)支持本軟件是基于andriod的手機(jī)天氣預(yù)報系統(tǒng)。1)首先天氣預(yù)報功能是調(diào)用國家氣象局的免費接口:本軟件使用到的中國國家氣象局天氣預(yù)報接口總共有兩個:/data/sk/101010100.html/data/101010100.html上面url中的101010100是城市代碼,這里是北京的城市代碼。只需要改變城市代碼,就可以得到所在城市的天氣信息。在瀏覽器上輸入url:/data/sk/101010100.html得到信息,天氣信息是json的數(shù)據(jù)格式。第一個接口主要是獲取當(dāng)天天氣的具體信息,實時溫度信息。第二個接口主要是獲取當(dāng)天及未來幾天的粗略天氣信息。2)json數(shù)據(jù)解析:JavaScriptObjectNotation,但是獨立于語言。類似XML,可以用來文本信息的存儲和交換,是數(shù)據(jù)的載體。從天氣預(yù)報接口獲得天氣信息時需要對天氣進(jìn)行解析,解析出自己需要的天氣信息。3)定位功能:本軟件采用的是百度地圖定位因為google在中國服務(wù)不穩(wěn)定,使用googleAPI獲取地理信息在某些型號手機(jī)上無法實現(xiàn),因此使用百度SDK定位功能,調(diào)用百度類庫實現(xiàn)定位,百度定位SDK所需文件:locSDK_3.3.jar,liblocSDK3.so。widget桌面部件:AppWidget框架類:1、AppWidgetProvider:繼承自BroadcastRecevier,在AppWidget應(yīng)用update、enable、disable和delete時接收通知。其中,onUpdate、onReceive是最常用到的方法,它們接收更新通知。2、AppWidgetProvderInfo:描述AppWidget的大小、更新頻率和初始界面等信息,以XML文件形式存在于應(yīng)用的res/xml/目錄下。3、AppWidgetManger:負(fù)責(zé)管理AppWidget,向AppwidgetProvider發(fā)送通知。4、RemoteViews:一個可以在其他應(yīng)用進(jìn)程中運行的類,向AppWidgetProvider發(fā)送通知。5)android-support-v4.jar這個是android界面特殊效果的第三方的jar包。5.2數(shù)據(jù)庫的設(shè)計本軟件選擇SQlite數(shù)據(jù)庫作為數(shù)據(jù)存儲的載體,建立數(shù)據(jù)庫all_city.db,此數(shù)據(jù)庫記錄了所有城市的信息和查詢代碼,在查詢指定城市的天氣時,需要用到它提供的城市碼,而城市碼相對穩(wěn)定不變,所以在構(gòu)建系統(tǒng)時將其事先復(fù)制到手機(jī)的存儲設(shè)備中,以備日后查詢。其中存在兩個表:Provice和city,Provice包括provice.id和,City包括city.id和,并且provice和city形成級聯(lián)關(guān)系。在進(jìn)行初始化數(shù)據(jù)庫時還建立了訂閱城市表TB_CITY。表5-1訂閱城市表字段名類型描述FIELD_CITY_IDINTEGERPrimaryKeyFIELD_CITY_NAMETEXT城市名FIELD_WEATHER1TEXT當(dāng)天天氣FIELD_TIME1TEXT當(dāng)天時間FIELD_WEATHER_IMG1INTEGER當(dāng)天天氣圖標(biāo)FIELD_REALTIME_TEMPTEXT當(dāng)天實時氣溫FIELD_TEMPERATURE1TEXT當(dāng)天氣溫FIELD_WINDTEXT當(dāng)天風(fēng)力FIELD_ADVICETEXT建議FIELD_TIME2TEXT明天天氣數(shù)據(jù)庫相關(guān)操作:插入publicvoidinsertMyCity(intid,Stringname,booleanisDefault){//插入我訂閱的城市信息 db.beginTransaction(); try{ db.execSQL("updatetbCitysetisDefault=0"); db.execSQL("INSERTORREPLACEINTOtbCity(cityId,cityName,isDefault)VALUES(?,?,?)",newObject[]{id,name,isDefault}); db.setTransactionSuccessful(); }catch(Exceptione){ e.printStackTrace(); }finally{ db.endTransaction(); }}2)刪除publicvoiddeleteMyCity(intid){//刪除我訂閱的城市 db.execSQL("deletefromtbCitywherecityId=?",newObject[]{id}); }5.3主要模塊5.3.1項目功能界面天氣顯示界面天氣顯示界面后退定位城市管理啟動程序加載界面初始化天氣界面添加城市退出刷新圖5-1功能模塊圖5.3.2項目框架本項目主要框架如下:圖5-2項目框架圖其中各文件的功能是:Constant是一些常量定義的地方。WeatherApplication是一個android應(yīng)用啟動最先啟動的地方,在這里進(jìn)行全局變量初始化打開數(shù)據(jù)庫等操作,AllCityActivity是所有城市選擇列表界面,CitymanageActivity是顯示當(dāng)前你的訂閱的城市,LaunchActivity是啟動畫面,MainActivity是天氣顯示界面,主界面。DBHelper是數(shù)據(jù)庫建表操作,DBManager是對數(shù)據(jù)庫增刪改查操作。City是城市類,MyCity是訂閱城市類,Province是省關(guān)聯(lián)到City省、市形成級聯(lián)UpdateReceive接受更新命令的廣播,UpdateService是更新服務(wù),所有的更新請求服務(wù)器操作,接受返回信息。Widget是桌面小控件控制。HttpConnect是http請求操作工具類。MyLog是打印日志工具類。MyThreadPool是線程池工具類。ImageUtil是圖片選擇工具類,NetworkUtil是檢測手機(jī)網(wǎng)絡(luò)工具類,StreamUtil是轉(zhuǎn)換Http數(shù)據(jù)流工具類。ServerResponseException是自定義的一個異常當(dāng)遠(yuǎn)程服務(wù)器響應(yīng)出現(xiàn)問題時,拋出此異常。5.4主要代碼解析5.4.1啟動界面在啟動界面,當(dāng)應(yīng)用程序啟動時,Android首先會開啟一個主線程(也就是UI線程),主線程為管理界面中的UI控件,進(jìn)行事件分發(fā),如果此時需要一個耗時的操作,你不能把這些操作放在主線程中,如果你放在主線程中的話,界面會出現(xiàn)假死現(xiàn)象,如果5秒鐘還沒有完成的話,會收到Android系統(tǒng)的一個錯誤提示"強(qiáng)制關(guān)閉".這個時候我們需要把這些耗時的操作,放在一個子線程中,因為子線程涉及到UI更新,Android主線程是線程不安全的,也就是說,更新UI只能在主線程中更新,子線程中操作是危險的.這個時候,Handler就出現(xiàn)了.來解決這個復(fù)雜的問題,由于Handler運行在主線程中(UI線程中),它與子線程可以通過Message對象來傳遞數(shù)據(jù),這個時候,Handler就承擔(dān)著接受子線程傳過來的(子線程用sedMessage()方法傳弟)Message對象,(里面包含數(shù)據(jù)),把這些消息放入主線程隊列中,配合主線程進(jìn)行更新UI。privateHandlerhandler=newHandler(){//使用handler時首先要創(chuàng)建一個handler publicvoidhandleMessage(Messagemsg){ //TODO接收消息并且去更新UI線程上的控件內(nèi)容 super.handleMessage(msg); //Handler運行在主線程中(UI線程中),它與子線程可以通過Message對象來傳遞數(shù)據(jù), //這個時候,Handler就承擔(dān)著接受子線程傳過來的(子線程用sedMessage()方法傳弟)Message對象,(里面包含數(shù)據(jù)), //把這些消息放入主線程隊列中,配合主線程進(jìn)行更新UI switch(msg.what){ case1: Intentintent=newIntent(LaunchActivity.this,MainActivity.class);//從LaunchActivity轉(zhuǎn)到MainActivity startActivity(intent);//啟動MainActivity finish();//結(jié)束LaunchActivity break; }}};進(jìn)入啟動界面后,可定義2秒后跳轉(zhuǎn)至天氣顯示界面:myThreadPool.execute(newRunnable(){//匿名內(nèi)部類,此時傳給myThreadPool構(gòu)造函數(shù)的應(yīng)該是一個實現(xiàn)Runnable的類的對象引用 @Override //Runnable是一個接口,不是一個線程,一般線程會實現(xiàn)Runnable。 //所以如果我們使用匿名內(nèi)部類是運行在UI主線程的,如果我們使用實現(xiàn)這個Runnable接口的線程類,則是運行在對應(yīng)線程的 publicvoidrun(){//定時器2秒之后跳轉(zhuǎn) while(!WeatherApplication.isInit){ try{ Thread.sleep(50);//線程休眠50毫秒 //如果大于50毫秒時不進(jìn)行休眠。這里讓線程休眠的目的就控制游戲畫面的刷新頻率。 //如果不足50毫秒可能是作者認(rèn)為刷新太快了 }catch(InterruptedExceptione){ e.printStackTrace(); }} finishTime=System.currentTimeMillis();//記錄下邏輯處理完成時的時間. if(finishTime-startTime<2000){//如果處理時間小于2秒的話線程需要等足到2秒也就是(2000-邏輯處理的時間差)再進(jìn)行下次操作. try{ Thread.sleep(2000-(finishTime-startTime)); }catch(InterruptedExceptione){ e.printStackTrace(); }} handler.sendEmptyMessage(1);//通過Handler,發(fā)送到消息隊列里面去運行,//執(zhí)行完畢后給handler發(fā)送一個消息}});5.4.2天氣顯示界面文件WeatherApplication.java該文件中是一個android應(yīng)用最先啟動的地方,在這里進(jìn)行全局變量初始化,打開數(shù)據(jù)庫等操作。初始化應(yīng)用:publicvoidinit(){//初始化應(yīng)用 allCities=openDataBase().queryAllCity();//從數(shù)據(jù)庫讀取所有城市信息 cities=openDataBase().queryMyCity();//讀取所有我訂閱的城市信息 if(!cities.isEmpty()){//設(shè)置默認(rèn)城市 for(inti=0;i<cities.size();i++){ if(cities.get(i).isDefault) curCityIndex=i; }}else curCityIndex=-1; }設(shè)置一個定時更新的提醒:publicvoidsetAlarm(){//設(shè)置定時更新提醒 Intentintent=newIntent(this,UpdateReceive.class); intent.setAction("com.hfuu.weather.action.update"); sender=PendingIntent.getBroadcast(this,0,intent,0); //開始時間 longfirstime=SystemClock.elapsedRealtime(); am=(AlarmManager)getSystemService(ALARM_SERVICE); //5秒一個周期,不停的發(fā)送廣播 am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,firstime,5*1000,sender); }打開數(shù)據(jù)庫操作:publicDBManageropenDataBase(){//開啟數(shù)據(jù)庫操作 if(isDataBaseOpened==false||dbManager==null){ dbManager=DBManager.getInstance(this); isDataBaseOpened=true; } returndbManager; }5.4.3當(dāng)前訂閱城市界面CityManageActivity.java在該界面主要是顯示當(dāng)前你所訂閱的城市,在該界面用了一個Adapter適配器來進(jìn)行下拉菜單的操作:cityAdapter=newCityAdapter(this,WeatherApplication.cities); cityList.setAdapter(cityAdapter); cityList.setOnItemClickListener(newAdapterView.OnItemClickListener(){ publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,longarg3){ WeatherApplication.curCityIndex=arg2; myThreadPool.execute(newRunnable(){ publicvoidrun(){ for(MyCitycity:WeatherApplication.cities){ city.isDefault=false; } WeatherApplication.cities.get(WeatherApplication.curCityIndex).isDefault=true; app.openDataBase().changeDefault(WeatherApplication.cities.get(WeatherApplication.curCityIndex).id); }}); WeatherApplication.mainActivity.refreshUpdate(); Intenti=newIntent("com.hfuu.weather.action.widget"); sendBroadcast(i); finish(); } });同時在該界面還添加了一個長按菜單,當(dāng)你想要刪除你所訂閱的城市時,長按,會出現(xiàn)是否刪除對話框:cityList.setOnItemLongClickListener(newAdapterView.OnItemLongClickListener(){ publicbooleanonItemLongClick(AdapterView<?>arg0,Viewarg1,intarg2,longarg3){ dialogue(WeatherApplication.cities.get(arg2)); returnfalse; } }); }//添加長按菜單5.4.4定位功能當(dāng)你第一次運行該程序時,進(jìn)行定位功能時,會出現(xiàn)你當(dāng)前所在的城市,并且會出現(xiàn)是否添加對話框,定位時調(diào)用百度地圖定位的類庫:privatevoidsettingLocation(){//初始化定位,調(diào)用百度定位的類庫 mLocationClient=newLocationClient(this.getApplicationContext()); mBDLocationListener=newMyBDLocationListener(); mLocationClient.registerLocationListener(mBDLocationListener); LocationClientOptionoption=newLocationClientOption(); //需要地址信息,設(shè)置為其他任何值(string類型,且不能為null)時,都表示無地址信息。 option.setAddrType("all"); //設(shè)置是否返回POI的電話和地址等詳細(xì)信息。默認(rèn)值為false,即不返回POI的電話和地址信息。 option.setPoiExtraInfo(true); //設(shè)置產(chǎn)品線名稱。強(qiáng)烈建議您使用自定義的產(chǎn)品線名稱,方便我們以后為您提供更高效準(zhǔn)確的定位服務(wù)。 option.setProdName("定位我當(dāng)前的位置"); //打開GPS,使用gps前提是用戶硬件打開gps。默認(rèn)是不打開gps的。 option.setOpenGps(false); option.setTimeOut(6); //定位的時間間隔,單位:ms //當(dāng)所設(shè)的整數(shù)值大于等于1000(ms)時,定位SDK內(nèi)部使用定時定位模式。 //option.setScanSpan(1000); //查詢范圍,默認(rèn)值為500,即以當(dāng)前定位位置為中心的半徑大小。 option.setPoiDistance(500); //禁用啟用緩存定位數(shù)據(jù) option.disableCache(true); //坐標(biāo)系類型,百度手機(jī)地圖對外接口中的坐標(biāo)系默認(rèn)是bd09ll option.setCoorType("bd09ll"); //設(shè)置最多可返回的POI個數(shù),默認(rèn)值為3。由于POI查詢比較耗費流量,設(shè)置最多返回的POI個數(shù),以便節(jié)省流量。 option.setPoiNumber(3); //設(shè)置定位方式的優(yōu)先級。 //即使有GPS,而且可用,也仍舊會發(fā)起網(wǎng)絡(luò)請求。這個選項適合對精確坐標(biāo)不是特別敏感,但是希望得到位置描述的用戶。 option.setPriority(LocationClientOption.NetWorkFirst); mLocationClient.setLocOption(option); }進(jìn)行定位時,打印log信息,獲取省份和城市信息:privateclassMyBDLocationListenerimplementsBDLocationListener{ publicvoidonReceiveLocation(BDLocationlocation){ MyLog.i("收到了位置信息!"); if(location==null){ handler.sendEmptyMessage(10); return; } Stringtemp1=location.getProvince();//獲取省份信息 Stringtemp2=location.getCity();//獲取城市信息 if(temp1==null||temp2==null){ handler.sendEmptyMessage(10);//通知handle更新 return; } mProvince=temp1.substring(0,temp1.length()-1); mCity=temp2.substring(0,temp2.length()-1); MyLog.i(mProvince+"==="+mCity); handler.sendEmptyMessage(0); } @Override publicvoidonReceivePoi(BDLocationpoiLocation){ MyLog.i("收到了位置信息!onReceivePoi"); } }}5.4.5菜單項的操作對菜單進(jìn)行選擇操作,通過選擇不同的菜單進(jìn)入不同的功能界面:publicbooleanonOptionsItemSelected(MenuItemitem){//menu選擇操作 intitem_id=item.getItemId(); switch(item_id){ case0://更新操作 if(WeatherApplication.curCityIndex>=0){ //btnUpdate.setEnabled(false); //btnUpdate.startAnimation(animation); pd.setMessage("正在更新...");//進(jìn)度框 pd.show(); Intentintent1=newIntent(MainActivity.this,UpdateService.class); intent1.setFlags(0); startService(intent1); } break; case1://城市管理操作 Intentintent=newIntent(this,CityManageActivity.class); startActivity(intent); break; case2://退出 finish(); break; } returntrue; }5.4.6更新操作接受到更新操作的信息后才能進(jìn)行更新操作,通過startService來開啟更新服務(wù),更新操作時通過myThreadPool=MyThreadPool.getInstance()來開啟線程,通過httpConnect=HttpConnect.getInstance()進(jìn)行http連接。通過更新操作獲取實時的天氣信息:/** *獲取當(dāng)天實時的天氣 *@throwsClientProtocolException *@throwsIOException *@throwsServerResponseException *@throwsJSONException */ privatevoidupdateRealtime()throwsClientProtocolException,IOException,ServerResponseException,JSONException{ StringBuildersb1=newStringBuilder();//把地址給sb1 sb1.append(Constants.URL_REALTIME).append(WeatherApplication.cities.get(WeatherApplication.curCityIndex).id).append(Constants.HTML); InputStreamis=httpConnect.get(sb1.toString()); StringjsonString=StreamUtil.stream2string(is); JSONObjectjsonObject=newJSONObject(jsonString); JSONObjectweather=(JSONObject)jsonObject.get("weatherinfo"); myCity.id=Integer.valueOf(weather.getString("cityid")).intValue(); myC=weather.getString("city"); myCity.realtimeTemp=weather.getString("temp"); }5.4.7widget功能由于widget中的時鐘關(guān)系,需要對widget顯示進(jìn)行時刻的更新用來保持與系統(tǒng)中時間的一致。實現(xiàn)這個功能需要用到AlarmManager類,這個類專門用來設(shè)定在某個指定的時間去完成指定的事件。設(shè)計思路是在Widget的onUpdate方法中啟動一個自定義更新后臺服務(wù),更新widget,并設(shè)定下一分鐘再次調(diào)用此服務(wù)。publicvoidonReceive(Contextcontext,Intentintent){//widget接收到廣播 super.onReceive(context,intent); MyLog.i("WidgetonReceive"); this.context=context; if(intent.getAction().equals("com.hfuu.weather.action.widget")){ update(); }}publicvoidonUpdate(Contextcontext,AppWidgetManagerappWidgetManager,int[]appWidgetIds){//更新widget MyLog.i("WidgetonUpdate"); this.appWidgetManager=appWidgetManager; this.context=context; //定義計時器 if(timer==null) timer=newTimer(); //周期性更改時間 timer.schedule(newTimerTask(){ publicvoidrun(){ handler.sendEmptyMessage(0); } },0,1000);//改變時間的定時器一秒鐘更新一次 }5.4.8http請求操作由于本設(shè)計是實時天氣預(yù)報系統(tǒng),因此需要聯(lián)網(wǎng),所以要進(jìn)行http連接,先進(jìn)行http請求通過HttpClient接口實現(xiàn):privateHttpConnect(){ //HttpClient是接口,DefaultHttpClient是實現(xiàn)這個接口的子類 httpClient=newDefaultHttpClient();//創(chuàng)建一個默認(rèn)的HttpClient //DefaultHttpClient是HttpClient接口的默認(rèn)實現(xiàn) //這個類扮演了很多特殊用戶程序或策略接口實現(xiàn)負(fù)責(zé)處理特定HTTP協(xié)議方面, //比如重定向到處理認(rèn)證或做出關(guān)于連接持久化和保持活動的持續(xù)時間決定的門面。這使得用戶可以選擇使用定制,具體程序等來替換某些方面默認(rèn)實現(xiàn)。 HttpParamsparams=httpClient.getParams();//計算網(wǎng)絡(luò)超時用 params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT,1000*10);//請求超時 params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,1000*10);//連接超時 mConnManager=httpClient.getConnectionManager(); httpClient=newDefaultHttpClient(newThreadSafeClientConnManager(params,mConnManager.getSchemeRegistry()),params); } publicstaticHttpConnectgetInstance(){//在寫程序庫代碼時,有時有一個類需要被所有的其它類使用, //但又要求這個類只能實例化一次,是個服務(wù)類,定義一次,其它類使用同一個這個類的實例 if(httpConnect==null){ httpConnect=newHttpConnect(); } returnhttpConnect; }5.4.9檢測手機(jī)網(wǎng)絡(luò)在android手機(jī)上運行時需要保持手機(jī)網(wǎng)絡(luò)通暢,因此需要檢測手機(jī)網(wǎng)絡(luò):privateNetworkUtil(Contextcontext){ if(cwjManager==null) cwjManager=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); } publicstaticNetworkUtilgetInstance(Contextcontext){ if(networkUtil==null) networkUtil=newNetworkUtil(context.getApplicationContext()); returnnetworkUtil; } publicbooleanIsNetworkConnected(){ NetworkInfomNetworkInfo=cwjManager.getActiveNetworkInfo(); if(mNetworkInfo!=null){ returnmNetworkInfo.isAvailable();} returnfalse;}5.4.10線程池ThreadPool通過運用線程池可以實現(xiàn)程序高效的運行:publicclassMyThreadPool{ privatestaticMyThreadPoolmyThreadPool; privateExecutorServicemExecutor; privateMyThreadPool(){ mExecutor=Executors.newCachedThreadPool(); } publicstaticMyThre
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 某區(qū)域銷售總代理合同書
- 校園空調(diào)租賃合同范本
- 供方購銷合同范本
- 保安服務(wù)勞動合同
- 淘寶代運營服務(wù)合同年
- 藥品物流運輸合同
- 合同欺詐的定義
- 承包土地合同咋寫
- 論預(yù)防未成年人犯罪的五階段模式
- 《車輛抵押借款合同范本》
- 課題申報書:數(shù)智賦能高職院校思想政治理論課“金課”實踐路徑研究
- H3CNE認(rèn)證考試題庫官網(wǎng)2022版
- 感統(tǒng)訓(xùn)練培訓(xùn)手冊(適合3-13歲兒童)
- ??停?024年智能制造校園招聘白皮書
- 住院病人燙傷的應(yīng)急演練
- 新入職消防員考核試卷題庫(240道)
- 海員的營養(yǎng)-1315醫(yī)學(xué)營養(yǎng)霍建穎等講解
- 2023年廣東省招聘事業(yè)單位人員考試真題及答案
- 幼兒平衡車訓(xùn)練課程設(shè)計
- 創(chuàng)業(yè)計劃路演-美甲
- 梁山伯與祝英臺小提琴譜樂譜
評論
0/150
提交評論