綜合示例設(shè)計(jì)與開發(fā)課件_第1頁(yè)
綜合示例設(shè)計(jì)與開發(fā)課件_第2頁(yè)
綜合示例設(shè)計(jì)與開發(fā)課件_第3頁(yè)
綜合示例設(shè)計(jì)與開發(fā)課件_第4頁(yè)
綜合示例設(shè)計(jì)與開發(fā)課件_第5頁(yè)
已閱讀5頁(yè),還剩90頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第12章綜合示例設(shè)計(jì)與開發(fā)第12章綜合示例設(shè)計(jì)與開發(fā)本章學(xué)習(xí)目標(biāo):掌握Android應(yīng)用程序的基本設(shè)計(jì)方法和思路

掌握使用多種組件進(jìn)行Android程序開發(fā)的方法

本章學(xué)習(xí)目標(biāo):掌握Android應(yīng)用程序的基本設(shè)計(jì)方法和思路12.1需求分析

設(shè)計(jì)本章的初衷通過前面章節(jié)的學(xué)習(xí),讀者應(yīng)該已經(jīng)掌握了一些Android應(yīng)用程序的開發(fā)知識(shí)和方法,但如何能夠綜合的運(yùn)用這些知識(shí)和方法,解決實(shí)際開發(fā)中所遇到的問題,還是一個(gè)需要繼續(xù)學(xué)習(xí)和探討的問題。設(shè)計(jì)本章的初衷就是希望讀者能夠根據(jù)實(shí)際項(xiàng)目的需求,準(zhǔn)確的分析出Android應(yīng)用程序開發(fā)所可能涉及到的知識(shí)點(diǎn),通過分析軟件的需求,快速設(shè)計(jì)出用戶界面和模塊結(jié)構(gòu),并最終完成應(yīng)用程序的開發(fā)和調(diào)試。

12.1需求分析

設(shè)計(jì)本章的初衷12.1需求分析功能需求本章提供的“天氣預(yù)報(bào)軟件”是一個(gè)略微復(fù)雜的示例。在這個(gè)綜合示例中,有一個(gè)顯示天氣情況的用戶界面,可以通過圖片和文字顯示當(dāng)前和未來幾天的天氣狀況,包括溫度、濕度、風(fēng)向和雨雪情況等。這些天氣數(shù)據(jù)是通過后臺(tái)服務(wù)獲取的,這個(gè)后臺(tái)服務(wù)按照一定時(shí)間間隔,從Google上獲取天氣預(yù)報(bào)信息,并將天氣信息保存在后臺(tái)服務(wù)中。示例還需要提供基于SMS短信的天氣數(shù)據(jù)服務(wù),其他手機(jī)用戶可以向本示例所在的手機(jī)上發(fā)送SMS短信,在短信中包含特定的關(guān)鍵字,則可以將已有的天氣情況通過SMS短信回復(fù)給用戶。最后,每個(gè)被發(fā)送的SMS短信都會(huì)被記錄下來,用戶可以瀏覽或刪除這些記錄信息。12.1需求分析功能需求12.1需求分析界面需求從上面的描述中可以基本了解軟件的功能需求,但為了將需求分析過程變得簡(jiǎn)單明了,首先找出用戶界面上需要顯示的內(nèi)容。功能描述中有“顯示天氣情況的用戶界面”和“用戶可以瀏覽或刪除這些記錄信息”,除此以外,一般應(yīng)用軟件還應(yīng)有顯示配置信息的界面。因此,本示例應(yīng)該包含三個(gè)用戶界面:

顯示天氣預(yù)報(bào)的用戶界面顯示已發(fā)送SMS短信的用戶界面瀏覽和設(shè)置配置信息的用戶界面

12.1需求分析界面需求12.1需求分析內(nèi)部功能從用戶界面出發(fā),分析隱藏在界面后面的內(nèi)部功能,這些功能則是程序正常運(yùn)行的基礎(chǔ)顯示天氣預(yù)報(bào)的用戶界面獲取Google的天氣數(shù)據(jù)保存天氣數(shù)據(jù)信息顯示SMS短信的用戶界面根據(jù)關(guān)鍵字監(jiān)視SMS短信發(fā)送包含天氣信息的SMS短信將發(fā)送SMS短信的相關(guān)信息寫入數(shù)據(jù)庫(kù)瀏覽和設(shè)置配置信息的用戶界面將用戶設(shè)置的配置信息保存到數(shù)據(jù)庫(kù)啟動(dòng)時(shí)讀取數(shù)據(jù)庫(kù)中的配置信息支持恢復(fù)缺省設(shè)置12.1需求分析內(nèi)部功能12.2程序設(shè)計(jì)12.2.1用戶界面設(shè)計(jì)根據(jù)需求中的用戶界面分析,應(yīng)用程序應(yīng)包含三個(gè)主要的用戶界面,每個(gè)用戶界面的顯示內(nèi)容在“顯示天氣預(yù)報(bào)的用戶界面”中,顯示目標(biāo)城市的當(dāng)前的天氣狀況,包括城市名稱、溫度、濕度、風(fēng)向、雨雪情況和獲取數(shù)據(jù)時(shí)間等信息。在界面的下方顯示未來四天的天氣狀況,但僅包括溫度和雨雪情況在“顯示已發(fā)送SMS短信的用戶界面”中,顯示每個(gè)回復(fù)短信的時(shí)間、目標(biāo)手機(jī)號(hào)碼、城市名稱、當(dāng)天的天氣狀況和未來一天的天氣狀況在“瀏覽和設(shè)置配置信息的用戶界面”中,顯示希望獲取天氣預(yù)報(bào)的城市名稱、獲取數(shù)據(jù)的頻率和短信監(jiān)視的關(guān)鍵字,并允許用戶設(shè)置是否提供短信服務(wù),以及是否記錄回復(fù)短信信息12.2程序設(shè)計(jì)12.2.1用戶界面設(shè)計(jì)12.2程序設(shè)計(jì)12.2.1用戶界面設(shè)計(jì)用戶界面的草圖12.2程序設(shè)計(jì)12.2.1用戶界面設(shè)計(jì)12.2程序設(shè)計(jì)12.2.2數(shù)據(jù)庫(kù)設(shè)計(jì)本示例主要有兩種數(shù)據(jù)需要存儲(chǔ)配置信息:因?yàn)榕渲眯畔⒌臄?shù)據(jù)量很小,從Android支持的存儲(chǔ)方式上分析,可以保存在SharedPreference、文件或SQLite數(shù)據(jù)庫(kù)中SMS短信服務(wù)信息:SMS短信服務(wù)信息是一個(gè)隨著時(shí)間推移而不斷增加的數(shù)據(jù),屬于文本信息,而且有固定的格式,因此適合使用SQLite數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)綜合分析這兩個(gè)需要存儲(chǔ)的數(shù)據(jù),選擇SQLite數(shù)據(jù)庫(kù)作為存儲(chǔ)數(shù)據(jù)的方法12.2程序設(shè)計(jì)12.2.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2程序設(shè)計(jì)12.2.2數(shù)據(jù)庫(kù)設(shè)計(jì)配置信息配置信息中主要保存目標(biāo)城市的名稱,訪問Google更新天氣信息的頻率,請(qǐng)求天氣信息服務(wù)短信的關(guān)鍵字,以及是否提供短信服務(wù)和是否記錄短信服務(wù)內(nèi)容配置信息的數(shù)據(jù)庫(kù)表結(jié)構(gòu)12.2程序設(shè)計(jì)12.2.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2程序設(shè)計(jì)12.2.2數(shù)據(jù)庫(kù)設(shè)計(jì)SMS短信服務(wù)信息SMS短信服務(wù)信息主要保存請(qǐng)求天氣服務(wù)短信的發(fā)送者、短信內(nèi)容、接收時(shí)間和回復(fù)信息的內(nèi)容SMS短信服務(wù)信息的數(shù)據(jù)庫(kù)表結(jié)構(gòu)12.2程序設(shè)計(jì)12.2.2數(shù)據(jù)庫(kù)設(shè)計(jì)12.2程序設(shè)計(jì)12.2.3程序模塊設(shè)計(jì)從功能需求上分析,可以將整個(gè)應(yīng)用程序劃分為4個(gè)模塊,分別是用戶界面、后臺(tái)服務(wù)、數(shù)據(jù)庫(kù)適配器和短信監(jiān)聽器。下圖是模塊結(jié)構(gòu)圖12.2程序設(shè)計(jì)12.2.3程序模塊設(shè)計(jì)12.2程序設(shè)計(jì)12.2.3程序模塊設(shè)計(jì)從模塊結(jié)構(gòu)圖中不難看出,后臺(tái)服務(wù)是整個(gè)應(yīng)用程序的核心,主要包含數(shù)據(jù)獲取子模塊和短信服務(wù)子模塊。數(shù)據(jù)獲取子模塊負(fù)責(zé)周期性的從Google獲取天氣信息;短信服務(wù)子模塊則負(fù)責(zé)處理接收到的服務(wù)請(qǐng)求短信,并發(fā)送包含天氣信息的短信后臺(tái)服務(wù)由用戶界面通過Intent啟動(dòng),啟動(dòng)后的后臺(tái)服務(wù)可以在用戶界面關(guān)閉后仍然保持運(yùn)行狀態(tài),直到用戶通過用戶界面發(fā)送Intent停止服務(wù),或系統(tǒng)因資源不足而強(qiáng)行關(guān)閉服務(wù)12.2程序設(shè)計(jì)12.2.3程序模塊設(shè)計(jì)12.2程序設(shè)計(jì)12.2.3程序模塊設(shè)計(jì)用戶界面從后臺(tái)服務(wù)獲取天氣信息,而沒有直接通過網(wǎng)絡(luò)訪問Google的天氣數(shù)據(jù)一方面是因?yàn)楹笈_(tái)服務(wù)使用了工作線程,通過后臺(tái)服務(wù)獲取天氣數(shù)據(jù)可以避免因網(wǎng)絡(luò)通信不暢造成界面失去響應(yīng)另一方面,在用戶關(guān)閉界面后,后臺(tái)服務(wù)仍然需要更新天氣信息,以保證短信服務(wù)數(shù)據(jù)的準(zhǔn)確性。用戶界面通過直接調(diào)用數(shù)據(jù)庫(kù)適配器,向SQLite數(shù)據(jù)庫(kù)中讀寫配置信息,或?qū)MS短信服務(wù)信息進(jìn)行操作

12.2程序設(shè)計(jì)12.2.3程序模塊設(shè)計(jì)12.2程序設(shè)計(jì)12.2.3程序模塊設(shè)計(jì)短信監(jiān)聽器是一個(gè)BroadcastReceiver,監(jiān)視所有接收到的短信

如果短信中包含用戶自定義的關(guān)鍵字,短信監(jiān)聽器則會(huì)認(rèn)為這條短信是天氣服務(wù)請(qǐng)求短信,將短信的相關(guān)信息寫入后臺(tái)服務(wù)的短信服務(wù)隊(duì)列如果用戶在配置信息中選擇無需提供短信服務(wù),短信監(jiān)聽器仍然繼續(xù)監(jiān)聽所有短信,只是后臺(tái)服務(wù)不再允許將服務(wù)請(qǐng)求短信寫入服務(wù)隊(duì)列數(shù)據(jù)庫(kù)適配器封裝了所有對(duì)SQLite數(shù)據(jù)庫(kù)操作的方法,用戶界面和后臺(tái)服務(wù)會(huì)調(diào)用它實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作

12.2程序設(shè)計(jì)12.2.3程序模塊設(shè)計(jì)12.3程序開發(fā)

12.3.1工程結(jié)構(gòu)在程序開發(fā)階段,首先確定“天氣預(yù)報(bào)軟件”的工程名稱為WeatherDemo,包名稱為edu.hrbeu.WeatherDemo。然后根據(jù)程序模塊設(shè)計(jì)的內(nèi)容,建立WeatherDemo示例12.3程序開發(fā)

12.3.1工程結(jié)構(gòu)12.3程序開發(fā)12.3.1工程結(jié)構(gòu)WeatherDemo示例源代碼的文件結(jié)構(gòu)12.3程序開發(fā)12.3.1工程結(jié)構(gòu)12.3程序開發(fā)12.3.1工程結(jié)構(gòu)為了使源代碼文件的結(jié)構(gòu)更加清晰,WeatherDemo示例設(shè)置了多個(gè)命名空間中,分別用來保存用戶界面、數(shù)據(jù)庫(kù)、后臺(tái)服務(wù)、SMS短信和天氣數(shù)據(jù)的源代碼文件

WeatherDemo示例的命名空間12.3程序開發(fā)12.3.1工程結(jié)構(gòu)12.3程序開發(fā)12.3.1工程結(jié)構(gòu)WeatherDemo示例將不同用途的源代碼文件放置在不同的命名空間中

WeatherDemo示例的文件用途說明12.3程序開發(fā)12.3.1工程結(jié)構(gòu)12.3程序開發(fā)12.3.1工程結(jié)構(gòu)Android資源文件保存在/res的子目錄中

/res/drawable目錄中保存的是圖像文件/res/layout目錄中保存的是布局文件/res/values目錄中保存的是用來定義字符串和顏色的文件/res/xml目錄保存的是XML格式的數(shù)據(jù)文件所有在程序開發(fā)階段可以被調(diào)用的資源都保存在這些目錄中

12.3程序開發(fā)12.3.1工程結(jié)構(gòu)12.3程序開發(fā)12.3.1工程結(jié)構(gòu)資源文件名稱與用途12.3程序開發(fā)12.3.1工程結(jié)構(gòu)12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器數(shù)據(jù)庫(kù)適配器是最底層的模塊,主要用于封裝用戶界面和后臺(tái)服務(wù)對(duì)SQLite數(shù)據(jù)庫(kù)的操作。數(shù)據(jù)庫(kù)適配器的核心代碼主要在DBAdapter.java文件中

用戶保存配置信息的類文件Config.javaConfig.java文件的全部代碼如下12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器Config.java文件代碼12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器從代碼中不難看出,公有靜態(tài)屬性CityName、RefreshSpeed、ProvideSmsService、SaveSmsInfo和KeyWord,完全對(duì)應(yīng)數(shù)據(jù)庫(kù)中保存配置信息表的屬性(參照表12.1)。在程序啟動(dòng)后,保存在數(shù)據(jù)庫(kù)中的城市名稱、更新頻率、是否提供短信服務(wù)、是否保存短信信息和關(guān)鍵字等內(nèi)容,將被讀取到這個(gè)Config類中,供其它模塊做邏輯判斷時(shí)使用代碼第10行的LoadDefaultConfig()函數(shù),保存了程序內(nèi)置的配置參數(shù)

12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器此函數(shù)會(huì)在兩個(gè)情況下被調(diào)用用戶主動(dòng)選擇“恢復(fù)缺省設(shè)置”首次啟動(dòng)程序時(shí),用來初始化保存配置參數(shù)的數(shù)據(jù)庫(kù)DBAdapter類與以往介紹過的數(shù)據(jù)庫(kù)適配器類相似,都具有繼承SQLiteOpenHelper的幫助類DBOpenHelperDBOpenHelper在建立數(shù)據(jù)庫(kù)時(shí),同時(shí)建立兩個(gè)數(shù)據(jù)庫(kù)表,并對(duì)保存配置信息的表進(jìn)行了初始化,初始化的相關(guān)代碼在第42~49行

12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器數(shù)據(jù)庫(kù)表代碼12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器數(shù)據(jù)庫(kù)表代碼12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器數(shù)據(jù)庫(kù)表代碼12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器數(shù)據(jù)庫(kù)表代碼12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器在DBAdapter類中,用戶界面會(huì)調(diào)用SaveConfig()和LoadConfig(),從SQLite數(shù)據(jù)庫(kù)中保存和讀取配置信息。保存配置信息時(shí),SaveConfig()函數(shù)會(huì)將Config類中的公有靜態(tài)屬性寫入數(shù)據(jù)庫(kù);反之,LoadConfig()會(huì)將數(shù)據(jù)庫(kù)中的配置信息寫入Config類中的公有靜態(tài)屬性SaveConfig()和LoadConfig()函數(shù)的代碼如下12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器SaveConfig()和LoadConfig()函數(shù)代碼12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器SaveConfig()和LoadConfig()函數(shù)代碼12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器另一個(gè)會(huì)調(diào)用DBAdapter類的是后臺(tái)服務(wù),即WeatherService類后臺(tái)服務(wù)主要調(diào)用SaveOneSms(SimpleSmssms)、DeleteAllSms()和GetAllSms()函數(shù),分別用來保存SMS短信記錄、刪除所有SMS數(shù)據(jù)記錄和獲取所有SMS數(shù)據(jù)記錄在GetAllSms()函數(shù)中,調(diào)用了一個(gè)私有函數(shù)ToSimpleSms(Cursorcursor),用來將從數(shù)據(jù)庫(kù)獲取的數(shù)據(jù)轉(zhuǎn)換為SimpleSms實(shí)例數(shù)組SimpleSms類將在下一小節(jié)進(jìn)行介紹12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器下面先給出SaveOneSms(SimpleSmssms)、DeleteAllSms()和GetAllSms()函數(shù)的代碼12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器SaveOneSms(SimpleSmssms)、DeleteAllSms()和GetAllSms()函數(shù)代碼12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器SaveOneSms(SimpleSmssms)、DeleteAllSms()和GetAllSms()函數(shù)代碼12.3程序開發(fā)12.3.2數(shù)據(jù)庫(kù)適配器12.3程序開發(fā)12.3.3短信監(jiān)聽器短信監(jiān)聽器本質(zhì)上是BroadcastReceiver,用于監(jiān)聽Android系統(tǒng)所接收到的所有SMS短消息,可以在應(yīng)用程序關(guān)閉后仍然繼續(xù)運(yùn)行,核心代碼在SmsReceiver.java文件中在介紹SmsReceiver類前,先說明用來保存SMS短信內(nèi)容和相關(guān)信息的SimpleSms類。android.telephony.SmsMessage是Android提供的短信類,但這里需要一個(gè)更精簡(jiǎn)、小巧的類,保存少量的信息,因此構(gòu)造了SimpleSms類,僅用來保存短信的發(fā)送者、內(nèi)容、接收時(shí)間和返回結(jié)果。這里的“返回結(jié)果”指的是返回包含天氣信息的短信內(nèi)容

12.3程序開發(fā)12.3.3短信監(jiān)聽器12.3程序開發(fā)12.3.3短信監(jiān)聽器SimpleSms.java文件完整代碼12.3程序開發(fā)12.3.3短信監(jiān)聽器12.3程序開發(fā)12.3.3短信監(jiān)聽器SimpleSms.java文件完整代碼12.3程序開發(fā)12.3.3短信監(jiān)聽器12.3程序開發(fā)12.3.3短信監(jiān)聽器SmsReceiver類繼承BroadcastReceiver,重載了onReceive()函數(shù)系統(tǒng)消息的識(shí)別和關(guān)鍵字的識(shí)別并不復(fù)雜,只要接收vider.Telephony.SMS_RECEIVED類型的系統(tǒng)消息,則表明是Android系統(tǒng)接收到了短信。將短信的內(nèi)容拆分后,判斷消息內(nèi)容是否包含用戶定義的關(guān)鍵字,則可判斷該短信是否為天氣服務(wù)請(qǐng)求短信

12.3程序開發(fā)12.3.3短信監(jiān)聽器12.3程序開發(fā)12.3.3短信監(jiān)聽器SmsReceiver.java文件的核心代碼12.3程序開發(fā)12.3.3短信監(jiān)聽器12.3程序開發(fā)12.3.3短信監(jiān)聽器SmsReceiver.java文件代碼12.3程序開發(fā)12.3.3短信監(jiān)聽器12.3程序開發(fā)12.3.3短信監(jiān)聽器代碼第9行將帶有pdus字符串特征的對(duì)象,通過bundle.get()函數(shù)提取出來在代碼第12行使用SmsMessage.CreateFromPdu()函數(shù)構(gòu)造SmsMessage實(shí)例在代碼第12行使用循環(huán)語句是因?yàn)榻邮盏降亩绦趴赡懿恢挂粭l從第14行和第15行代碼上看,這里只處理第1條短信第17行構(gòu)造SimpleSms實(shí)例在代碼第18行調(diào)用WeatherService類的RequerSMSService()函數(shù),將SimpleSms實(shí)例添加到短信隊(duì)列中

12.3程序開發(fā)12.3.3短信監(jiān)聽器12.3程序開發(fā)12.3.3短信監(jiān)聽器最后,在AndroidManifest.xml文件中注冊(cè)短信監(jiān)聽器SmsReceiver,并聲明可接收短信的用戶許可android.permission.RECEIVE_SMS

如果注冊(cè)的組件不在根命名空間中,則需要將子命名空間寫在類的前面

12.3程序開發(fā)12.3.3短信監(jiān)聽器12.3程序開發(fā)12.3.3短信監(jiān)聽器例如下面在代碼第1行中,因?yàn)镾msReceiver.java文件在edu.hrbeu.WeatherDemo.Service命名空間下,而不在根命名空間edu.hrbeu.WeatherDemo下,因此注冊(cè)組件時(shí)需要在類名SmsReceiver前添加.Service12.3程序開發(fā)12.3.3短信監(jiān)聽器12.3程序開發(fā)12.3.4后臺(tái)服務(wù)后臺(tái)服務(wù)是WeatherDemo示例的核心模塊,在用戶啟動(dòng)后持續(xù)在后臺(tái)運(yùn)行,直到用戶手動(dòng)停止服務(wù)

后臺(tái)服務(wù)功能發(fā)送包含天氣信息的SMS短信(短信發(fā)送子模塊)周期性的獲取Google的天氣數(shù)據(jù)(數(shù)據(jù)獲取子模塊)

12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)短信發(fā)送子模塊:后臺(tái)服務(wù)在單獨(dú)的線程上運(yùn)行首先調(diào)用ProcessSmsList()函數(shù),檢查短信隊(duì)列中是否有需要回復(fù)的短信然后調(diào)用GetGoogleWeatherData()函數(shù)獲取天氣數(shù)據(jù)最后線程暫停1秒,以釋放CPU資源WeatherDemo示例后臺(tái)服務(wù)的核心代碼在WeatherService.java文件中

12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)下面是線程調(diào)用函數(shù)的部分代碼12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)ProcessSmsList()函數(shù)用來檢查短信列表smsList,并根據(jù)Weather類中保存的天氣數(shù)據(jù),向請(qǐng)求者的發(fā)送回復(fù)短信WeatherService.java文件的ProcessSmsList()函數(shù)代碼如下12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)WeatherService.java文件的ProcessSmsList()函數(shù)代碼12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)發(fā)送短信是使用SmsManager對(duì)象的sendTextMessage()方法,該方法一共需要5個(gè)參數(shù)第1個(gè)參數(shù)是收件人地址第2個(gè)參數(shù)是發(fā)件人地址第3個(gè)參數(shù)是短信正文第4個(gè)參數(shù)是發(fā)送服務(wù)第5個(gè)參數(shù)是送達(dá)服務(wù)sendTextMessage()方法的收件人地址和短信正文是不可為空的參數(shù),而且一般GSM規(guī)范要求短信內(nèi)容要控制在70個(gè)漢字以內(nèi)代碼第8行的Weather.GetSmsMsg(),用來獲得供回復(fù)短信使用的天氣信息,因?yàn)榭紤]到短信的字?jǐn)?shù)限制,僅返回當(dāng)天和未來一天的天氣狀況12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)Weather.java文件的代碼如下12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)Weather.java文件代碼12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)Forecast.java文件的代碼如下12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)天氣數(shù)據(jù)是從Google提供的WebService中獲取的,調(diào)試WeatherDemo示例時(shí)需要網(wǎng)絡(luò)環(huán)境,數(shù)據(jù)的獲取地址是

/ig/api?hl=en&weather=New%20YorkNew%20York表示獲取紐約(NewYork)的天氣數(shù)據(jù)%20表示一個(gè)空格讀者可以將上面提供的地址輸入到Web瀏覽器,在瀏覽器中直接看到XML格式的天氣數(shù)據(jù)在資源目錄中的/res/xml/api.xml文件,就是2009年9月22日獲取的紐約天氣數(shù)據(jù)在程序資源中保留api.xml文件,主要是用來幫助讀者分析XML數(shù)據(jù)格式,在程序運(yùn)行期間并不訪問該文件12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)api.xml文件的內(nèi)容如下12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)api.xml文件代碼12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)api.xml文件代碼12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)api.xml文件代碼12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)<forecast_information>標(biāo)簽內(nèi)的數(shù)據(jù)是天氣預(yù)報(bào)的城市和時(shí)間等基本信息,<current_conditions>標(biāo)簽內(nèi)的是當(dāng)時(shí)的天氣狀況,4個(gè)<forecast_conditions>標(biāo)簽是未來四天的天氣情況在api.xml文件中,還提供了能夠反映天氣情況的圖標(biāo)地址,例如第19行、第27行和第35行等WeatherAdapter類實(shí)現(xiàn)了利用URL獲取位圖的私有函數(shù)GetURLBitmap(),以及用來下載和解析XML數(shù)據(jù)的公有函數(shù)GetWeatherData()后臺(tái)服務(wù)在調(diào)用GetWeatherData()函數(shù)解析Google提供的天氣數(shù)據(jù)時(shí),會(huì)不斷調(diào)用GetURLBitmap()函數(shù),將XML數(shù)據(jù)中的天氣圖標(biāo)根據(jù)圖標(biāo)地址下載到本地保存

12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)GetURLBitmap()函數(shù)的代碼如下12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)GetURLBitmap()函數(shù)代碼12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)GetWeatherData()函數(shù)首先根據(jù)指定的URL地址,從網(wǎng)絡(luò)獲取字節(jié)流數(shù)據(jù),然后調(diào)用輕量級(jí)XML解析器XmlPullParser對(duì)天氣數(shù)據(jù)進(jìn)行解析,并將解析結(jié)果保存在Weather類的公有靜態(tài)屬性中

GetWeatherData()函數(shù)的代碼如下12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)GetWeatherData()函數(shù)的代碼如下12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)GetWeatherData()函數(shù)的代碼如下12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)GetWeatherData()函數(shù)的代碼如下12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)GetWeatherData()函數(shù)的代碼如下12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)GetWeatherData()函數(shù)的代碼如下12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)GetWeatherData()函數(shù)的代碼如下12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.4后臺(tái)服務(wù)最后,在AndroidManifest.xml文件中注冊(cè)WeatherService,并聲明連接互聯(lián)網(wǎng)和發(fā)送SMS短信的兩個(gè)用戶許可12.3程序開發(fā)12.3.4后臺(tái)服務(wù)12.3程序開發(fā)12.3.5用戶界面在用戶界面設(shè)計(jì)上,采用可多分頁(yè)快速切換的TabHost控件WeatherDemo示例TabHost控件的每個(gè)標(biāo)簽頁(yè)與一個(gè)Activity相關(guān)聯(lián),這樣就可以將不同標(biāo)簽頁(yè)的代碼放在不同的文件中,而且每個(gè)標(biāo)簽頁(yè)都可以有獨(dú)立的選項(xiàng)菜單12.3程序開發(fā)12.3.5用戶界面12.3程序開發(fā)12.3.5用戶界面WeatherDemo類是繼承TabActivity的Tab標(biāo)簽頁(yè),共設(shè)置3個(gè)標(biāo)簽頁(yè)

TAB1的標(biāo)題為“天氣預(yù)報(bào)”,關(guān)聯(lián)的Activity為WeatherActivityTAB2的標(biāo)題為“歷史數(shù)據(jù)”,關(guān)聯(lián)Activity為HistoryActivityTAB2的標(biāo)題為“系統(tǒng)設(shè)置”,關(guān)聯(lián)Activity為SetupActivity12.3程序開發(fā)12.3.5用戶界面12.3程序開發(fā)12.3.5用戶界面WeatherDemo.java文件的完整代碼如下12.3程序開發(fā)12.3.5用戶界面12.3程序開發(fā)12.3.5用戶界面WeatherDemo.java文件代碼12.3程序開發(fā)12.3.5用戶界面12.3程序開發(fā)12.3.5用戶界面WeatherDemo.java中的代碼只是用戶界面的框架,設(shè)置了Tab標(biāo)簽頁(yè)的圖標(biāo)、標(biāo)題和所關(guān)聯(lián)的Activity,標(biāo)簽頁(yè)中的具體顯示內(nèi)容還要依賴于每個(gè)Activity所設(shè)置的界面布局界面布局包含WeatherActivityHistoryActivitySetupActivity12.3程序開發(fā)12.3.5用戶界面12.3程序開發(fā)12.3.5用戶界面WeatherActivity用戶界面12.3程序開發(fā)12.3.5用戶界面12.3程序開發(fā)12.3.5用戶界面WeatherActivity在啟動(dòng)時(shí)并不能直接顯示最新的天氣信息,用戶需要通過選項(xiàng)菜單的“啟動(dòng)服務(wù)”開啟后臺(tái)服務(wù),然后點(diǎn)擊“刷新”獲取最新的天氣狀況選項(xiàng)菜單還提供“停止服務(wù)”和“退出”選項(xiàng)WeatherActivity使用的布局文件是tab_weather.xml,這是個(gè)較為繁瑣的界面布局,多次使用了垂直和水平的線性布局WeatherActivity的界面布局和代碼并不難以理解,因此這里不再給出WeatherActivity.java和tab_weather.xml具體代碼

12.3程序開發(fā)12.3.5用戶界面12.3程序開發(fā)12.3.5用戶界面HistoryActivity主要用來顯示SQLite數(shù)據(jù)庫(kù)中的短信服務(wù)信息,顯示的內(nèi)容包括發(fā)送者的手機(jī)號(hào)碼、時(shí)間和回復(fù)短信內(nèi)容為了能夠以列表的形式顯示多行數(shù)據(jù),并且定制每行數(shù)據(jù)的顯示布局,這里使用了以往章節(jié)沒有介紹過的ListActivity(Android.app.ListActivity)右圖為HistoryActivity用戶界面圖

12.3程序開發(fā)12.3.5用戶界面12.3程序開發(fā)12.3.5用戶界面ListActivity可以不通過setContentView()設(shè)置布局,也不必重載onCreate()函數(shù),而直接將顯示列表加載到ListActivity,增加了使用的便利性在WeatherDemo示例中,仍然使用setContentView()設(shè)置布局,這樣做的好處是可以在界面中設(shè)置更為復(fù)雜的顯示元素,例如在列表上方增加了提示信息“SQLite數(shù)據(jù)庫(kù)中的短信服務(wù)信息”下方的代碼是HistoryActivity.java文件的onCreate()函數(shù)中的設(shè)置布局和加載適配器的關(guān)鍵代碼12.3程序開發(fā)12.3.5用戶界面12.3程序開發(fā)12.3.5用戶界面tab_history.xml是HistoryActivity的布局文件,下面先分析一下tab_history.xml的內(nèi)容tab_history.xml文件的完整代碼如下

12.3程序開發(fā)12.3.5用戶界面12.3程序開發(fā)12.3.5用戶界面tab_history.xml文件代碼12.3程序開發(fā)12.3.5用戶界面12.3程序開發(fā)12.3.5用戶界面ListView使用的是自定義布局,布局保存在data_row.xml文件中,data_row.xml的完整代碼如下12.3程序開發(fā)12.3.5用戶界面12.3程序開發(fā)12.3.5用戶界面data_row.xml文件代碼12.3程序開發(fā)12.3.5用戶界面12.3程序開發(fā)12.3.5用戶界面Android提供的數(shù)據(jù)適配器僅允許保存字符串?dāng)?shù)組或列表對(duì)象,如果希望使用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論