基于android平臺(tái)的飛機(jī)游戲設(shè)計(jì)_第1頁
基于android平臺(tái)的飛機(jī)游戲設(shè)計(jì)_第2頁
基于android平臺(tái)的飛機(jī)游戲設(shè)計(jì)_第3頁
基于android平臺(tái)的飛機(jī)游戲設(shè)計(jì)_第4頁
基于android平臺(tái)的飛機(jī)游戲設(shè)計(jì)_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

緒論Android系統(tǒng)最初由安迪·魯賓(AndyRubin)制作,最初主要支持手機(jī)。2005年8月17日被Google收購。2007年11月5日,Google與84家硬件制造商、軟件開發(fā)商及電信營運(yùn)商組成開放手持設(shè)備聯(lián)盟(OpenHandsetAlliance)來共同研發(fā)改良Android系統(tǒng)并生產(chǎn)搭載Android的智慧型手機(jī),并逐漸拓展到平板電腦及其他領(lǐng)域上。隨后,Google以Apache免費(fèi)開源許可證的授權(quán)方式,發(fā)布了Android的源代碼。同時(shí),一個(gè)負(fù)責(zé)進(jìn)一步發(fā)展和維護(hù)Android操作系統(tǒng)的Android開源項(xiàng)目也被建立(AOSP)。Android的內(nèi)核基于Linux,除了內(nèi)核之外,則是中介層、數(shù)據(jù)庫元和用C/C++編寫的API以及應(yīng)用程序框架。Android的應(yīng)用程序通常以Java數(shù)據(jù)庫元為基礎(chǔ)編寫,運(yùn)行程序時(shí),應(yīng)用程序的代碼會(huì)被即時(shí)轉(zhuǎn)變?yōu)镈alvikdex-code(DalvikExecutable),然后Android操作系統(tǒng)通過使用即時(shí)編譯的Dalvik虛擬機(jī)來將其運(yùn)行。除了開放手持設(shè)備聯(lián)盟之外,Android還擁有許多由全球各地開發(fā)者組成的開源社區(qū)來專門負(fù)責(zé)開發(fā)Android應(yīng)用程序和第三方Android操作系統(tǒng)來延長和擴(kuò)展Android的功能和性能。截止至2011年10月,AndroidMarket(現(xiàn)為GooglePlay)上擁有超過30萬個(gè)認(rèn)證的應(yīng)用程序,AndroidMarket的應(yīng)用程序下載量也在2011年12月達(dá)到100億次。由于Android是開放的,因此它還可以通過第三方網(wǎng)站來下載安裝GooglePlayStore上所沒有的應(yīng)用程序。2010年末數(shù)據(jù)顯示,僅正式推出兩年的Android操作系統(tǒng)在市場占有率上已經(jīng)超越稱霸十年的諾基亞Symbian系統(tǒng)。2011年8月,Android操作系統(tǒng)在全球智能手機(jī)操作系統(tǒng)的市場份額已達(dá)48%,成為全球第一大智能手機(jī)操作系統(tǒng)。東華理工大學(xué)長江學(xué)院畢業(yè)設(shè)計(jì)Android開發(fā)環(huán)境1.Android系統(tǒng)簡介命名由來Android一詞最早出現(xiàn)于法國作家利爾亞當(dāng)(AugusteVilliersdel'Isle-Adam)在1886年發(fā)表的科幻小說《未來夏娃》(L'èvefuture)中。他將外表像人的機(jī)器人取作Android。Logo來源Android的Logo是由Ascender公司設(shè)計(jì)的。其中的文本使用了Ascender公司專門制作的稱之為“GoogleDroid字型”的字型。Android是一個(gè)全身綠色的機(jī)器人,綠色也是Android的標(biāo)志。顏色采用了PMS376C和RGB中十六進(jìn)制的#A4C639來繪制,這是Android操作系統(tǒng)的品牌象征。有時(shí)候,它們還會(huì)使用純文本的Logo。Linux內(nèi)核Android操作系統(tǒng)的內(nèi)核屬于Linux內(nèi)核的一個(gè)分支,具有典型的Linux周期和功能,除此之外,Google為了能讓Linux在移動(dòng)設(shè)備上良好的運(yùn)行,對(duì)其進(jìn)行了修改和擴(kuò)充。Android去除了Linux中的本地XWindowSystem,也不支持標(biāo)準(zhǔn)的GNU庫,這使得Linux平臺(tái)上的應(yīng)用程序移植到Android平臺(tái)上變得困難。2008年,PatrickBrady于GoogleI/O演講“Anatomy&PhysiologyofanAndroid”,并提出的AndroidHAL架構(gòu)圖。HAL以*.so檔的形式存在,可以把Androidframework與Linuxkernel隔開,這種中介層的方式使得Android能在移動(dòng)設(shè)備上獲得更高的執(zhí)行效率。這種獨(dú)特的系統(tǒng)結(jié)構(gòu)被Linux內(nèi)核開發(fā)者GregKroah-Hartman和其他內(nèi)核維護(hù)者稱贊。Google還在Android的內(nèi)核中加入了自己開發(fā)制作的一個(gè)名為“wakelocks”的移動(dòng)設(shè)備電源管理功能,該功能用于管理移動(dòng)設(shè)備的電池性能,但是該功能并沒有被加入到Linux內(nèi)核的主線開放和維護(hù)中,因?yàn)長inux內(nèi)核維護(hù)者認(rèn)為Google沒有向他們展示這個(gè)功能的意圖和代碼。2010年2月3日,由于Google在Android內(nèi)核開發(fā)方面和Linux社區(qū)方面開發(fā)的不同步,Linux內(nèi)核開發(fā)者GregKroah-Hartman將Android的驅(qū)動(dòng)程序從Linux內(nèi)核“狀態(tài)樹”(“stagingtree”)上除去。2010年4月,Google宣布將派遣2名開發(fā)人員加入Linux內(nèi)核社區(qū),以便重返Linux內(nèi)核。2010年9月,Linux內(nèi)核開發(fā)者RafaelJ.Wysocki添加了一個(gè)修復(fù)程序,使得Android的“wakelocks”可以輕松地與主線Linux內(nèi)核合并。2011年,LinusTorvalds說:“Android的內(nèi)核和Linux的內(nèi)核將最終回歸到一起,但可能不會(huì)是4-5年?!碧攸c(diǎn)顯示布局Android操作系統(tǒng)支持更大的分辨率,VGA,2D顯示,3D顯示都給予OpenGLES2.0標(biāo)準(zhǔn)規(guī)格,并且支持傳統(tǒng)的智能手機(jī)。數(shù)據(jù)存儲(chǔ)Android操作系統(tǒng)內(nèi)置SQLite小型關(guān)聯(lián)式資料庫管理系統(tǒng)來負(fù)責(zé)存儲(chǔ)數(shù)據(jù)。網(wǎng)絡(luò)Android操作系統(tǒng)支持所有的網(wǎng)絡(luò)制式,包括GSM/EDGE、IDEN、CDMA、EV-DO、UMTS、Bluetooth、Wi-Fi、LTE、NFC和WiMAX。信息作為原設(shè)計(jì)給手機(jī)使用的操作系統(tǒng),Android操作系統(tǒng)原生支持短信和郵件,并且支持所有的云端信息和服務(wù)器信息。語言Android操作系統(tǒng)支持多語言。瀏覽器Android操作系統(tǒng)中內(nèi)置的網(wǎng)頁瀏覽器基于WebKit內(nèi)核,并且采用了ChromeV8引擎。在Android4.0內(nèi)置的瀏覽器測試中,HTML5和Acid3故障處理中均獲得了滿分,并且于2.2版及之后能原生支持Flash。支持Java雖然Android操作系統(tǒng)中的應(yīng)用程序大部分都是由Java編寫的,但是Android卻是以轉(zhuǎn)換為Dalvikexecutables的文件在Dalvik虛擬機(jī)上運(yùn)行的。由于Android中并不自帶Java虛擬機(jī),因此無法直接運(yùn)行Java程序。不過Android平臺(tái)上提供了多個(gè)Java虛擬機(jī)供用戶下載使用,安裝了Java虛擬機(jī)的Android系統(tǒng)可以運(yùn)行J2ME的程序。媒體支持Android操作系統(tǒng)本身支持以下格式的音頻/視頻/圖片媒體:WebM、H.263,H.264(in3GPorMP4container)、MPEG-4SP、AMR,AMR-WB(in3GPcontainer)、AAC,HE-AAC(inMP4or3GPcontainer)、MP3、MIDI、OggVorbis、FLAC、WAV、JPEG、PNG、GIF、BMP。如果用戶需要播放更多格式的媒體,可以安裝其他第三方應(yīng)用程序。流媒體支持Android操作系統(tǒng)支持RTP/RTSP(3GPPPSS,ISMA)的流媒體以及(HTML5<video>)的流媒體,同時(shí)還支持Adobe的Flash,在安裝了RealPlayer之后,還支持蘋果公司的流媒體。硬件支持Android操作系統(tǒng)支持識(shí)別并且使用視頻/照片攝像頭,多點(diǎn)電容/電阻觸摸屏,GPS,加速計(jì),陀螺儀,氣壓計(jì),磁強(qiáng)計(jì),鍵盤,鼠標(biāo),USBDisk,專用的游戲控制器,體感控制器,游戲手柄,藍(lán)牙設(shè)備,無線設(shè)備,感應(yīng)和壓力傳感器,溫度計(jì),加速2D位位塊傳輸(硬件方向,縮放,像素格式轉(zhuǎn)換)和3D圖形加速。多點(diǎn)觸控Android支持原生的多點(diǎn)觸摸,在最初的HTCHero手機(jī)上即有這個(gè)功能。該功能是內(nèi)核級(jí)別(為了避免對(duì)蘋果公司的觸摸屏技術(shù)造成侵權(quán))。藍(lán)牙Android支持A2DP,AVRCP,發(fā)送文件(OPP),訪問電話簿(PBAP),語音撥號(hào)和發(fā)送手機(jī)之間的聯(lián)系。同時(shí)支持鍵盤,鼠標(biāo)和操縱桿(HID)。語音功能除了支持普通的電話通話之外,Android操作系統(tǒng)從最初的版本開始就支持使用語音操作來使用Google進(jìn)行網(wǎng)頁搜索等功能。而從AndroidOSv2.2開始,語音功能還可以用來輸入文本、語音導(dǎo)航等功能。無線共享功能Android操作系統(tǒng)支持用戶使用本機(jī)充當(dāng)“無線路由器”,并且將本機(jī)的網(wǎng)絡(luò)共享給其他手機(jī),其他機(jī)器只需要通過WiFi尋找到共享的無線熱點(diǎn),就可以上網(wǎng)。而在AndroidOSv2.2版本之前的操作系統(tǒng)則需要通過第三方應(yīng)用或者其他定制版系統(tǒng)來實(shí)現(xiàn)這個(gè)功能。截圖功能從AndroidOSv4.0版本開始,Android操作系統(tǒng)便支持截圖功能,該功能允許用戶直接抓取手機(jī)屏幕上的任何畫面,用戶還可以通過編輯功能對(duì)截圖進(jìn)行處理,還可以通過藍(lán)牙/E-mail/微博/共享等方式發(fā)送給其他用戶或者上傳到網(wǎng)絡(luò)上,也可以拷貝到電腦中。2.Android的相關(guān)技術(shù)介紹及分析2.1Android系統(tǒng)架構(gòu)研究Android是一個(gè)包含操作系統(tǒng)、中介架構(gòu)層及應(yīng)用程序所產(chǎn)生出來的軟件堆棧架構(gòu)。由下而上,其核心為嵌入式Linux2.6作業(yè)系統(tǒng),向上搭配Google為Android開發(fā)的類庫及Android運(yùn)行時(shí),再配合應(yīng)用程序架構(gòu),來開發(fā)各種不同的應(yīng)用程序。2.1.1Android的功能特征(l)應(yīng)用程序架構(gòu):在應(yīng)用程序架構(gòu)內(nèi)已經(jīng)具備多種不同的基礎(chǔ)組件,在開發(fā)應(yīng)用程序時(shí),就可以直接調(diào)用這些組件來使用,可以節(jié)省開發(fā)應(yīng)用程序的心力及時(shí)間。(2)Dalvik虛擬機(jī)器:在Android平臺(tái)上所使用Java虛擬機(jī),不是Sim公司的標(biāo)準(zhǔn)Java虛擬機(jī),而是使用Google自主開發(fā)的代號(hào)為Dalvik的虛擬機(jī),它在保證API方面的兼容的同時(shí),針對(duì)移動(dòng)手機(jī)進(jìn)行了大幅優(yōu)化,占用資源更小,運(yùn)行效率更高。(3)集成的瀏覽器:集成的瀏覽器是Android內(nèi)建的瀏覽器,是以WebKit的瀏覽引擎為基礎(chǔ)所開發(fā)成的。WedKit是一個(gè)開源瀏覽器網(wǎng)頁排版引擎,目前使用WebKit引擎的瀏覽器主要有:Safari,Midori,Epiphany等。配合Android手機(jī)的功能,可以在瀏覽網(wǎng)頁時(shí),達(dá)到更好的效果,例如:局部性的縮放網(wǎng)頁上的資訊、觸控式的操作等效果。(4)優(yōu)化的繪圖能力:在程序里可以用到的繪圖功能分為2D與3D兩個(gè)方面。在2D方面,Android提供了一套特有的類庫(SGL;而在3D方面則是使用OpenGLES1.0(openGLforEmbeddedsystems)規(guī)范的類庫。它們是一種非??斓膱D形引擎,并且支持硬件加速。(5)SQLite數(shù)據(jù)庫:SQLite提供結(jié)構(gòu)化的數(shù)據(jù)存取。SQLite是一款輕型的數(shù)據(jù)庫,它的設(shè)計(jì)目標(biāo)是嵌入式的,目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用的資源非常低。它能夠支持Windows/Linux/Unix等主流的操作系統(tǒng),同時(shí)能夠跟很多程序語言相結(jié)合,比如php,Java等,還有ODBC接口,同樣比起Mysql,PostgreSQL來講,它的處理速度比它們都快。它無需安裝和管理配置,它是一個(gè)儲(chǔ)存在單一磁盤文件中的完整數(shù)據(jù)庫,體積小只有250KB但支持?jǐn)?shù)據(jù)庫大小至2TB。它雖然很小巧,但是支持的SQL語句毫不遜色于其它開源數(shù)據(jù)庫。同時(shí)它還支持事務(wù)功能和并發(fā)處理等等。SQLite也是一套開放性的關(guān)聯(lián)式資料庫,其特點(diǎn)在于輕量性方面的設(shè)計(jì)結(jié)構(gòu),更適合在手機(jī)上使用。(6)多媒體的支持能力:主要用于播放媒體文件。這同時(shí)包括對(duì)音頻(如播放MP3或其他音樂文件等)和視頻(如播放從網(wǎng)上下載的視頻)的支持,并支持“播放URI地址”(Note:URI即是統(tǒng)一資源識(shí)別地址)模式—在網(wǎng)絡(luò)上直接播放的流媒體。另外支持各種通用的靜態(tài)圖像格式,例如:JPG、PNG、GIF等格式。(7)GSM技術(shù):GlobalSystemforMobileCommunications,即全球移動(dòng)通訊系統(tǒng),俗稱”全球通”,是一種起源于歐洲的移動(dòng)通信技術(shù)標(biāo)準(zhǔn),是第二代移動(dòng)通信技術(shù),其開發(fā)目的是讓全球各地可以共同使用一個(gè)移動(dòng)電話網(wǎng)絡(luò)標(biāo)準(zhǔn),讓用戶使用一部手機(jī)就能行遍全球。GSM技術(shù)是屬于手機(jī)硬件方面的展現(xiàn),也是在開發(fā)Android應(yīng)用程序時(shí)可以突出的特點(diǎn)之一。(8)藍(lán)牙、EDGE、3G及Wi-Fi:藍(lán)牙是一種新型、開放、低成本、短距離的無線連接技術(shù),可取代短距離的電纜,實(shí)現(xiàn)話音和數(shù)據(jù)的無線傳輸。EDGE(EnhancedDataRateforGSM,Evolution),即增強(qiáng)型數(shù)據(jù)速率GSM演進(jìn)技術(shù)。EDGE是一種從GSM到3G的過渡技術(shù),它主要是在GSM系統(tǒng)中采用了一種新的調(diào)制方法,即最先進(jìn)的多時(shí)隙操作和SPSK調(diào)制技術(shù)。由于8PSK可將現(xiàn)有GSM網(wǎng)絡(luò)采用的GMSK調(diào)制技術(shù)的信號(hào)空間從2擴(kuò)展到8,從而使每個(gè)符號(hào)所包含的信息是原來的4倍。Wi-Fi(WirelessFidelity),即無線保真技術(shù),與藍(lán)牙技術(shù)一樣,同屬于在辦公室和家庭中使用的短距離無線技術(shù)。該技術(shù)使用的是2.4GHz附近的頻段,該頻段目前尚屬?zèng)]用許可的無線頻段。其目前可使用的標(biāo)準(zhǔn)有兩個(gè),分別是IEEE802.lla和IEEE802.11b。這些通訊能力也是屬于手機(jī)硬件方面的展現(xiàn),也是在開發(fā)Android應(yīng)用程序時(shí)可以突出的特點(diǎn)之一。(9)GPS:GlobalPositioningSystem,即全球定位系統(tǒng),它是一個(gè)由覆蓋全球的24顆衛(wèi)星組成的衛(wèi)星系統(tǒng)。這個(gè)系統(tǒng)可以保證在任意時(shí)刻和任何地點(diǎn)都可以同時(shí)觀測到4顆衛(wèi)星,以保證衛(wèi)星可以采集到該觀測點(diǎn)的經(jīng)緯度和高度,以便實(shí)現(xiàn)導(dǎo)航、定位、授時(shí)等功能。這項(xiàng)技術(shù)可以用來引導(dǎo)飛機(jī)、船舶、車輛以及個(gè)人。這個(gè)同樣也是屬于手機(jī)硬體方面的體現(xiàn),也是在開發(fā)Android應(yīng)用程序是可以突出的特點(diǎn)之一。2.2Android架構(gòu)分析圖2-1中顯示的是Android架構(gòu)的五個(gè)主要部分。圖2-1安卓架構(gòu)的五個(gè)部分2.2.1應(yīng)用程序框架在AndroidSDK中,定義了讓開發(fā)者使用與核心應(yīng)用程序相同API的權(quán)限應(yīng)用程序框架是為了要簡化組件的重新利用而設(shè)計(jì)的,應(yīng)用程序可以發(fā)布功能為其它應(yīng)用程序所使用。但是,這要受限于應(yīng)用程序架構(gòu)的安全機(jī)制,使用者以用同樣的機(jī)制來新增、置換組件。目前所有的應(yīng)用程序是由服務(wù)及系統(tǒng)來組成,包含有:(l)一套強(qiáng)大和可擴(kuò)展的視圖系統(tǒng):用來建構(gòu)一個(gè)應(yīng)用程序的基本組件,包了在開發(fā)系統(tǒng)畫面時(shí),常用的列表、網(wǎng)格、文本框、按鈕等控制項(xiàng),甚至是內(nèi)嵌的Web瀏覽器。(2)內(nèi)容提供者:使應(yīng)用程序可以訪問另一個(gè)應(yīng)用程序的數(shù)據(jù)(如聯(lián)系人數(shù)庫),或者共享它們自己的數(shù)據(jù)。(3)資源管理器:提供各種非程序代碼的資源讓應(yīng)用程序去使用。例如:本字符串、圖形文件或排版相關(guān)的布局文件。(4)通知管理器:提供應(yīng)用程序在狀態(tài)欄中顯示應(yīng)用程序自定義的提示信息。(5)活動(dòng)管理器:管理所有應(yīng)用程序的生命周期及提供常用的導(dǎo)航回退功能。例如:啟動(dòng)應(yīng)用程序要用到的資源準(zhǔn)備及關(guān)閉應(yīng)用程序時(shí)釋放內(nèi)存及相關(guān)資源等工作。(6)視窗管理器:用來管理所有啟動(dòng)程序的視窗。(7)位置管理器:用來管理地圖服務(wù)的相關(guān)功能。(8)電話管理器:用來管理用戶撥打與接聽電話的相關(guān)功能。(9)包管理器:管理所有安裝在Android系統(tǒng)內(nèi)的包。2.2.2類庫在Android中包含一些C/C++的類庫,這些類庫能被Android系統(tǒng)中不同的組件來使用。開發(fā)者可以通過應(yīng)用程序框架使用這些功能。部分核心類庫列表如下:(1)surfaceManager:主要的功能是讓開發(fā)者可以去存取/顯示系統(tǒng)及管理的功能,在[顯示]與[存取操作]間的對(duì)應(yīng)、互動(dòng)以及實(shí)現(xiàn)無接縫的2D/3D多應(yīng)用程序之間的整合。例如:在2D、2D顯示上的合成、疊合動(dòng)作。(2)3Dlibraries:主要是依openGLES1.0規(guī)范所定義的3D繪圖引擎。該庫使用硬件加速(當(dāng)硬件可用時(shí)),可以將硬件的3D功能做最佳化的處理顯示。(3)SGL:主要是處理有關(guān)顯示2D方面的繪圖引擎。(4)MediaFramework:主要是以packetVideo公司的OpenCORE為基礎(chǔ)所發(fā)展的多媒體類庫,該庫支持回放和錄制大量流行的音視頻格式和靜態(tài)圖片。例如:MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF等格式(5)FreeType:主要是用來顯示點(diǎn)陣圖和處理向量字形的。(6)SSL:(secureSocketsuyer),中文名為“安全套接層協(xié)議層”,它是網(wǎng)景公司提出的基于WEB應(yīng)用的安全協(xié)議,當(dāng)前版本為3.0。SSL協(xié)議指定了一種在應(yīng)用程序協(xié)議(如HTTP、Telenet、NMTP和FTP等)和TCP/IP協(xié)議之間提供數(shù)據(jù)安全性分層的機(jī)制,它為TCP/IP連接提供數(shù)據(jù)加密、服務(wù)器認(rèn)證、消息完整性以及可選的客戶機(jī)認(rèn)證。它已被廣泛地用于Web瀏覽器與服務(wù)器之間的身份認(rèn)證和加密數(shù)據(jù)傳輸。SSL協(xié)議位于TCP膽協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。SSL協(xié)議可分為兩層:SSL記錄協(xié)議(SSLRecordProtocol):它建立在可靠的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能的支持。SSL握手協(xié)議(SSLHandshakeprotocol):它建立在SSL記錄協(xié)議之上,用于在實(shí)際的數(shù)據(jù)傳輸開始前,通訊雙方進(jìn)行身份認(rèn)證、協(xié)商加密算法、交換加密密鑰等。SSL協(xié)議提供的服務(wù)主要有:①認(rèn)證用戶和服務(wù)器,確保數(shù)據(jù)發(fā)送到正確的客戶機(jī)和服務(wù)器;②加密數(shù)據(jù)以防止數(shù)據(jù)中途被竊取;③維護(hù)數(shù)據(jù)的完整性,確保數(shù)據(jù)在傳輸過程中不被改變。(7)SQLite:SQLite是一套開放性的關(guān)聯(lián)式資料庫,能夠被所有應(yīng)用程序使用的輕量級(jí)的關(guān)系數(shù)據(jù)庫引擎。(8)webKit:是一個(gè)先進(jìn)的網(wǎng)頁瀏覽器引擎,被用來構(gòu)建Android瀏覽器和內(nèi)嵌的web視圖,也可以讓開發(fā)者利用這個(gè)引擎來做不同的應(yīng)用。(9)libc:就是一個(gè)BSD標(biāo)準(zhǔn)C類庫。但是,針對(duì)Linux嵌入式裝置進(jìn)行過最佳化的調(diào)整。2.2.3Android運(yùn)行時(shí)組件雖然Android是用Java語言來開發(fā)、撰寫應(yīng)用程序,但卻不使用Java運(yùn)行時(shí)組件來執(zhí)行Java程序,而是使用了由Google自行研發(fā)的Android運(yùn)行時(shí)組件來執(zhí)行程序。Android運(yùn)行時(shí)組件包括兩個(gè)重要的部分,一個(gè)是核心類庫,另一個(gè)是Dalvik虛擬機(jī)。2.3Android應(yīng)用的構(gòu)成和工作機(jī)制對(duì)于一個(gè)Android應(yīng)用程序來說,是由Activity、IntentReceiver、Service、ContentProvider四部分組成,但并不是每一個(gè)Android應(yīng)用程序都必須由這四部分組成。在應(yīng)用程序中使用時(shí),需要在配置文件AndroidManifest.xml中進(jìn)行配置。這個(gè)配置文件是每個(gè)Android應(yīng)用程序所必需的,用于定義應(yīng)用程序的組件、組件的功能以及必要條件等。Android應(yīng)用的構(gòu)成和工作流程如圖2-2:圖2-2Android的構(gòu)成和工作流程3.Android開發(fā)環(huán)境3.1下載JDK6首先需要的是JDK。AndroidSDK需要JDK5或更高的版本,我們使用JDK6來開發(fā)。以windows默認(rèn)windows環(huán)境下為例,從Sun網(wǎng)站(/javase/downloads/)下載JDK6并安裝。默認(rèn)windows環(huán)境下接下來,設(shè)置JAVA_HOME環(huán)境變量以指向JDK安裝文件夾。右鍵單擊“計(jì)算機(jī)”選擇“屬性”,選擇“高級(jí)系統(tǒng)設(shè)置”,然后單擊“環(huán)境變量”。單擊“新建”添加JAVA_HOME變量,如果該變量已存在,單擊“編輯”修改它。JAVA_HOME的值類似于“C:\ProgramFiles\Java\jdk1.6.0_16”。3.2下載Eclipse3.5安裝JDK之后,可以從/downloads/下載EclipseIDEforJavaDevelopers。將下載的.zip的文件解壓到任何位置。首次啟動(dòng)Eclipse時(shí),它將要求為工作區(qū)間提供一個(gè)位置。為了簡化操作,可以選擇一個(gè)簡單的位置,比如D:\workspaces。3.3下載AndroidSDKAndroidSDK是開發(fā)android應(yīng)用程序的基本要求,沒有AndroidSDK,android應(yīng)用開發(fā)無從談起。AndroidSDK中包含一個(gè)模擬器,所以無需帶有Android操作系統(tǒng)的移動(dòng)設(shè)備就能開發(fā)Android應(yīng)用程序。AndroidSDK可以從/sdk下載。AndroidSDK同eclipse一樣以.zip文件的形式發(fā)布,所以將其解壓到合適的位置。AndroidSDK包含一個(gè)tools目錄,需要將它添加到PATH中。3.4安裝ADTADT這個(gè)Eclipse插件對(duì)開發(fā)Android應(yīng)用程序有很大的幫助。它提供了一些工具來創(chuàng)建、測試、和調(diào)試Android應(yīng)用程序。ADT需要使用Eclipse中的InstallNewSoftware工具來執(zhí)行安裝。(1)選擇Help菜單項(xiàng)并選擇InstallNewSoftware…選項(xiàng)。這個(gè)選項(xiàng)在以前的Eclipse版本中為“SoftwareUpdates”。(2)選擇“Workwith”字段,輸/android/eclipse/。Eclipse將連接該網(wǎng)站并生成列表,如圖3-1所示。然后選擇父節(jié)點(diǎn)DeveloperTools,并確認(rèn)同事選中所有子節(jié)點(diǎn),然后單擊Next。(3)更具提示安裝所有的工具,并安裝ADT所需工具的許可協(xié)議。單擊“Iaccept…”,然后單擊Finish按鈕。圖3-1使用Eclipse中的InstallNewSoftware功能安裝ADT在Eclipse中安裝ADT的最后一步是將他指向AndroidSDK。選擇windows菜單并選擇Preferences。在Preferences對(duì)話框中,選擇Android節(jié)點(diǎn)并將SDKLocation字段設(shè)置為AndroidSDK的路徑(參見圖3-2)然后單擊Apply按鈕。東華理工大學(xué)長江學(xué)院畢業(yè)設(shè)計(jì)圖3-2將ADT指向AndroidSDK4.Android應(yīng)用程序結(jié)構(gòu)剖析4.1Android的APIAndroidAPI主要包含了以下幾個(gè)部分:AndroidManifest.xmlAndroidManifest.xml是系統(tǒng)的控制文件,它告訴系統(tǒng)如何處理所創(chuàng)建的所有應(yīng)用組件(尤其是活動(dòng)(Activity),服務(wù)(Service),意圖接收器(IntentReceiver)和內(nèi)容提供者(ContentProvider))。舉例來說,控制文件就是把活動(dòng)和要接收的意圖(Intents)連接在一起的“膠水”?;顒?dòng)活動(dòng)就是一個(gè)有生命周期的對(duì)象。一個(gè)活動(dòng)就是完成某些工作的代碼塊,這部分工作還可能包括對(duì)用戶UI界面的顯示。不過這不是必須的,有些活動(dòng)從不顯示UI界面。視圖視圖可以將其自身繪制到屏幕上。Android的用戶界面由一系列的視圖樹構(gòu)成。接口都是由一組以樹的形式出現(xiàn)的視圖組成的。開發(fā)者可以通過創(chuàng)建一個(gè)新的視圖的方法來使用自定義的圖形處理技術(shù)(比如開發(fā)游戲,或者是使用了不常用的用戶圖形窗口界面)。意圖意圖是一個(gè)簡單的消息對(duì)象,它表示程序想做某事的“意圖”。比如應(yīng)用程序想要顯示一個(gè)網(wǎng)頁,那么它可以通過創(chuàng)建一個(gè)Intent實(shí)例并將其傳遞給系統(tǒng)來表示意圖瀏覽這個(gè)URI。系統(tǒng)將定位到能處理這一Intent的代碼(在當(dāng)前情況下就是瀏覽器),并運(yùn)行之。意圖也可以用于廣播系統(tǒng)范圍內(nèi)的有效事件(例如通知事件)。服務(wù)服務(wù)是運(yùn)行在后臺(tái)的一段代碼。它可以運(yùn)行在它自己的進(jìn)程,也可以運(yùn)行在其他應(yīng)用程序的進(jìn)程里,這取決于自身的需要.。其它的組件可以綁定到一個(gè)服務(wù)上來,通過遠(yuǎn)程過程調(diào)用(RPC)來調(diào)用這個(gè)方法。例如媒體播放器的服務(wù),當(dāng)用戶退出媒體選擇的界面時(shí),仍然希望音樂依然可以繼續(xù)播放,這時(shí)就可用服務(wù)來保證當(dāng)用戶界面關(guān)閉時(shí)音樂還繼續(xù)播放著。通知通知將以小圖標(biāo)的形式呈現(xiàn)在狀態(tài)欄里,用戶通過與圖標(biāo)的交互來接收消息。最常見的通知包括短信息、通話記錄和語音郵件,但是應(yīng)用程序也可以創(chuàng)建它們自己的通知事件。內(nèi)容提供者內(nèi)容提供者是用來提供對(duì)設(shè)備上數(shù)據(jù)進(jìn)行訪問。典型的例子就是使用內(nèi)容提供者來訪問聯(lián)系人列表。應(yīng)用程序也可以使用其它程序通過內(nèi)容提供者提供的數(shù)據(jù),同時(shí)也可以定義自己的內(nèi)容提供者來向其它應(yīng)用提供數(shù)據(jù)訪問服務(wù)。4.2Android應(yīng)用程序結(jié)構(gòu)解析通常由以下四個(gè)組件來構(gòu)建一個(gè)完整的Android應(yīng)用程序。①活動(dòng)②意圖接收器③服務(wù)④內(nèi)容提供者然而,并不是所有的Android應(yīng)用程序都必須具備上面的四個(gè)組件,可以由上面的一個(gè)或幾個(gè)來組建。當(dāng)決定使用以上哪些組件來構(gòu)建Android應(yīng)用程序時(shí),需要將它們注冊在AndroidManifest.xml文件中,這是一個(gè)XML配置文件,在這個(gè)文件中可以聲明應(yīng)用程序組件以及它們的特性和要求。這個(gè)配置文件是每個(gè)Android應(yīng)用程序所必需的。4.2.1ActivitiesActivities是一個(gè)程序的組件之一。它的主要功能是提供界面。一個(gè)程序一般由多個(gè)Activity組成,各activities之間關(guān)系很松散,它們之間沒有直接的關(guān)聯(lián)。必須有一個(gè)activity被指定為主activity,它是程序啟動(dòng)時(shí)首先顯示的界面。每個(gè)activity都可以隨意啟動(dòng)其它的activity。每當(dāng)一個(gè)activity被啟動(dòng),則前一個(gè)activity就被停止。一個(gè)程序中的所有啟動(dòng)的activity都被放在一個(gè)棧中,所以被停止的activity并沒有銷毀,而在存于棧中。新啟動(dòng)的activity先被存放于棧中,然后獲得輸入焦點(diǎn)。在當(dāng)前活動(dòng)的activity上點(diǎn)返回鍵,它被從棧中取出,然后銷毀,然后上一個(gè)activity被恢復(fù)。當(dāng)一個(gè)activity因?yàn)樾碌腶ctivity啟動(dòng)而被停止時(shí),它會(huì)收到狀態(tài)變化的通知,這樣的變化有多個(gè),每個(gè)都會(huì)引起系統(tǒng)調(diào)用一個(gè)相應(yīng)的回調(diào)方法以通知activity,這些回調(diào)方法被統(tǒng)稱為“生命周期回調(diào)方法”。這些回調(diào)方法分別在Activity被創(chuàng)建、停止、恢復(fù)、銷毀時(shí)被調(diào)用。如圖4-1,介紹各個(gè)“生命周期回調(diào)方法”,以及其各個(gè)方法之間的關(guān)系:onCreate:當(dāng)活動(dòng)第一次啟動(dòng)的時(shí)候,觸發(fā)該方法,可以在此時(shí)完成活動(dòng)的初始化工作。onCreate方法有一個(gè)參數(shù),該參數(shù)可以為空(null),也可以是之前調(diào)用onSaveInstanceState()方法保存的狀態(tài)信息。onStart:該方法的觸發(fā)表示所屬活動(dòng)將被展現(xiàn)給用戶。onResume:當(dāng)一個(gè)活動(dòng)和用戶發(fā)生交互的時(shí)候,觸發(fā)該方法。onPause:當(dāng)一個(gè)正在前臺(tái)運(yùn)行的活動(dòng)因?yàn)槠渌幕顒?dòng)需要前臺(tái)運(yùn)行而轉(zhuǎn)入后臺(tái)運(yùn)行的時(shí)候,觸發(fā)該方法。這時(shí)候需要將活動(dòng)的狀態(tài)持久化,比如正在編輯的數(shù)據(jù)庫記錄等。onStop:當(dāng)一個(gè)活動(dòng)不再需要展示給用戶的時(shí)候,觸發(fā)該方法。如果內(nèi)存緊張,系統(tǒng)會(huì)直接結(jié)束這個(gè)活動(dòng),而不會(huì)觸發(fā)onStop方法。所以保存狀態(tài)信息是應(yīng)該在onPause時(shí)做,而不是onStop時(shí)做?;顒?dòng)如果沒有在前臺(tái)運(yùn)行,都將被停止或者Linux管理進(jìn)程為了給新的活動(dòng)預(yù)留足夠的存儲(chǔ)空間而隨時(shí)結(jié)束這些活動(dòng)。因此對(duì)于開發(fā)者來說,在設(shè)計(jì)應(yīng)用程序的時(shí)候,必須時(shí)刻牢記這一原則。在一些情況下,onPause方法或許是活動(dòng)觸發(fā)的最后的方法,因此開發(fā)者需要在這個(gè)時(shí)候保存需要保存的信息。onRestart:當(dāng)處于停止?fàn)顟B(tài)的活動(dòng)需要再次展現(xiàn)給用戶的時(shí)候,觸發(fā)該方法。圖4-1Android生命周期onDestroy:當(dāng)活動(dòng)銷毀的時(shí)候,觸發(fā)該方法。和onStop方法一樣,如果內(nèi)存緊張,系統(tǒng)會(huì)直接結(jié)束這個(gè)活動(dòng)而不會(huì)觸發(fā)該方法。4.2.2ServiceService是android

系統(tǒng)中的一種組件,它跟Activity的級(jí)別差不多,但是他不能自己運(yùn)行,只能后臺(tái)運(yùn)行,并且可以和其他組件進(jìn)行交互。Service的啟動(dòng)有兩種方式:context.startService()和context.bindService()。使用context.startService()啟動(dòng)Service經(jīng)歷:context.startService()

->onCreate()->onStart()->Servicerunningcontext.stopService()|->onDestroy()->Servicestop

如果Service還沒有運(yùn)行,則android先調(diào)用onCreate()然后調(diào)用onStart();如果Service已經(jīng)運(yùn)行,則只調(diào)用onStart(),所以一個(gè)Service的onStart方法可能會(huì)重復(fù)調(diào)用多次。

stopService的時(shí)候直接onDestroy,如果是調(diào)用者自己直接退出而沒有調(diào)用stopService的話,Service會(huì)一直在后臺(tái)運(yùn)行。該Service的調(diào)用者再啟動(dòng)起來后可以通過stopService關(guān)閉Service。所以調(diào)用startService的生命周期為:onCreate-->onStart(可多次調(diào)用)-->onDestroy使用使用context.bindService()啟動(dòng)Service會(huì)經(jīng)歷:

context.bindService()->onCreate()->onBind()->Servicerunning

onUnbind()->onDestroy()->ServicestoponBind將返回給客戶端一個(gè)IBind接口實(shí)例,IBind允許客戶端回調(diào)服務(wù)的方法,比如得到Service運(yùn)行的狀態(tài)或其他操作。這個(gè)時(shí)候把調(diào)用者(Context,例如Activity)會(huì)和Service綁定在一起,Context退出了,Srevice就會(huì)調(diào)用onUnbind->onDestroy相應(yīng)退出。

所以調(diào)用bindService的生命周期為:onCreate-->onBind(只一次,不可多次綁定)-->onUnbind-->onDestory。在Service每一次的開啟關(guān)閉過程中,只有onStart可被多次調(diào)用(通過多次startService調(diào)用),其他onCreate,onBind,onUnbind,onDestory在一個(gè)生命周期中只能被調(diào)用一次。

service可以在和多場合的應(yīng)用中使用,比如播放多媒體的時(shí)候用戶啟動(dòng)了其他Activity這個(gè)時(shí)候程序要在后臺(tái)繼續(xù)播放,比如檢測SD卡上文件的變化,再或者在后臺(tái)記錄你地理信息位置的改變等等。4.2.3ContentProviderContentProvider屬于Android應(yīng)用程序的組件之一,作為應(yīng)用程序之間唯一的共享數(shù)據(jù)的途徑,ContentProvider主要的功能就是存儲(chǔ)并檢索數(shù)據(jù)以及向其他應(yīng)用程序提供訪問數(shù)據(jù)的借口。Android系統(tǒng)為一些常見的數(shù)據(jù)類型(如音樂、視頻、圖像、手機(jī)通信錄聯(lián)系人信息等)內(nèi)置了一系列的ContentProvider,這些都位于vider包下。持有特定的許可,可以在自己開發(fā)的應(yīng)用程序中訪問這些ContentProvider。讓自己的數(shù)據(jù)和其他應(yīng)用程序共享有兩種方式:創(chuàng)建自己的ContentProvier(即繼承自ContentProvider的子類)

或者是將自己的數(shù)據(jù)添加到已有的ContentProvider中去,后者需要保證現(xiàn)有的ContentProvider和自己的數(shù)據(jù)類型相同且具有該ContentProvider的寫入權(quán)限。對(duì)于ContentProvider,最重要的就是數(shù)據(jù)模型(datamodel)和URI。數(shù)據(jù)模型ContentProvider將其存儲(chǔ)的數(shù)據(jù)以數(shù)據(jù)表的形式提供給訪問者,在數(shù)據(jù)表中每一行為一條記錄,每一列為具有特定類型和意義的數(shù)據(jù)。每一條數(shù)據(jù)記錄都包括一個(gè)"_ID"數(shù)值字段,改字段唯一標(biāo)識(shí)一條數(shù)據(jù)。URIURI,每一個(gè)ContentProvider都對(duì)外提供一個(gè)能夠唯一標(biāo)識(shí)自己數(shù)據(jù)集(dataset)的公開URI,如果一個(gè)ContentProvider管理多個(gè)數(shù)據(jù)集,其將會(huì)為每個(gè)數(shù)據(jù)集分配一個(gè)獨(dú)立的URI。所有的ContentProvider的URI都以"content://"開頭,其中"content:"是用來標(biāo)識(shí)數(shù)據(jù)是由ContentProvider管理的schema。在幾乎所有的ContentProvider的操作中都會(huì)用到URI,因此一般來講,如果是自己開發(fā)的ContentProvider,最好將URI定義為常量,這樣在簡化開發(fā)的同時(shí)也提高了代碼的可維護(hù)性。首先來介紹如何訪問ContentProvider中的數(shù)據(jù),訪問ContentProvider中的數(shù)據(jù)主要通過ContentResolver對(duì)象,ContentResolver類提供了成員方法可以用來對(duì)ContentProvider中的數(shù)據(jù)進(jìn)行查詢、插入、修改和刪除等操作。以查詢?yōu)槔?,查詢一個(gè)ContentProvider需要掌握如下的信息:唯一標(biāo)識(shí)ContentProvider的URI,需要訪問的數(shù)據(jù)字段名稱,該數(shù)據(jù)字段的數(shù)據(jù)類型。4.2.4BroadcastReceiverIntent廣播的“消費(fèi)者”。通過創(chuàng)建和注冊一個(gè)BroadcastReceiver,應(yīng)用程序可以監(jiān)聽符合特定條件的廣播的Intent。BroadcastReceiver會(huì)自動(dòng)的啟動(dòng)你的Android應(yīng)用程序去響應(yīng)新來的Intent。BroadcastReceiver是事件驅(qū)動(dòng)程序的理想手段。BroadcaseReceiver不執(zhí)行任何任務(wù),僅僅是接受并響應(yīng)廣播通知的一類組件。大部分廣播通知是由系統(tǒng)產(chǎn)生的,例如改變時(shí)區(qū),電池電量低,用戶選擇了一幅圖片或者用戶改變了語言首選項(xiàng)。應(yīng)用程序同樣也可以發(fā)送廣播通知,例如通知其他應(yīng)用程序某些數(shù)據(jù)已經(jīng)被下載到設(shè)備上可以使用。一個(gè)應(yīng)用程序可以包含任意數(shù)量的BroadcaseReveiver來響應(yīng)它認(rèn)為很重要的通知。所有的BroadcastReceiver都擴(kuò)展自類BroadcastReceiver。BroadcastReceiver不包含任何用戶界面。然而它們可以啟動(dòng)一個(gè)Activity以響應(yīng)接受到的信息,或者通過NotificationManager通知用戶。可以通過多種方式使用戶知道有新的通知產(chǎn)生:閃動(dòng)背景燈、震動(dòng)設(shè)備、發(fā)出聲音等等。通常程序會(huì)在狀態(tài)欄上放置一個(gè)持久的圖標(biāo),用戶可以打開這個(gè)圖標(biāo)并讀取通知信息。在使用BroadcastReceiver前,先要注冊BroadcastReceiver,而注冊BroadcastReceiver有兩種方式,一種是在靜態(tài)的AndroidManifest.xml中注冊,另一種是動(dòng)態(tài)的在代碼中注冊,以下是兩種注冊BroadcastReceiver的實(shí)例:1)在AndroidManifest.xml中注冊Xml代碼<receiverandroid:name="Receiver1"><intent-filter><!--和Intent中的action對(duì)應(yīng)--><actionandroid:name="com.forrest.action.mybroadcast"/></intent-filter></receiver>2)在代碼中注冊Java代碼IntentFilterfilter=newIntentFilter("com.forrest.action.mybroadcast");//和廣播中Intent的action對(duì)應(yīng)MyBroadcastReceiverbr=newMyBroadcastReceiver();registerReceiver(newMyBroadcastReceiver(),filter);4.3Intent的詳細(xì)解析在一個(gè)Android應(yīng)用中,主要是由四種組件組成的,這四種組件可參考上一節(jié)的內(nèi)容。而這四種組件是獨(dú)立的,它們之間可以互相調(diào)用,協(xié)調(diào)工作,最終組成一個(gè)真正的Android應(yīng)用。在這些組件之間的通訊中,主要是由意圖協(xié)助完成的。意圖負(fù)責(zé)對(duì)應(yīng)用中一次操作的動(dòng)作、動(dòng)作對(duì)應(yīng)的數(shù)據(jù)、附加數(shù)據(jù)進(jìn)行描述,Android則根據(jù)此意圖的描述,負(fù)責(zé)找到相應(yīng)的組件,將意圖傳遞給它,并完成組件的調(diào)用。因此,意圖在這里起著一個(gè)媒體中介的作用,專門提供組件之間互相調(diào)用的相關(guān)信息,實(shí)現(xiàn)調(diào)用者與被調(diào)用者之間的解耦。例如,在一個(gè)聯(lián)系人維護(hù)的應(yīng)用中,當(dāng)在一個(gè)聯(lián)系人列表屏幕(假設(shè)對(duì)應(yīng)的Activity為listActivity)上,點(diǎn)擊某個(gè)聯(lián)系人后,希望能夠調(diào)出此聯(lián)系人的詳細(xì)信息,為了實(shí)現(xiàn)這個(gè)目的,listActivity需要構(gòu)造一個(gè)Intent,這個(gè)Intent用于告訴系統(tǒng),要做“查看”動(dòng)作,此動(dòng)作對(duì)應(yīng)的查看對(duì)象是“某聯(lián)系人”,然后調(diào)用startActivity(intentintent),將構(gòu)造的Intent傳入,系統(tǒng)會(huì)根據(jù)此intent中的描述,到AndroidManifest.xml中找到滿足此Intent要求的Activity。系統(tǒng)會(huì)調(diào)用找到的Activity,即為detailActivity,最終傳入Intent,detailActivitv則會(huì)根據(jù)此Intent中的描述,執(zhí)行相應(yīng)的操作。4.3.1Intent的抽象描述在Android參考文檔中,對(duì)意圖的定義是執(zhí)行某操作的一個(gè)抽象描述。該抽象描述的具體內(nèi)容如下:首先,它是要執(zhí)行的動(dòng)作的一個(gè)簡要描述,如查看、修改等,Android定義了一套標(biāo)準(zhǔn)動(dòng)作。此外,還可以根據(jù)應(yīng)用的需要,定義自己的動(dòng)作,并可定義相應(yīng)的活動(dòng)來處理自定義的動(dòng)作。其次,是執(zhí)行動(dòng)作要操作的數(shù)據(jù),Android采用指向數(shù)據(jù)的一個(gè)URI方式來實(shí)現(xiàn)。另外,除了動(dòng)作和數(shù)據(jù)這兩個(gè)重要屬性外,還有一些附加屬性:類別:被執(zhí)行動(dòng)作的附加信息。例如LAUNCHER_CATEGORY表示意圖的接受者應(yīng)該在Launcher中作為頂級(jí)應(yīng)用出現(xiàn);而ALTERNATIVECATEGORY表示當(dāng)前的意圖是一系列的可選動(dòng)作中的一個(gè),這些動(dòng)作可以在同一個(gè)數(shù)據(jù)上執(zhí)行。數(shù)據(jù)類型:顯式指定意圖的數(shù)據(jù)類型。一般意圖的數(shù)據(jù)類型能夠根據(jù)數(shù)據(jù)本身進(jìn)行判定,但是通過設(shè)置這個(gè)屬性,可以強(qiáng)制采用指定的類型。組件:指定意圖的目標(biāo)組件的類名稱。通常Android會(huì)根據(jù)意圖中包含的其它屬性的信息,比如動(dòng)作、數(shù)據(jù)/數(shù)據(jù)類型、類別進(jìn)行查找,最終找到一個(gè)與之匹配的目標(biāo)組件。附加信息:是其它所有附加信息的集合。使用附加信息可以為組件提供擴(kuò)展信息,比如,如果要執(zhí)行“發(fā)送電子郵件”這個(gè)動(dòng)作,可以將電子郵件的標(biāo)題、正文等保存在附加信息里,傳給電子郵件發(fā)送組件??傊瑒?dòng)作、數(shù)據(jù)/數(shù)據(jù)類型、類別和附加信息一起形成了一種語言。這種語言使系統(tǒng)能夠理解諸如“查看某聯(lián)系人的詳細(xì)信息”之類的短語。隨著應(yīng)用不斷的加入到系統(tǒng)中,它們可以添加新的動(dòng)作、數(shù)據(jù)/數(shù)據(jù)類型和類別來擴(kuò)展這種語言。應(yīng)用也可以提供自己的活動(dòng)來處理已經(jīng)存在的這樣的“短語”,從而改變這些“短語”的行為。4.3.2Android如何解析Intent在應(yīng)用中,可以以兩種形式來使用Intent:(l)直接意圖:指定了組件屬性的意圖。通過指定具體的組件類,通知應(yīng)用啟動(dòng)對(duì)應(yīng)的組件。(2)間接意圖:沒有指定組件屬性的意圖。這些意圖需要包含足夠的信息,這樣系統(tǒng)才能根據(jù)這些信息,在所有的可用組件中,確定滿足此意圖的組件。對(duì)于直接意圖,Android不需要去做解析,因?yàn)槟繕?biāo)組件已經(jīng)很明確,Android需要解析的是那些間接意圖,通過解析,將意圖映射給可以處理此意圖的活動(dòng)、意圖接收器或服務(wù)。意圖解析機(jī)制主要是通過查找己注冊在AndroidManifest.xml中的所有意圖過濾器及其中定義的意圖,最終找到匹配的意圖。在這個(gè)解析過程中,Android是通過意圖的動(dòng)作、數(shù)據(jù)類型、類別這三個(gè)屬性來進(jìn)行判斷的,判斷方法如下:如果意圖指明定了動(dòng)作,則目標(biāo)組件的意圖過濾器的動(dòng)作列表中就必須包含有這個(gè)動(dòng)作,否則不能匹配。如果意圖沒有提供數(shù)據(jù)類型,系統(tǒng)將從數(shù)據(jù)中得到數(shù)據(jù)類型。和動(dòng)作一樣,目標(biāo)組件的數(shù)據(jù)類型列表中必須包含意圖的數(shù)據(jù)類型,否則不能匹配。如果意圖中的數(shù)據(jù)不是content:類型的URI,而且意圖也沒有明確指定它的數(shù)據(jù)類型,將根據(jù)意圖中數(shù)據(jù)的格式(比如http:或者mailto:)進(jìn)行匹配。同上,意圖的格式必須出現(xiàn)在目標(biāo)組件的格式列表中。如果意圖指定了一個(gè)或多個(gè)類別,這些類別必須全部出現(xiàn)在組建的類別列表中。比如意圖中包含了兩個(gè)類別:LAUNCHER_CATEGORY和ALTERNATIVEC_CATEGORY,解析得到的目標(biāo)組件必須至少包含這兩個(gè)類別。5.飛機(jī)游戲設(shè)計(jì)5.1研究目標(biāo)在如今社會(huì),人們的工作學(xué)習(xí)壓力逐漸增大,生活節(jié)奏逐漸加快,大多數(shù)人沒有足夠的時(shí)間去休閑娛樂,放松自己。這款小型的手機(jī)游戲,可以讓我們隨時(shí)隨地都能享受游戲,。讓我們從繁重的日常生活中解脫出來。游戲的主界面應(yīng)該力求美觀,爽心悅目,以提高玩家對(duì)游戲的興趣。游戲的控制模塊應(yīng)該做到易懂、易操作,以給玩家一個(gè)很好的游戲環(huán)境。(1)了解Android應(yīng)用程序的設(shè)計(jì)和開發(fā)過程;(2)使用多種組件進(jìn)行Android平臺(tái)校園資訊軟件的開發(fā)。本軟件是基于Eclipse的開發(fā)環(huán)境,在Android平臺(tái)上的手機(jī)游戲軟件。5.2需求細(xì)則1、 飛機(jī)1) 移動(dòng)屬性:必選描述:能夠監(jiān)聽玩家操控。完成下列情況的任一種即可:● 玩家可以通過觸摸屏觸點(diǎn)的位置不同來控制飛機(jī);● 鍵盤上的方向鍵控制飛機(jī);● 點(diǎn)擊屏幕上自己繪制的方向鍵控制飛機(jī)。2) 子彈屬性:必選描述:飛機(jī)能夠發(fā)射子彈。完成下列情況的任一種即可:● 飛機(jī)連續(xù)發(fā)子彈,只要飛機(jī)出現(xiàn),就持續(xù)發(fā)射;● 玩家通過某個(gè)按鍵(例如空白鍵)發(fā)射,按一下發(fā)射一次。3) 血條屬性:必選描述:飛機(jī)要有血條,玩家能夠根據(jù)血條來判斷飛機(jī)剩余血量。血條必須具有下列特征:● 每被擊中,血條都要變短;● 當(dāng)血條為空時(shí),即判定為死亡。4) 多樣性屬性:任選描述:飛機(jī)具有多樣性供玩家選擇,完成下列情況的任一種或多種即可:● 飛機(jī)可以升級(jí)子彈威力;● 飛機(jī)可以改變子彈類型;● 可選不同類型的飛機(jī);● 大招:飛機(jī)有清屏炸彈等;● 其它更有創(chuàng)意的設(shè)計(jì)。5) 特殊屬性屬性:任選描述:飛機(jī)多種靈活的特性,完成下列情況的任一種或多種即可:● 飛機(jī)有多條命,沒死一次就扣除一條命;● 飛機(jī)有能量,能量可以用來發(fā)大招,可以用來做護(hù)罩……;● 復(fù)活功能,飛機(jī)死亡后可以消耗能量、分?jǐn)?shù)或其它屬性來復(fù)活;● 其它更有創(chuàng)意的設(shè)計(jì)。2、 敵機(jī)1) 移動(dòng)屬性:必選描述:能夠移動(dòng)。完成下列情況的任一種即可:● 上下飛行;● 斜著飛行;● 畫圓、渦旋飛行;● 其它更有創(chuàng)意的設(shè)計(jì)。2) 子彈屬性:必選描述:敵機(jī)能夠發(fā)射子彈3) 碰撞●飛機(jī)子彈擊中敵機(jī)屬性:必選判定:子彈只要出現(xiàn)在敵機(jī)圖片的范圍內(nèi),即判定為擊中描述:敵機(jī)被飛機(jī)擊中,死亡或掉血;玩家加分?!?敵機(jī)子彈擊中飛機(jī)屬性:必選判定:子彈只要出現(xiàn)在飛機(jī)圖片的范圍內(nèi),即判定為擊中描述:飛機(jī)被擊中,掉血?!?爆炸效果屬性:必選描述:發(fā)生上述1.3.1時(shí),界面顯示爆炸動(dòng)畫。● 敵機(jī)和飛機(jī)相撞屬性:任選判定:只要飛機(jī)圖片和敵機(jī)圖片有重疊,即判定為相撞描述:敵機(jī)死亡,飛機(jī)掉血?!?飛機(jī)子彈和敵機(jī)子彈相撞屬性:任選(此項(xiàng)無分)判定:飛機(jī)子彈圖片和敵機(jī)子彈圖片有重疊,即判定為相撞描述:飛機(jī)子彈和敵機(jī)子彈都消失4) BOSS● 移動(dòng)屬性:必選描述:能夠左右移動(dòng)?!?子彈屬性:必選描述:BOSS能夠發(fā)射子彈。完成下列情況的任一種即可:子彈威力更強(qiáng);發(fā)射更多子彈;子彈路線復(fù)雜;其它更有創(chuàng)意的設(shè)計(jì)?!?血條屬性:必選描述:BOSS必須有血條,每被即可即掉血。5) 界面● 開始界面和結(jié)束界面屬性:必選描述:必須有開始界面和結(jié)束界面(當(dāng)玩家勝利或失敗,要輸出一個(gè)消息“Win”或“GameOver!”)。完成下列情況的任一種即可:僅僅輸出輸贏信息;顯示一張或一些圖片;設(shè)計(jì)一些有創(chuàng)意的動(dòng)畫?!?排行榜屬性:必選描述:保存用戶自第一次玩本游戲開始到最近一次為止的6次最高分。要求:必須用數(shù)據(jù)庫做?!?設(shè)置屬性:必選描述:主要記錄是否打開音效,游戲難度,操控方式、是否自動(dòng)發(fā)射子彈等。要求:關(guān)機(jī)后再次開機(jī),部分設(shè)置的內(nèi)容還在(例如音效是否開啟),用preference做。6) 音效屬性:任選描述:在游戲過程中,有音樂效果。完成下列情況的任一種即可:● 背景音樂;● 發(fā)射子彈;● 爆炸;● BOSS發(fā)射子彈;● 玩家吃到獎(jiǎng)勵(lì);● 其它更有創(chuàng)意的設(shè)計(jì)。5.3UI界面設(shè)計(jì)游戲總共分為4個(gè)界面,分別為游戲開始界面、游戲界面、游戲設(shè)置界面、游戲排名界面;如圖5-1至5-6:圖5-1游戲開始頁面設(shè)計(jì)圖5-2游戲頁面設(shè)計(jì)圖5-3遇到boss頁面設(shè)計(jì)圖5-4排行榜頁面設(shè)計(jì)圖5-5游戲設(shè)置頁面設(shè)計(jì)圖5-6玩家記錄頁面設(shè)計(jì)5.4文件結(jié)構(gòu)與用途在程序開發(fā)階段,首先確定“飛機(jī)游戲軟件”的工程名為Surface_view,據(jù)程序模塊設(shè)計(jì)的內(nèi)容,建立Surface_view工程。Surface_view工程源代碼的結(jié)構(gòu)如圖5-7所示。為了使源代碼文件的結(jié)構(gòu)更加清晰,Surface_view工程設(shè)置了多個(gè)命名空間,分別用來保存用戶界面、數(shù)據(jù)庫和工具實(shí)體的源代碼文件,源代碼文件的名稱以及說明,如表5-1:表5-1源代碼文件的名稱以及說明包名稱文件名說明.iotek.Surfacebullet.java我方飛機(jī)子彈類.iotek.SurfaceBullet2.java敵機(jī)子彈類.iotek.SurfaceBullet3.javaboss子彈類.iotek.Surfacefirst_activity.java圖5-1開始頁面.iotek.Surfacegameover.java結(jié)束的A.iotek.Surfacehistoryscore.java排行榜的A.iotek.Surfaceplanes.java飛機(jī)的A.iotek.SurfacesetActivity.java圖5-5游戲設(shè)置.iotek.SurfaceSurface_viewActivity.java主線程的Activity圖5-7工程源代碼結(jié)構(gòu)圖5.5功能模塊圖飛機(jī)游戲主要功能劃分:從啟動(dòng)游戲應(yīng)用開始到游戲開始主界面的功能選擇選擇:游戲功能、游戲設(shè)置功能、游戲排行榜的查看以及退出游戲。圖5-8功能模塊圖6.各模塊設(shè)計(jì)游戲的主要運(yùn)用android的Surfaceview功能實(shí)現(xiàn),將背景圖片以滾軸的形式在界面勻速滾動(dòng)實(shí)現(xiàn)飛機(jī)前進(jìn)的效果,然后再將飛機(jī)和子彈畫到Surfaceview上實(shí)現(xiàn)游戲的基本功能。游戲主要模塊為一個(gè)主線程的Activity、一個(gè)子彈類、一個(gè)飛機(jī)類、游戲開始界面的Activity、游戲結(jié)束的Activity、游戲設(shè)置的Activity和游戲結(jié)束的Activity。界面設(shè)置運(yùn)用android自帶的XML畫出運(yùn)行界面可以看到的各種畫面,主要有按鈕button、列表listview,按鈕用來運(yùn)行游戲的點(diǎn)擊操作,列表用來存儲(chǔ)游戲得分的數(shù)據(jù)。各界面之間運(yùn)用Intent進(jìn)行通信,通過按鈕button來進(jìn)行各個(gè)界面的切換:Intentintent1=newIntent(gameover.this,first_activity.class);6.1XML界面布局設(shè)計(jì)6.1.1游戲開始界面設(shè)計(jì)主要運(yùn)用Button按鈕來實(shí)現(xiàn),在畫布布局上畫出4個(gè)功能按鈕,定義按鈕的屬性(height和width)并進(jìn)行按鈕功能的關(guān)聯(lián)選擇,分別給4個(gè)按鈕劃分4個(gè)id,分別為:button1、button2、button3、button4。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android" android:orientation="vertical" android:layout_height="wrap_content" android:layout_width="match_parent" android:background="@drawable/menu"> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/button1" android:text="開始游戲" /> <Button android:text="游戲排名" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:text="游戲設(shè)置" android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:text="退出游戲" android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>6.1.2游戲得分記錄界面設(shè)計(jì)主要采用了ListView功能,來實(shí)現(xiàn)用戶姓名的錄入,這里的ListView是一個(gè)單行列表框,用來存儲(chǔ)游戲記錄的用戶。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@drawable/rank"><ListView android:id="@+id/list_view" android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_weight="1" /> <Button android:id="@+id/but_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="返回"/></LinearLayout>6.1.3游戲設(shè)置界面設(shè)計(jì)主要運(yùn)用CheckBoxPreference控件來實(shí)現(xiàn)功能的選擇,這里的CheckBoxPreference是一個(gè)是否選擇按鈕,并用android:key="CheckBox1"來關(guān)聯(lián)是否選項(xiàng)。<?xmlversion="1.0"encoding="utf-8"?><PreferenceScreenxmlns:android="/apk/res/android"><PreferenceCategoryandroid:title="聲音設(shè)置"><CheckBoxPreferenceandroid:key="CheckBox1"android:title="聲音選擇"android:summaryOn="聲音:開啟"android:summaryOff="聲音:關(guān)閉"android:defaultValue="true"/></PreferenceCategory><PreferenceCategoryandroid:title="難度設(shè)置"><CheckBoxPreferenceandroid:key="CheckBox1"android:title="難度選擇"android:summaryOn="超級(jí)模式:開啟"android:summaryOff="超級(jí)模式:關(guān)閉"android:defaultValue="true"/></PreferenceCategory></PreferenceScreen>6.1.4玩家記錄界面設(shè)計(jì)采用TextView來顯示姓名欄,在用EditText來關(guān)聯(lián)數(shù)據(jù)庫存儲(chǔ)的游戲得分,并把剛剛在ListView輸入的用戶姓名關(guān)聯(lián)進(jìn)來,這里的EditText是一個(gè)單行文本框。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@drawable/over"><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="性名" /> <EditText android:id="@+id/name_txt" android:layout_width="match_parent" android:layout_height="wrap_content" /><Button android:id="@+id/but_ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="確定"/> <Button android:id="@+id/but_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="取消"/></LinearLayout>6.2游戲各功能實(shí)現(xiàn)代碼6.2.1飛機(jī)類定義自己定義的飛機(jī)類,定義了飛機(jī)的坐標(biāo)px和py,以及飛機(jī)的圖片Bitmap;然后通過nextInt(n)來控制飛機(jī)的數(shù)量,這里用的random.nextInt(3)表示1-3之間的隨機(jī)飛機(jī)架數(shù),子彈類定義參照飛機(jī)類。publicclassplanes{ privateintpx; privateintpy; privateBitmapbitmap; publicplanes(){ super(); } publicplanes(intpx,intpy,Bitmapbitmap){ super(); this.px=px; this.py=py; this.bitmap=bitmap; } publicBitmapgetBitmap(){ returnbitmap; } publicvoidsetBitmap(Bitmapbitmap){ this.bitmap=bitmap; }publicvoidplane(Canvascanvas){ Randomrandom=newRandom(); canvas.drawBitmap(bitmap,px+=random.nextInt(3),py+=random.nextInt(5),null);//控制飛機(jī)出現(xiàn)的數(shù)量}}6.2.2飛機(jī)移動(dòng)設(shè)計(jì)飛機(jī)的移動(dòng)設(shè)計(jì)采用觸屏和按鍵兩種操作方式,運(yùn)用安卓自帶的封裝類onTouchEvent(觸屏)和onKeyDown(按鍵)來實(shí)現(xiàn)。觸屏操作為手指點(diǎn)擊屏幕,則飛機(jī)直接飛到手指觸發(fā)的那一個(gè)坐標(biāo)上,按鍵操作為點(diǎn)擊上下左右,飛機(jī)以坐標(biāo)10的間距上下左右移動(dòng),整個(gè)屏幕的坐標(biāo)以像素為主,本游戲采用的是320*480.//觸屏控制 @Override publicbooleanonTouchEvent(MotionEventevent){ x=(int)event.getX(); y=(int)event.getY(); returnsuper.onTouchEvent(event); } //鍵盤的控制 @Override publicbooleanonKeyDown(intkeyCode,KeyEventevent){ switch(keyCode){ caseKeyEvent.KEYCODE_DPAD_UP: y-=10; break; …… } returnsuper.onKeyDown(keyCode,event); }6.2.3子彈的繪制運(yùn)用安卓自帶的Surfaceview功能,使用bul.add調(diào)用子彈類,add里面的函數(shù)newbullet(…)定義子彈的初始位置,把子彈一個(gè)個(gè)圖片畫在畫布上(循環(huán)滾動(dòng)的背景圖片),用2個(gè)自定義的時(shí)間參數(shù)firsttime、twotime來控制子彈發(fā)射的頻率,(參數(shù)pla1為敵機(jī),參數(shù)pla2為敵方boss)。//我方子彈的繪制 if(firsttime-twotime>800){ bul.add(newbullet(x+bmp_air.getWidth()/4,y -bmp_air.getHeight(),bmp_bullet_blue)); twotime=firsttime; }//敵機(jī)子彈的繪制 if(firsttime-fivetime>5000){ for(planesp:pla1){ bul2.add(newbullet2(p.getPx()+bmp_plane2.getWidth() /2,p.getPy()+bmp_plane2.getHeight(), bmp_bullet_red)); } for(planesp:pla2){ bul2.add(newbullet2(p.getPx()+bmp_plane2.getWidth() /2,p.getPy()+bmp_plane2.getHeight(), bmp_bullet_red)); } fivetime=firsttime; }6.2.4飛機(jī)碰撞設(shè)計(jì)碰撞設(shè)計(jì)運(yùn)用坐標(biāo)x和y來實(shí)現(xiàn),當(dāng)子彈的坐標(biāo)x、y等于飛機(jī)的坐標(biāo)x、y時(shí)觸發(fā)條件:子彈碰撞敵機(jī)時(shí),子彈消失bul.remove(n),敵機(jī)消失pla1.remove(m);子彈撞擊我方飛機(jī)時(shí),子彈消失bul2.remove(n),我方飛機(jī)血量減少(血量運(yùn)用安卓里面的Rect函數(shù),根據(jù)起始坐標(biāo)跟長度來定義矩形,先在底層畫一條紅色矩形,然后在紅色矩形上畫黃色,通過黃色長度的變化來體現(xiàn)血量的變化,每次子彈打中我方飛機(jī),黃色rect3長度-10)。//子彈打BOSS for(n=0;n<bul.size();n++){ if(Hit(bmp_boss,bul.get(n).getBx(),plane_x1,bul .get(n).getBy(),plane_y1)){ canvas.drawBitmap(bmp_bomb,plane_x1,plane_y1, null); number1--; }}//子彈打敵機(jī) for(n=0;n<bul.size();n++){ for(m=0;m<pla1.size();m++){ if(Hit(bmp_plane2,bul.get(n).getBx(),pla1.get(m) .getPx(),bul.get(n).getBy(),pla1.get(m) .getPy())){ canvas.drawBitmap(bmp_bomb,pla1.get(m).getPx(), pla1.get(m).getPy(),null); pla1.remove(m); bul.remove(n); score+=200; n--; m--; break; } } }//敵方子彈打我 if(number2>0){ //我方血條 intbloodair=(int)(screenWidth*(number2/10.0)); Rectrect1=newRect(0,screenHeigh-10,bloodair, screenHeigh); Rectrect3=newRect(0,screenHeigh-10,screenWidth, screenHeigh); canvas.drawRect(rect3,paint4); canvas.drawRect(rect1,paint1); for(n=0;n<bul2.size();n++){ if(Hit(bmp_air,bul2.get(n).getBx2(),x,bul2.get(n) .getBy2(),y)){ canvas.drawBitmap(bmp_bomb,x,y,null); bul2.remove(n); n--; number2--; //info(number2+""); } } //敵方敵機(jī)1撞我 for(m=0;m<pla1.size();m++){ if(Hit(bmp_air,pla1.get(m).getPx(),x,pla1.get(m) .getPy(),y)){ canvas.drawBitmap(bmp_bomb,x,y,null); pla1.remove(m); m--; number2-=2; break; } } //敵方敵機(jī)2撞我 for(m=0;m<pla2.size();m++){ if(Hit(bmp_air,pla2.get(m).getPx(),x,pla2.get(m) .getPy(),y)){ canvas.drawBitmap(bmp_bomb,x,y,null); pla2.remove(m); m--; number2-=4; break; } } } //BOSS子彈打我 for(m=0;m<bul3.size();m++){ if(Hit(bmp_air,bul3.get(m).getBx3(),x,bul3.get(m) .getBy3(),y)){ canvas.drawBitmap(bmp_bomb,x,y,null);

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論