Android應(yīng)用開發(fā)詳解_第1頁
Android應(yīng)用開發(fā)詳解_第2頁
Android應(yīng)用開發(fā)詳解_第3頁
Android應(yīng)用開發(fā)詳解_第4頁
Android應(yīng)用開發(fā)詳解_第5頁
已閱讀5頁,還剩717頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Android應(yīng)用開發(fā)詳解目錄\h第一篇基礎(chǔ)篇\h第1章Android概述\h1.1Android的前世今生\h1.2Android的平臺(tái)架構(gòu)及特性\h1.3AndroidMarket\h1.4Android應(yīng)用程序組件\h1.5Android與JavaME的區(qū)別與聯(lián)系\h第2章Android開發(fā)基礎(chǔ)\h2.1Android開發(fā)環(huán)境的搭建\h2.2Android常用工具的使用\h2.3我的第一個(gè)Android應(yīng)用\h第二篇技術(shù)篇\h第3章Android中的資源訪問\h3.1資源簡介\h3.2使用顏色(color)資源\h3.3使用字符串(string)資源\h3.4使用尺寸(dimen)資源\h3.5使用原始XML資源\h3.6使用drawables資源\h3.7使用布局(layout)資源\h3.8使用菜單(menu)資源\h第4章Android用戶界面\h4.1菜單\h4.2對(duì)話框\h4.3提示信息(Toast)\h4.4事件處理\h4.5布局管理(Layout)\h4.6組件(Widget)\h第5章Android基本程序單元Activity\h5.1何謂回調(diào)\h5.2Activity簡介\h5.3Activity的生命周期\h第6章Android組件之間的信使Intent\h6.1Intent對(duì)象及其屬性\h6.2系統(tǒng)標(biāo)準(zhǔn)ActivityAction應(yīng)用\h6.3Intent的實(shí)現(xiàn)策略\h第7章AndroidService組件\h7.1Service簡介\h7.2遠(yuǎn)程Service調(diào)用\h第8章Android廣播事件處理BroadcastReceiver\h8.1自己定義BroadcastReceiver來處理廣播事件\h8.2系統(tǒng)廣播事件的使用\h8.3Notification和NotificationManager的使用\h8.4AlarmManager的使用\h第9章Android中的數(shù)據(jù)存取\h9.1Preference\h9.2File\h9.3SQLite\h第10章ContentProvider\h10.1ContentProvider簡介\h10.2自定義ContentProvider\h第11章Android中的多媒體應(yīng)用\h11.1音頻及視頻播放\h11.2迷你音樂播放器\h11.3迷你視頻播放器\h11.4音視頻的錄制\h11.5Camera照相\h第12章Android中的圖形圖像\h12.1在Android中訪問圖片\h12.2Android中的動(dòng)畫\h12.3動(dòng)態(tài)圖形繪制\h12.4圖形特效\h第13章Android中的互聯(lián)網(wǎng)應(yīng)用\h13.1通過Socket、ServerSocket進(jìn)行網(wǎng)絡(luò)編程\h13.2通過URL進(jìn)行網(wǎng)絡(luò)編程\h13.3通過HTTP進(jìn)行網(wǎng)絡(luò)編程\h13.4通過WebService進(jìn)行網(wǎng)絡(luò)編程\h13.5直接使用WebView視圖組件顯示網(wǎng)頁\h第14章Android中的GPS應(yīng)用\h14.1LocationManager和LocationProvider簡介\h14.2通過模擬器測(cè)試位置服務(wù)\h14.3獲得LocationProvider\h14.4定位和跟蹤\h14.5趨近警告\h14.6Geocoder正逆向編解碼\h第三篇應(yīng)用篇\h第15章Android應(yīng)用案例——移動(dòng)警務(wù)通\h15.1移動(dòng)警務(wù)通需求分析\h15.2移動(dòng)警務(wù)通總體設(shè)計(jì)\h15.3移動(dòng)警務(wù)通詳細(xì)設(shè)計(jì)\h15.4系統(tǒng)編碼實(shí)現(xiàn)\h第16章Android應(yīng)用案例——雷電游戲\h16.1Android游戲開發(fā)基本框架\h16.2將JavaME游戲API嫁接到Android\h16.3Android版雷電游戲的實(shí)現(xiàn)\h第17章Android應(yīng)用案例——備忘錄\h17.1備忘錄數(shù)據(jù)存儲(chǔ)實(shí)現(xiàn)\h17.2備忘錄列表展示\h17.3備忘錄維護(hù)\h17.4備忘錄定時(shí)提醒\h第18章Android應(yīng)用案例——無線點(diǎn)餐系統(tǒng)\h18.1無線點(diǎn)餐系統(tǒng)需求分析\h18.2無線點(diǎn)餐系統(tǒng)概要設(shè)計(jì)\h18.3無線點(diǎn)餐系統(tǒng)詳細(xì)設(shè)計(jì)\h18.4系統(tǒng)編碼實(shí)現(xiàn)\h附錄CD頁第一篇基礎(chǔ)篇第1章Android概述第2章Android開發(fā)基礎(chǔ)第1章Android概述時(shí)勢(shì)造英雄,PC時(shí)代微軟憑借Windows操作系統(tǒng)造就了微軟帝國,互聯(lián)網(wǎng)時(shí)代Google憑借搜索引擎造就了Google帝國。那么,移動(dòng)互聯(lián)網(wǎng)時(shí)代來臨,誰將是真正的英雄呢?這個(gè)我們很難定論,但是一個(gè)不確定的答案就是,掌握移動(dòng)互聯(lián)網(wǎng)技術(shù)的人將是這個(gè)時(shí)代的弄潮兒,將成為這一時(shí)代真正的英雄。這里我們思考一下,為什么能產(chǎn)生了兩個(gè)帝國,而不是一個(gè)帝國呢?設(shè)想如果微軟既掌握了操作系統(tǒng)技術(shù)又掌握了搜索引擎技術(shù),那么微軟將成為唯一帝國;如果Google既掌握了操作系統(tǒng)技術(shù)又掌握了搜索引擎技術(shù),那么Google將成為唯一帝國。就是因?yàn)樗麄兏饔兴L,所以兩個(gè)帝國才能并存。俗話說,一山不能容二虎,二者都有壟斷唯一霸主地位的野心。在這個(gè)移動(dòng)互聯(lián)網(wǎng)時(shí)代,Google歷經(jīng)數(shù)年,耗資數(shù)億,研發(fā)了手機(jī)系統(tǒng)Android。其實(shí)Android不光是一個(gè)手機(jī)操作系統(tǒng),它可以延伸到各種移動(dòng)設(shè)備和PC。有了自己的互聯(lián)網(wǎng)技術(shù)和自己的操作系統(tǒng),也就有了自己唯一的霸主地位。這就是Google的野心吧!Android一經(jīng)推出,受到了業(yè)界前所未有的熱捧。全世界的Android社區(qū)熱火朝天,開發(fā)人員癡迷學(xué)習(xí),手機(jī)設(shè)備廠商不斷推出Android系統(tǒng)的手機(jī),為什么會(huì)有這樣的效果呢?可以用一句話來概括:“博采眾長,為它所用。”Android采用了開源的Linux操作系統(tǒng),底層使用了訪問硬件速度最快的C語言,應(yīng)用層采用了簡單而強(qiáng)大的Java語言,這使得Android無處不閃爍著耀眼的光芒。Android實(shí)現(xiàn)了全部開源,這為Android的使用提供了無限可能。硬件廠商可以在原有基礎(chǔ)上,根據(jù)自己的需求擴(kuò)展或裁剪現(xiàn)有功能,軟件開發(fā)人員可以開發(fā)出更優(yōu)秀的軟件替換現(xiàn)有軟件。我們都知道,之前的手機(jī)市場(chǎng)為少數(shù)實(shí)力雄厚的公司所壟斷,Android的推出將使得這個(gè)市場(chǎng)重新“洗牌”。王者歸來,個(gè)人英雄主義又將重現(xiàn)。你可以開一家公司提供定制的Android系統(tǒng),也可以開一家公司開發(fā)Android應(yīng)用軟件、游戲在AndroidMarket上出售。本章我們將學(xué)習(xí)如下內(nèi)容:·Android的前世今生·Android的平臺(tái)架構(gòu)及特性·AndroidMarket·Android應(yīng)用程序組件·Android與JavaME的區(qū)別與聯(lián)系1.1Android的前世今生Android是“機(jī)器人”的意思,是Google公司于2007年11月5日發(fā)布的一個(gè)基于Linux平臺(tái)的開源手機(jī)操作系統(tǒng)。該系統(tǒng)由底層的Linux操作系統(tǒng)、中間件和核心應(yīng)用程序組成。Android應(yīng)用程序由強(qiáng)大的Java語言來編寫,也支持其他一些語言如C、Perl等。1.1.1Android的產(chǎn)生Android一開始并不是Google自己研發(fā)的產(chǎn)品,而是收購了一家剛剛創(chuàng)業(yè)22個(gè)月的公司的產(chǎn)品,該公司的創(chuàng)始人是AndyRubin(如圖1.1所示),也就是現(xiàn)在GoogleAndroid產(chǎn)品負(fù)責(zé)人羅賓。Google收購Android沒有向媒體透露任何消息,可以說是悄悄進(jìn)行的。羅賓拒絕對(duì)Android公司或出售給Google發(fā)表評(píng)論。Google的一名發(fā)言人也拒絕就這一交易發(fā)表評(píng)論,只是指出“我們收購Android公司的原因是,它有天才的工程師和了不起的技術(shù),我們對(duì)他們的加盟感到由衷的高興”。圖1.1Android發(fā)明者AndyRubinGoogle于2007年11月5日發(fā)布了Android1.0手機(jī)操作系統(tǒng),號(hào)稱是首個(gè)為移動(dòng)終端打造的真正開放和完整的移動(dòng)軟件,后經(jīng)版本不斷更新,到筆者成書時(shí)的最新版本是Android2.1。同日,Google宣布組建了一個(gè)全球性的聯(lián)盟組織。這一聯(lián)盟將會(huì)支持Google可能發(fā)布的手機(jī)操作系統(tǒng)或者應(yīng)用軟件,共同開發(fā)名為Android的開放源代碼的移動(dòng)系統(tǒng)。開放手機(jī)聯(lián)盟包括手機(jī)制造商、手機(jī)芯片廠商和移動(dòng)運(yùn)營商幾類。目前,聯(lián)盟成員數(shù)量已經(jīng)達(dá)到了34家。移動(dòng)運(yùn)營商包括中國移動(dòng)、中國電信、中國聯(lián)通、美國SprintNextel、德國T-Mobile等;半導(dǎo)體制造商包括ARM、英特爾、高通等;電話制造商包括摩托羅拉、三星、華碩、華為、宏達(dá)電子等。1.1.2Android的發(fā)展Android軟件經(jīng)推出之后,版本升級(jí)非???,幾乎每隔半年就有一個(gè)新的版本發(fā)布。版本先后經(jīng)歷了1.0、1.1、1.5、1.6,目前的最新版本是Android2.1。2008年9月22日,美國運(yùn)營商T-MobileUSA在紐約正式發(fā)布第一款Google手機(jī)——T-MobileG1,如圖1.2所示。該款手機(jī)為中國臺(tái)灣宏達(dá)電代工制造,是世界上第一部使用Android操作系統(tǒng)的手機(jī),支持WCDMA/HSPA網(wǎng)絡(luò),理論下載速率為7.2Mbps,并支持Wi-Fi。圖1.2第一款A(yù)ndroid手機(jī)T-MobileG1隨后,各大手機(jī)廠商紛紛發(fā)布基于Android操作系統(tǒng)的手機(jī),包括摩托羅拉、宏達(dá)電、三星、聯(lián)想、華為等。如圖1.3所示是摩托羅拉Android2.0觸屏Droid手機(jī),Droid采用了基于ARMCortex-A8的TIOMAP3430處理器,其速度不遜色于當(dāng)前的任何一款A(yù)ndroid手機(jī)。它采用3.7英寸FWVGA觸控屏,480×854像素,支持多點(diǎn)觸控操作,配置包括500萬像素?cái)z像頭,支持A-GPS、WiFi、256MBRAM、512MBROM,可擴(kuò)展16GB存儲(chǔ)卡。圖1.3摩托羅拉Android2.0觸屏Droid手機(jī)2010年1月6日Google推出其自主研發(fā)手機(jī)NexusOne(如圖1.4所示),Google終于跳入智能型手機(jī)直接銷售的殺戮戰(zhàn)場(chǎng)。NexusOne由HTC量身打造,使用了最新版本的Android2.1操作系統(tǒng)。圖1.4Google自主研發(fā)的手機(jī)NexusOneNexusOne擁有3.7英寸液晶顯示屏,使用高通公司Qualcomm的1千兆赫芯片,是當(dāng)今市場(chǎng)上運(yùn)行速度最快的芯片。除此之外,這款手機(jī)擁有清晰的色點(diǎn)、傳感電池技術(shù)、指南針、GPS、加速計(jì),以及屏幕光敏電池管理,而且它非常輕巧,只有11.5毫米厚,130克重。NexusOne擁有500萬像素的相機(jī)和LEDflash,可以拍攝照片和錄制視頻。輕松一點(diǎn)就可以上傳到Y(jié)ouTube。配有3.5毫米耳機(jī)插口和實(shí)時(shí)噪聲消除功能,兩個(gè)話筒,前后各一個(gè),非常酷!音質(zhì)一流,環(huán)繞手機(jī)的金屬邊框還可供用戶按個(gè)人喜好替換。該款手機(jī)無論是從功能還是外觀上都可以和現(xiàn)在最為流行的iPhone有一拼了。1.2Android的平臺(tái)架構(gòu)及特性Android平臺(tái)采用了整合的策略思想,包括底層Linux操作系統(tǒng)、中間層的中間件和上層的Java應(yīng)用程序。本小節(jié)我們將詳細(xì)講解有關(guān)Android的特性及其架構(gòu)體系結(jié)構(gòu)。1.2.1Android平臺(tái)特性Android平臺(tái)有如下特性:·應(yīng)用程序框架支持組件的重用與替換。這在之前的手機(jī)操作系統(tǒng)當(dāng)中是很難想象的。這意味著我們可以把系統(tǒng)中不喜歡的應(yīng)用程序替換掉,安裝我們自己喜歡的應(yīng)用程序,例如,打電話應(yīng)用程序、文件管理器等?!alvik虛擬機(jī)專門為移動(dòng)設(shè)備做了優(yōu)化。Android應(yīng)用程序?qū)⒂蒍ava編寫、編譯的類文件通過DX工具轉(zhuǎn)換成一種后綴名為.dex的文件來執(zhí)行。Dalvik虛擬機(jī)是基于寄存器的,相對(duì)于Java虛擬機(jī)速度要快很多?!?nèi)部集成瀏覽器基于開源的WebKit引擎。有了內(nèi)置的瀏覽器,這將意味著WAP應(yīng)用的時(shí)代即將結(jié)束,真正的移動(dòng)互聯(lián)網(wǎng)時(shí)代已經(jīng)來臨,手機(jī)就是一臺(tái)“小電腦”,可以在網(wǎng)上隨意遨游。·優(yōu)化的圖形庫包括2D和3D圖形庫,3D圖形庫基于OpenGLES1.0。強(qiáng)大的圖形庫給游戲開發(fā)帶來福音。在我看來3G最為重要的應(yīng)用莫過于手機(jī)上網(wǎng)和手機(jī)游戲了?!QLite用作結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)?!ざ嗝襟w支持包括常見的音頻、視頻和靜態(tài)印象文件格式(如MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF)?!SM電話(依賴于硬件)。·藍(lán)牙(Bluetooth)、EDGE、3G、WiFi(依賴于硬件)。·照相機(jī)、GPS、指南針和加速度計(jì)(依賴于硬件)?!へS富的開發(fā)環(huán)境包括設(shè)備模擬器、調(diào)試工具、內(nèi)存及性能分析圖表和Eclipse集成開發(fā)環(huán)境插件。Google提供了Android開發(fā)包SDK,其中包含了大量的類庫和開發(fā)工具。并且專門開發(fā)了針對(duì)Eclipse的可視化開發(fā)插件ADT,這部分內(nèi)容將在后續(xù)章節(jié)詳細(xì)講述。1.2.2Android平臺(tái)架構(gòu)如圖1.5所示的是Android操作系統(tǒng)的體系結(jié)構(gòu)。每一部分將會(huì)在下面具體描述。圖1.5Android操行系統(tǒng)的體系結(jié)構(gòu)從圖1.5中我們可以看出Android操作系統(tǒng)體系結(jié)構(gòu)分為4層,由上而下依次是應(yīng)用程序、應(yīng)用程序框架、核心類庫和Linux內(nèi)核。其中在第三層還包括Android運(yùn)行時(shí)環(huán)境。下面分別來講解各個(gè)部分。1.應(yīng)用程序Android連同一個(gè)核心應(yīng)用程序包一起發(fā)布,該應(yīng)用程序包包括E-mail客戶端、SMS短消息程序、日歷、地圖、瀏覽器、聯(lián)系人管理程序等。所有的應(yīng)用程序都是用Java編寫的。2.應(yīng)用程序框架開發(fā)者完全可以訪問核心應(yīng)用程序所使用的API框架。該應(yīng)用程序架構(gòu)用來簡化組件軟件的重用,任何一個(gè)應(yīng)用程序都可以發(fā)布它的功能塊并且任何其他的應(yīng)用程序都可以使用其所發(fā)布的功能塊(不過得遵循框架的安全性限制)。該應(yīng)用程序重用機(jī)制使得組件可以被用戶替換。以下所有的應(yīng)用程序都由一系列的服務(wù)和系統(tǒng)組成,包括:1)一個(gè)可擴(kuò)展的視圖(Views)可以用來創(chuàng)建應(yīng)用程序,包括列表(lists)、網(wǎng)格(grids)、文本框(textboxes)、按鈕(buttons),甚至是一個(gè)可嵌入的Web瀏覽器。2)內(nèi)容管理器(ContentProviders)使得應(yīng)用程序可以訪問另一個(gè)應(yīng)用程序的數(shù)據(jù)(如聯(lián)系人數(shù)據(jù)庫),或者共享它們自己的數(shù)據(jù)。3)一個(gè)資源管理器(ResourceManager)提供非代碼資源的訪問,如本地字符串、圖形和分層文件(layoutfiles)。4)一個(gè)通知管理器(NotificationManager)使得應(yīng)用程序可以在狀態(tài)欄中顯示客戶通知信息。5)一個(gè)活動(dòng)類管理器(ActivityManager)用來管理應(yīng)用程序生命周期并提供常用的導(dǎo)航回退功能。3.Android程序庫Android包括一個(gè)被Android系統(tǒng)中各種不同組件所使用的C/C++庫集。該庫通過Android應(yīng)用程序框架為開發(fā)者提供服務(wù)。以下是一些主要的核心庫。1)系統(tǒng)C庫:一個(gè)從BSD繼承來的標(biāo)準(zhǔn)C系統(tǒng)函數(shù)庫(libc),專門為基于EmbeddedLinux的設(shè)備定制。2)媒體庫:基于PacketVideoOpenCORE;該庫支持錄放,并且可以錄制許多流行的音頻視頻格式,還有靜態(tài)映像文件包括MPEG4、H.264、MP3、AAC、AMR、JPG、PNG。3)SurfaceManager:對(duì)顯示子系統(tǒng)的管理,并且為多個(gè)應(yīng)用程序提供2D和3D圖層的無縫融合。4)LibWebCore:一個(gè)最新的Web瀏覽器引擎,用來支持Android瀏覽器和一個(gè)可嵌入的Web視圖。5)SGL:一個(gè)內(nèi)置的2D圖形引擎。6)3Dlibraries:基于OpenGLES1.0APIs實(shí)現(xiàn);該庫可以使用硬件3D加速(如果可用)或者使用高度優(yōu)化的3D軟加速。7)FreeType:位圖(bitmap)和向量(vector)字體顯示。8)SQLite:一個(gè)對(duì)于所有應(yīng)用程序可用、功能強(qiáng)勁的輕型關(guān)系型數(shù)據(jù)庫引擎。4.Android運(yùn)行庫Android包括了一個(gè)核心庫,該核心庫提供了Java編程語言核心庫的大多數(shù)功能。每一個(gè)Android應(yīng)用程序都在它自己的進(jìn)程中運(yùn)行,都擁有一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例。Dalvik是針對(duì)同時(shí)高效地運(yùn)行多個(gè)VMs來實(shí)現(xiàn)的。Dalvik虛擬機(jī)執(zhí)行.dex的Dalvik可執(zhí)行文件,該格式文件針對(duì)最小內(nèi)存使用做了優(yōu)化。該虛擬機(jī)是基于寄存器的,所有的類都經(jīng)由Java匯編器編譯,然后通過SDK中的DX工具轉(zhuǎn)化成.dex格式由虛擬機(jī)執(zhí)行。Dalvik虛擬機(jī)依賴于Linux的一些功能,比如線程機(jī)制和底層內(nèi)存管理機(jī)制。5.Linux內(nèi)核Android的核心系統(tǒng)服務(wù)依賴于Linux2.6內(nèi)核,如安全性、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)協(xié)議棧和驅(qū)動(dòng)模型。Linux內(nèi)核也同時(shí)作為硬件和軟件堆棧之間的硬件抽象層。1.3AndroidMarket2008年8月28日,Google宣布推出AndroidMarket(如圖1.6所示)。AndroidMarket運(yùn)行用戶瀏覽、下載使用由第三方開發(fā)商為Android開發(fā)的應(yīng)用程序。用戶可以購買或免費(fèi)使用這些應(yīng)用程序,這些應(yīng)用程序可以直接下載到Android手機(jī)中。AndroidMarket的網(wǎng)址是/market/。用戶可以在這里找到很多需要的Android應(yīng)用程序。圖1.6AndroidMarket我們可以開發(fā)自己的Android應(yīng)用程序并發(fā)布到AndroidMarket,不過在發(fā)布自己的應(yīng)用程序之前,需要申請(qǐng)一個(gè)Market賬戶。申請(qǐng)一個(gè)Market賬戶,需要填寫如圖1.7所示的基本信息并繳納25美元服務(wù)費(fèi),因此需要一張國際信用卡,可以是VISA或Master。申請(qǐng)網(wǎng)址是/publish/signup。圖1.7AndroidMarket賬戶申請(qǐng)有了一個(gè)Market賬戶,我們就可以開發(fā)自己的Android應(yīng)用程序并在AndroidMarket上賺錢了。這也成了Android開發(fā)人員除了上班賺錢的另外一條致富途徑了。1.4Android應(yīng)用程序組件如果你想從事Android應(yīng)用程序開發(fā),那么了解Android應(yīng)用程序的思想是非常必要的。Android應(yīng)用程序沒有統(tǒng)一的入口(例如main()方法),各個(gè)應(yīng)用之間是相互獨(dú)立的,并且運(yùn)行在自己的進(jìn)程當(dāng)中。根據(jù)完成的功能不同,Android劃分了四類核心的組件類:Activity、Service、BroadcastReceiver和ContentProvider。相同組件和不同組件之間的導(dǎo)航通過Intent來完成。Android還定義了View類來顯示可視化界面,例如菜單、對(duì)話框、下拉列表等。本小節(jié)將詳細(xì)講述各個(gè)組件的意義和用法。1.4.1ActivityActivity是Android組件中最基本也是最為常用的一種組件,在一個(gè)Android應(yīng)用中,一個(gè)Activity通常就是一個(gè)單獨(dú)的屏幕。每一個(gè)Activity都被實(shí)現(xiàn)為一個(gè)獨(dú)立的類,并且繼承于Activity這個(gè)基類。這個(gè)Activity類將會(huì)顯示由幾個(gè)Views控件組成的用戶接口,并對(duì)事件做出響應(yīng)。大部分的應(yīng)用都會(huì)包含多個(gè)屏幕。例如,一個(gè)短消息應(yīng)用程序?qū)?huì)有一個(gè)屏幕用于顯示聯(lián)系人列表,第二個(gè)屏幕用于寫短消息,同時(shí)還會(huì)有用于瀏覽舊短消息及進(jìn)行系統(tǒng)設(shè)置的屏幕。每一個(gè)這樣的屏幕就是一個(gè)Activity。通過調(diào)用startActivity()方法可以從一個(gè)屏幕導(dǎo)航到另一個(gè)屏幕,打開Activity的條件被封裝在Intent中。當(dāng)一個(gè)新的屏幕打開后,前一個(gè)屏幕將會(huì)暫停,并保存在歷史堆棧中。用戶可以返回到歷史堆棧中的前一個(gè)屏幕。當(dāng)屏幕不再使用時(shí),還可以從歷史堆棧中刪除。默認(rèn)情況下,Android將會(huì)保留從主屏幕到每一個(gè)應(yīng)用的運(yùn)行屏幕。1.4.2Service一個(gè)Service是一種長生命周期的、沒有用戶界面的程序。比較好的一個(gè)例子就是正在從播放列表中播放歌曲的媒體播放器。在一個(gè)媒體播放器的應(yīng)用中,應(yīng)該會(huì)有多個(gè)Activity,讓使用者可以選擇歌曲并播放歌曲。然而,音樂重放這個(gè)功能并沒有對(duì)應(yīng)的Activity,因?yàn)槭褂谜邥?huì)認(rèn)為在導(dǎo)航到其他屏幕時(shí)音樂應(yīng)該還在播放。在這個(gè)例子中,媒體播放器這個(gè)Activity會(huì)使用Context.startService()來啟動(dòng)一個(gè)Service,從而可以在后臺(tái)保持音樂的播放。同時(shí),系統(tǒng)也將保持這個(gè)Service一直執(zhí)行,直到這個(gè)Service運(yùn)行結(jié)束。另外,我們還可以通過使用Context.bindService()方法連接到一個(gè)Service上(如果這個(gè)Service還沒有運(yùn)行則將啟動(dòng)它)。當(dāng)連接到一個(gè)Service之后,我們還可以通過Service提供的接口與它進(jìn)行通信。拿媒體播放器這個(gè)例子來說,我們還可以進(jìn)行暫停、重播等操作。1.4.3BroadcastReceiverBroadcastReceiver是為了實(shí)現(xiàn)系統(tǒng)廣播而提供的一種組件。例如,我們可以發(fā)出一種廣播來檢測(cè)手機(jī)電量的變化,這時(shí)候就可以定義一個(gè)BroadcastReceiver來接收廣播,當(dāng)手機(jī)電量較低時(shí)提示用戶。1.4.4ContentProvider在前面的學(xué)習(xí)中,我們知道Android應(yīng)用程序之間是相互獨(dú)立的,各個(gè)組件運(yùn)行在不同的進(jìn)程當(dāng)中,這就意味著數(shù)據(jù)是不能共享的。如何使得不同組件數(shù)據(jù)的共享呢?Android通過使用ContentProvider來實(shí)現(xiàn)不同組件之間數(shù)據(jù)的共享。1.4.5ViewView是Android中圖形用戶界面的基類,提供了可視化界面的展示。Android的圖形界面展示可以分為三層:底層是Activity;Activity上面是Window;Window上面是Views。View又可以分為View和ViewGroup。View是指基本的控件,例如按鈕、單選框、多選框、菜單等;ViewGroup是指布局控件,即用來控制界面中的控件如何布局?jǐn)[放的。1.4.6IntentIntent是不同組件之間相互導(dǎo)航的紐帶,封裝了不同組件之間導(dǎo)航查找的條件。在Intent的描述結(jié)構(gòu)中,有兩個(gè)最重要的部分:動(dòng)作和動(dòng)作對(duì)應(yīng)的數(shù)據(jù)。典型的動(dòng)作類型有MAIN(Activity的門戶)、VIEW、PICK、EDIT等。而動(dòng)作對(duì)應(yīng)的數(shù)據(jù)則以URI的形式進(jìn)行表示。例如,要查看一個(gè)人的聯(lián)系方式,你需要?jiǎng)?chuàng)建一個(gè)動(dòng)作類型為VIEW的Intent,以及一個(gè)表示這個(gè)人的URI。1.5Android與JavaME的區(qū)別與聯(lián)系本書是講解Android應(yīng)用程序開發(fā)的書籍,有一定JavaME開發(fā)經(jīng)驗(yàn)的讀者,自然會(huì)想到JavaME也是做手機(jī)應(yīng)用的,二者到底有何區(qū)別與聯(lián)系,本節(jié)將對(duì)這一問題做詳細(xì)講解。1.5.1二者的區(qū)別概括地講,Android與JavaME的區(qū)別在于,Android是一個(gè)完整的移動(dòng)設(shè)備操作系統(tǒng)平臺(tái),由Linux操作系統(tǒng)、中間件、C類庫和核心應(yīng)用程序組成,而JavaME只是Java的一個(gè)微型版本,針對(duì)移動(dòng)設(shè)備來開發(fā)應(yīng)用程序的開發(fā)包,它必須有底層操作系統(tǒng)的支持,如Symbian、WinCE等。1.5.2二者的聯(lián)系A(chǔ)ndroid和JavaME聯(lián)系并不大,如果非要說一說它們的聯(lián)系的話,應(yīng)該在應(yīng)用程序的編程語言上。Android應(yīng)用程序和JavaME都是Java編程語言。有過Java編程經(jīng)驗(yàn)的讀者可以輕松學(xué)習(xí)JavaME和Android應(yīng)用程序的開發(fā)。筆者在本書的第16章中,詳細(xì)介紹了如何將JavaME中的游戲API移植到Android中。1.5.3各自的優(yōu)勢(shì)我們可以把Android、Symbian和WinCE放在一起來比較各自的優(yōu)缺點(diǎn),但是,我們很難講Android與JavaME誰好誰壞,因?yàn)椋鼈兊某霭l(fā)點(diǎn)和應(yīng)用場(chǎng)合不一樣。Android的優(yōu)勢(shì)在于它的開放性、開源等優(yōu)勢(shì),是一個(gè)優(yōu)秀的移動(dòng)設(shè)備操作系統(tǒng)。JavaME是一個(gè)移動(dòng)設(shè)備開發(fā)軟件包,跨平臺(tái)性是它最主要的特點(diǎn)。有人預(yù)言Android的出現(xiàn)將導(dǎo)致JavaME的死亡,筆者并不認(rèn)同這種看法,Symbian、WinCE等其他手機(jī)操作系統(tǒng)存在一天,JavaME的應(yīng)用就不會(huì)減少,甚至我們可以在Android中開發(fā)JavaME應(yīng)用,二者并不沖突。第2章Android開發(fā)基礎(chǔ)“工欲善其事,必先利其器”,要想高效、快速地開發(fā)Android應(yīng)用程序,好的開發(fā)工具和開發(fā)環(huán)境是必不可少的。在AndroidSDK中提供了一系列工具,它們有模擬硬件設(shè)備的Emulator(模擬器)、AndroidAssetPackagingTool(AAPT)Android資源打包工具、DalvikDebugMonitorService(DDMS)Dalvik調(diào)試監(jiān)視服務(wù)、AndroidDebugBridge(adb)Android調(diào)試橋和將.class字節(jié)碼文件轉(zhuǎn)換為.dex文件的DX工具等。上述的這些工具我們可以直接在DOS命令行中調(diào)用,可以進(jìn)行開發(fā)、調(diào)試、編譯、打包、部署等工作,但是這種開發(fā)效率太低了。Android提供了針對(duì)Eclipse的開發(fā)插件AndroidDevelopmentTools(ADT,Android開發(fā)工具)。有了ADT我們可以在Eclipse開發(fā)環(huán)境中快速創(chuàng)建Android應(yīng)用程序,自動(dòng)生成一些代碼。調(diào)用AndroidSDK中的工具(如DDMS進(jìn)行調(diào)試、調(diào)用AAPT打包等)可以可視化地在布局文件中添加、刪除視圖組件,極大提高了開發(fā)效率。ADT必須有Eclipse和AndroidSDK的支持,而Eclipse必須有JDK的支持。安裝環(huán)境的配置是這樣的:下載AndroidSDK、下載安裝JDK、下載Eclipse、下載安裝ADT。本章我們將講述Android開發(fā)環(huán)境的搭建、AndroidSDK中的常用命令的使用以及如何手工和使用Eclipse開發(fā)一個(gè)簡單的Android應(yīng)用。2.1Android開發(fā)環(huán)境的搭建Android應(yīng)用程序使用Java語言編寫,使用Java語言必須有JDK,所以我們需要下載和安裝JDK。針對(duì)Java語言的集成開發(fā)環(huán)境有很多,如早期的JBuilder、Sun公司的NetBeans,當(dāng)然使用最為廣泛的是IBM公司開發(fā)的Eclipse平臺(tái),本節(jié)將介紹如何搭建Eclipse的Android開發(fā)環(huán)境。2.1.1下載AndroidSDKAndroidSDK的官方下載網(wǎng)站是./sdk/index.html。在Android1.5之前Google提供了AndroidSDK開發(fā)包的完整下載,在AndroidSDK1.6之后Google只提供了安裝工具在線安裝。AndroidSDK的下載鏈接如圖2.1所示。圖2.1AndroidSDK下載鏈接我們這里以Windows操作系統(tǒng)為例來講述如何安裝配置Android開發(fā)環(huán)境。如圖2.1所示,單擊“android-sdk_r04-windows.zip”鏈接進(jìn)行SDK下載,下載該文件后解壓該文件到操作系統(tǒng)的任意目錄下。打開該目錄內(nèi)容如表2.1所示。表2.1AndroidSDK下載包說明下載完成后,打開目錄找到SDKSetup.exe可執(zhí)行文件,雙擊執(zhí)行該文件,運(yùn)行界面如圖2.2所示。圖2.2AndroidSDK在線安裝界面1如圖2.2所示,左側(cè)列表的第一項(xiàng)可以創(chuàng)建AVD;第二項(xiàng)顯示已經(jīng)安裝的包;第三項(xiàng)顯示可以安裝的包;第四項(xiàng)是設(shè)置選項(xiàng);第五項(xiàng)是說明選項(xiàng)。如果讀者是第一次安裝,那么我們選擇AvailablePackages,右側(cè)列表顯示可以安裝的不同版本的軟包。這里列表的內(nèi)容有SDK開發(fā)文檔、不同版本的SDK和GoogleAPI。選擇你要安裝的SDK版本和GoogleAPI版本和文檔,界面如圖2.3所示。圖2.3AndroidSDK在線安裝界面2我們選擇了要安裝的軟件包之后,單擊“InstallSelected”按鈕彈出確認(rèn)對(duì)話框,如圖2.4所示。圖2.4AndroidSDK在線安裝界面3選擇“AcceptAll”單選按鈕,再單擊“InstallAccepted”按鈕就可以進(jìn)行在線安裝了。這里需要注意的是,如果你的“AvailablePackages”右側(cè)的地址不能打開,請(qǐng)選擇左側(cè)列表的“Settings”選項(xiàng),在右側(cè)的設(shè)置中勾選“Forehttps://...”。設(shè)置界面如圖2.5所示。圖2.5AndroidSDK在線安裝界面4安裝結(jié)束后的目錄結(jié)構(gòu)如圖2.6所示。圖2.6AndroidSDK在線安裝界面5GoogleAPI在add-ons目錄中,文檔在docs目錄中,不同版本的SDK在platforms目錄中,tools目錄是Android的工具文件,usb_drivers是USB驅(qū)動(dòng)。2.1.2下載安裝JDK在下載了AndroidSDK之后,要想進(jìn)行開發(fā)還需要下載安裝Java的開發(fā)環(huán)境,因?yàn)锳ndroidSDK的應(yīng)用層使用Java語言,所以需要Java開發(fā)環(huán)境。有過Java開發(fā)經(jīng)驗(yàn)的讀者,對(duì)JDK的配置應(yīng)該并不陌生。下面將介紹JDK的下載和安裝。下載JDK。AndroidSDK需要JDK5以上的版本。JDK6的下載地址是/javase/downloads/widget/jdk6.jsp。安裝JDK。下載完成之后就可以進(jìn)行JDK的安裝,JDK安裝包是一個(gè)可執(zhí)行文件,雙擊執(zhí)行就可以了,這里不再贅述。配置Java環(huán)境變量。為了使用Java工具進(jìn)行編譯、運(yùn)行,Java程序需要配置Java路徑Path和classpath。配置JavaHome。復(fù)制Java的安裝路徑,右鍵單擊“我的電腦”→“屬性”→“高級(jí)”→“環(huán)境變量”中新建環(huán)境變量java_home,變量值為Java安裝路徑。配置過程如圖2.7所示。圖2.7配置JavaHome配置Path。為了能夠使用Java的編譯、運(yùn)行等命令工具,需要配置這些命令的Path。右鍵單擊“我的電腦”→“屬性”→“高級(jí)”→“環(huán)境變量”,在“系統(tǒng)環(huán)境變量”中編輯Path變量,添加Java的bin目錄到其中。變量中間使用分號(hào)“;”分隔。配置過程如圖2.8所示。圖2.8配置Path配置classpath。為了能夠成功運(yùn)行Java類,需要配置Java的類路徑classpath。右鍵單擊“我的電腦”→“屬性”→“高級(jí)”→“環(huán)境變量”,在“系統(tǒng)環(huán)境變量”中新建一個(gè)系統(tǒng)變量名稱為“classpath”,變量值為半角句號(hào)“.”。配置過程如圖2.9所示。圖2.9配置classpath2.1.3下載EclipseGoogle提供Android的集成開發(fā)環(huán)境Eclipse的開發(fā)插件AndroidDevelopmentTools(ADT),為了使用該插件,首先需要下載并安裝Eclipse。ADT插件要求Eclipse的版本是3.3以上,Eclipse的下載網(wǎng)址是/downloads/。下載后解壓可以直接使用Eclipse,其運(yùn)行界面如圖2.10所示。圖2.10Eclipse運(yùn)行界面2.1.4下載安裝ADTGoogle公司提供了針對(duì)Eclipse的Android開發(fā)插件ADT。通過ADT可以進(jìn)行集成開發(fā),包括代碼的自動(dòng)生成、調(diào)試、編譯、打包、拖曳式界面生成等功能。ADT的配置過程有兩種:一種是通過Eclipse在線更新;另一種是下載ADT插件包手動(dòng)配置。下面將分別介紹這兩種配置過程。1.通過Eclipse在線更新啟動(dòng)Eclipse,選擇“Help”→“InstallNewSoftware…”,彈出如圖2.11所示的對(duì)話框。圖2.11安裝ADT單擊“Add…”按鈕,添加一個(gè)更新站點(diǎn)(注意:這里添加的站點(diǎn)http后不要加s),否則可能連接失敗,如圖2.12所示。圖2.12安裝ADT添加好后,勾選“DeveloperTools”選項(xiàng),單擊“Next”按鈕進(jìn)行更新安裝。2.下載ADT插件包手動(dòng)配置直接在Android的官方網(wǎng)站下載ADT,下載地址是/android/ADT-0.9.5.zip。下載完成后,解壓將plugins包和features包中的內(nèi)容復(fù)制到Eclipse對(duì)應(yīng)的plugins包和features包中,重新啟動(dòng)Eclipse。安裝成功后,重新啟動(dòng)Eclipse,選擇Window→Preferences菜單,在彈出的對(duì)話框中多了一項(xiàng)“Android”。選擇Android選項(xiàng),在右邊選擇AndroidSDK的安裝路徑“SDKLocation”,下面會(huì)列出當(dāng)前可用的SDK版本和GoogleAPI版本,如圖2.13所示。圖2.13安裝ADT選擇“File”→“New”命令,我們就可以使用該插件創(chuàng)建Android工程了,如圖2.14所示。圖2.14使用ADT創(chuàng)建Android項(xiàng)目2.2Android常用工具的使用在我們下載的AndroidSDK中有一個(gè)tools目錄,該目錄中包含了Android中的常用工具。另外,在platforms目錄下針對(duì)不同的版本也有一個(gè)tools文件夾,該文件夾下面也有一些工具。例如,AATP、DX等。其實(shí),我們使用的ADT插件就是使用了這些工具來進(jìn)行可視化開發(fā)的,所以了解這些工具的使用是非常有必要的。本節(jié)將詳細(xì)講述這些工具的使用。2.2.1創(chuàng)建AndroidVirtualDevices(AVD)1.使用DOS命令行方式來創(chuàng)建AVD是模擬器的一個(gè)配置,讓用戶更好地來模擬真實(shí)設(shè)備。一個(gè)AVD包含如下幾部分內(nèi)容:一個(gè)硬件配置(如是否有照相機(jī)、鍵盤的指定和內(nèi)存的大小等)、版本的選擇、設(shè)備的屏幕尺寸和外觀、SD卡的大小,以及AVD文件的存儲(chǔ)位置。創(chuàng)建AVD我們使用tools目錄下的android命令,打開DOS窗口將目錄定位到tools目錄下,按照如下命令格式輸入:androidcreateavd-n<name>-t<targetID>[-<option><value>]...其中,n表示AVD名稱;-t表示AVD使用的SDK版本。我們可以使用androidlisttarget命令列出當(dāng)前可用的SDK版本。例如,我們?cè)贒OS下輸入androidlisttarget命令,輸出結(jié)果如圖2.15所示。圖2.15列出AndroidSDK版本信息-option是一些配置項(xiàng)信息。例如,我們輸入如下命令:androidcreateavd-nMyAVD1.5-t2,系統(tǒng)將提示我們是否自定義一個(gè)硬件配置,我們選擇NO,將很快創(chuàng)建一個(gè)AVD配置。AVD的保存位置會(huì)根據(jù)一個(gè)叫做“ANDROID_SDK_HOME”的環(huán)境變量來指定,如果沒有指定該變量,則它會(huì)在系統(tǒng)默認(rèn)的目錄下創(chuàng)建。在Windows系統(tǒng)中的默認(rèn)路徑是C:\Users\<user>\.android\。在這里我們配置的“ANDROID_SDK_HOME”環(huán)境變量是“E:\android\avds\.android\avd”,那么打開該目錄,發(fā)現(xiàn)下面會(huì)有一個(gè)“.android”目錄該目錄中有一個(gè)“avd”目錄,該目錄下就是我們創(chuàng)建的AVD配置了。下面會(huì)有兩個(gè)文件:config.ini(配置信息)和userdata.img(用戶數(shù)據(jù)鏡像)。2.可視化配置我們打開DOS窗口,將目錄定位到tools目錄下,輸入android命令,將出現(xiàn)一個(gè)如圖2.16所示的窗口。圖2.16使用android命令創(chuàng)建AVD1單擊“New”按鈕彈出創(chuàng)建AVD對(duì)話框,如圖2.17所示。圖2.17使用android創(chuàng)建AVD2在該窗口中添加AVD名稱、Target(Android版本指定)、SDCard大小和外觀特征。單擊“CreateAVD”按鈕將成功創(chuàng)建一個(gè)AVD。2.2.2模擬器(Emulator)的使用在AndroidSDK的tools目錄下有一個(gè)emulator.exe可執(zhí)行文件,該文件是硬件設(shè)備的一個(gè)仿真模擬器。我們可以通過該模擬器開發(fā)、測(cè)試Android應(yīng)用程序。Android模擬器幾乎提供了大多數(shù)物理硬件設(shè)備的硬件和軟件特性。當(dāng)然,它和真機(jī)還是有一些區(qū)別的。例如,它不能接打電話、不能進(jìn)行拍照等。Emulator通過一個(gè)叫做AndroidVirtualDevice(AVD,Android虛擬設(shè)備)的配置來指定Android的版本、硬件選項(xiàng)和模擬器外觀。Android通過QEMU(QEMU是一套由FabriceBellard編寫的模擬處理器的自由軟件)仿真模擬器來模擬ARM處理器,通過磁盤鏡像來模擬存儲(chǔ)。在QEMU的支持下,模擬器具有很多的硬件設(shè)備的特征:·支持ARM5處理器和響應(yīng)的內(nèi)存管理單元(MMU);·支持一個(gè)16位的LCD顯示屏;·一個(gè)或者多個(gè)鍵盤;·具有音頻輸入和輸出的能力;·通過磁盤鏡像使用閃存;·一個(gè)GSM調(diào)制解調(diào)器,包括一個(gè)模擬的SIM卡。啟動(dòng)一個(gè)模擬器使用如下命令:emulator-avd<avd_name>。avd_name是AVD配置名稱,例如,可以使用emulator–avdMyAVD1.5命令啟動(dòng)一個(gè)模擬器。啟動(dòng)界面如圖2.18所示。圖2.18模擬器運(yùn)行界面2.2.3AndroidDebugBridge(ADB)的使用ADB是管理模擬器的一個(gè)通用工具,該工具的功能很多,例如,將系統(tǒng)文件復(fù)制到設(shè)備、從設(shè)備復(fù)制文件到系統(tǒng)、安裝APK項(xiàng)目、查看當(dāng)前設(shè)備等。1.查詢當(dāng)前模擬器實(shí)例數(shù)量可以使用adbdevices命令來查看當(dāng)前運(yùn)行的Android模擬器實(shí)例。2.本地機(jī)器和模擬器之間相互復(fù)制文件可以使用adbpush命令從系統(tǒng)復(fù)制文件到設(shè)備,使用adbpull命令從設(shè)備復(fù)制文件到系統(tǒng)。例如,如下命令是將D盤根命令下面的一個(gè)test.txt文件復(fù)制到設(shè)備的sdcard里面。下面的命令是將設(shè)備中的test.txt文件復(fù)制到系統(tǒng)。3.安裝APK應(yīng)用程序可以使用adbinstall命令安裝一個(gè)APK應(yīng)用程序到設(shè)備。注意在安裝之前應(yīng)先把應(yīng)用程序復(fù)制到設(shè)備再進(jìn)行安裝。例如,如下命令可以安裝一個(gè)名為test.apk的程序到設(shè)備。4.使用shell命令A(yù)DB提供了一個(gè)ashshell允許使用系統(tǒng)中的各種命令,這些命令位于設(shè)備或者模擬器文件系統(tǒng)的/system/bin/目錄下面。在DOS命令行輸入adbshell便進(jìn)入shell命令行了,這里我們可以使用ls來顯示當(dāng)前目錄下的文件內(nèi)容,可以使用cd來改變當(dāng)前路徑,也可以使用exit退出shell。2.2.4DalvikDebugMonitorService(DDMS)的使用DDMS全稱為DalvikDebugMonitorService,即Dalvik調(diào)試監(jiān)控服務(wù),是一個(gè)可視化的調(diào)試監(jiān)控工具。在DOS命令窗口中輸入ddms會(huì)彈出如圖2.19所示的界面。圖2.19DDMS窗口該窗口主要是對(duì)系統(tǒng)運(yùn)行后臺(tái)日志的監(jiān)控,還有系統(tǒng)線程、虛擬機(jī)狀態(tài)的監(jiān)控。另外,該窗口還可以模擬發(fā)送短信、撥打電話和發(fā)送GPS位置信息。我們后面在Eclipse中使用的DDMS就是對(duì)該工具的集成。2.2.5AndroidAssetPackagingTool(AAPT)的使用AAPT是AndroidAssetPackagingTool的縮寫,即Android資源打包工具,是對(duì)Android工程中的資源進(jìn)行打包的工具。例如,音頻、圖片等原生文件;XML配置文件等。下面的命令將Android工程下面的所有資源(包括res目錄下面的、assets目錄下面的和AndroidManifest.xml配置文件)打包為\bin\目錄下的resources.ap_壓縮文件。2.2.6DX的使用Android應(yīng)用程序雖然使用Java語言編寫,但是不能直接使用編譯后的類文件(.class)文件,而是需要編譯成一種.dex文件才能運(yùn)行。dx命令是將Java編譯后的類文件(.class文件)轉(zhuǎn)換成AndroidDalvik虛擬機(jī)可執(zhí)行的文件,即.dex文件(DalvikExecutableFormat)。例如,如下命令將D:\MyAndroidPro\bin目錄下面的所有類文件轉(zhuǎn)換成D:\MyAndroidPro\bin\下面的classes.dex文件。2.2.7mksdcard的使用我們都知道真正的Android設(shè)備當(dāng)中是有數(shù)據(jù)存儲(chǔ)設(shè)備的。例如,SDCard、擴(kuò)展卡等。但是,我們使用Android模擬器時(shí)并沒有真正的數(shù)據(jù)存儲(chǔ)設(shè)備,這時(shí)候我們可以將硬盤空間鏡像為數(shù)據(jù)存儲(chǔ)設(shè)備。mksdcard命令就能夠?qū)⒂脖P空間鏡像為數(shù)據(jù)存儲(chǔ)設(shè)備。例如,下面命令是在D盤根目錄下創(chuàng)建一個(gè)名稱為mysdcard.img且大小為64MB的存儲(chǔ)卡。2.3我的第一個(gè)Android應(yīng)用通過上面兩節(jié)的學(xué)習(xí),我們對(duì)Android中的常用命令及其開發(fā)環(huán)境有了一個(gè)整體的了解。接下來我們將開始創(chuàng)建第一個(gè)Android應(yīng)用,為了使讀者有一個(gè)更深入的了解,我們將通過兩節(jié)來講解Android的第一個(gè)應(yīng)用。從而使讀者能夠了解到更多IDE背后的事情。2.3.1純手工創(chuàng)建一個(gè)Android應(yīng)用因?yàn)楫?dāng)前我們還不是很熟悉Android的程序結(jié)構(gòu)以及一些配置文件和類文件的結(jié)構(gòu),所以這里我們參考AndroidSDK中的一些模板文件,這些文件位于AndroidSDK\platforms\android-1.5\templates目錄下面。該工程的創(chuàng)建步驟說明如下。創(chuàng)建包及其目錄結(jié)構(gòu)。在文件系統(tǒng)的D盤(任意)根目錄下創(chuàng)建一個(gè)文件夾MyAndroidPro。在該目錄下再創(chuàng)建如下src目錄及res目錄:src保存Java源文件,在該目錄下創(chuàng)建包目錄com/amaker/app;res保存資源文件,在該目錄下創(chuàng)建layout保存布局文件,創(chuàng)建values保存一些常量值文件。目錄結(jié)構(gòu)如下所示。創(chuàng)建Android應(yīng)用的Activity類。在com.amaker.app包中創(chuàng)建一個(gè)MainActivity類,該類繼承Activity,覆蓋父類的onCreate()方法,代碼如下所示:創(chuàng)建界面布局文件。Android中一種很好的設(shè)計(jì)思想就是可以把界面上的組件聲明在配置文件當(dāng)中,這樣既降低了程序的耦合性,又提高了程序的運(yùn)行效率。在res\layout\目錄下創(chuàng)建一個(gè)main.xml布局文件。該布局文件內(nèi)參考AndroidSDK\platforms\android-1.5\templates目錄下面的layout.template文件,將該文件中的內(nèi)容復(fù)制粘貼到main.xml文件中。該文件中的第一行是XML文件版本和編碼。下面是該文件的布局管理類,現(xiàn)在使用的是線型布局。android:orientation="vertical"屬性指定垂直布局,android:layout_width="fill_parent"和android:layout_height="fill_parent"屬性指定內(nèi)容充滿父窗口。下面是一個(gè)文本視圖,顯示一個(gè)字符串。android:layout_width="fill_parent"屬性指定內(nèi)容文本寬充滿父窗口,android:layout_height="wrap_content"屬性指定內(nèi)容高依賴文本內(nèi)容高,android:text="@string/hello"屬性表示引用字符串常量顯示內(nèi)容。在res/values/目錄下創(chuàng)建一個(gè)strings.xml配置文件。該文件用來聲明一些在程序中使用的字符串常量。在com.amaker.app包中創(chuàng)建一個(gè)R.java類,該類是Java源文件和引用資源之間的一個(gè)索引文件。該文件中針對(duì)不同的資源又創(chuàng)建了不同的內(nèi)部類。例如,下面的main屬性代表指向main.xml布局文件的一個(gè)索引,可以在Java源文件中引用。創(chuàng)建Android應(yīng)用程序清單文件AndroidManife.xml。Android中的所有組件必須在該文件中聲明后才能使用。另外,該文件也會(huì)聲明一些權(quán)限信息和其他配置信息。在MyAndroidPro文件夾下創(chuàng)建一個(gè)名為AndroidManifest.xml的清單文件,這里我們可以參考AndroidSDK\platforms\android-1.5\templates目錄下面的AndroidManifest.template文件。將給文件內(nèi)容復(fù)制到AndroidManifest.xml文件中,修改相應(yīng)屬性如下所示:該文件的第一行是XML文件的版本和編碼聲明,下面是<mainfest>根元素,其中聲明了命名空間、包名稱和版本等信息。<application>子元素代表整個(gè)應(yīng)用程序,其中的android:label="@string/app_name"屬性引用字符串常量,顯示標(biāo)簽。<activity>元素是用來聲明Activity組件的,其屬性分別是類名稱和標(biāo)簽。<intent-filter>子元素代表該Activity的訪問能力,<action>和<category>代表當(dāng)前的Activity是應(yīng)用程序的入口程序。編譯MainActivity和R類,并使用DX工具將class文件編譯成dex文件,命令如下所示:使用appt命令打包資源文件。使用apkbuilder命令打包生成apk文件。使用emulator命令啟動(dòng)模擬器。使用adb命令安裝apk文件。運(yùn)行程序結(jié)果如圖2.20所示。圖2.20Android運(yùn)行結(jié)果2.3.2使用Eclipse創(chuàng)建一個(gè)Android應(yīng)用使用Eclipse插件ADT創(chuàng)建一個(gè)Android應(yīng)用程序比較簡單。下面我們將講述如何使用Eclipse來創(chuàng)建一個(gè)Android應(yīng)用程序。創(chuàng)建步驟說明如下。啟動(dòng)Eclipse,創(chuàng)建一個(gè)Android工程。我們選擇Eclipse的“New”快捷方式將彈出創(chuàng)建工程對(duì)話框,如圖2.21所示。圖2.21創(chuàng)建Android工程界面1在彈出的對(duì)話框中選擇“AndroidProject”并單擊“Next”按鈕進(jìn)入創(chuàng)建Android工程屬性選擇對(duì)話框,如圖2.22所示。圖2.22創(chuàng)建Android工程界面2在Projectname中輸入Android項(xiàng)目名稱,這里我們輸入Chaper02_HelloWorld。在BuildTarget中選擇你使用的AndroidSDK版本,這里我們選擇Android1.5。在Applicationname中輸入應(yīng)用程序名稱,這里我們輸入HelloWorld。在Packagename中輸入包名稱,這里是com.amaker.ch02.app。在CreateActivity中輸入Activity名稱,這里我們輸入MainActivity。單擊“Next”按鈕進(jìn)入下一個(gè)對(duì)話框,如圖2.23所示。圖2.23創(chuàng)建Android工程界面3該對(duì)話框中提示我們是否創(chuàng)建測(cè)試工程,這里我們暫時(shí)不創(chuàng)建測(cè)試工程,單擊“Finish”按鈕工程創(chuàng)建完成。右鍵單擊工程,在彈出的菜單中選擇“Runas”→“AndroidApplication”命令,程序運(yùn)行結(jié)果如圖2.24所示。圖2.24創(chuàng)建Android工程界面4如上所述,我們沒有書寫一句程序代碼,一個(gè)Android應(yīng)用便創(chuàng)建成功了。Android應(yīng)用程序如此簡單嗎?當(dāng)然不僅如此而已。別忘了這只是一個(gè)“HelloWorld”。這里我們將詳細(xì)講述Android的應(yīng)用程序結(jié)構(gòu),這樣的Android應(yīng)用程序結(jié)構(gòu)在后續(xù)章節(jié)中會(huì)經(jīng)常用到。所以掌握Android應(yīng)用程序的基本結(jié)構(gòu)還是非常必要的。我們將上一節(jié)工程的目錄結(jié)構(gòu)展開,如圖2.25所示。圖2.25Android工程結(jié)構(gòu)我們通過表2.2來分析Android工程的程序結(jié)構(gòu)。表2.2Android應(yīng)用程序結(jié)構(gòu)接下來我們將重點(diǎn)分析程序的代碼。1.MainActivity.java程序代碼該類比較簡單,MainActivity類繼承了Activity類,并覆蓋了onCreate()方法,在該方法中調(diào)用父類構(gòu)造方法,然后調(diào)用setContentView()方法展示視圖界面。R.layout.main是R.java資源類中的一個(gè)屬性。2.R.java程序代碼該類是一個(gè)資源索引類,由系統(tǒng)自動(dòng)生成,無須修改。該類里面根據(jù)不同的資源類型又包含了不同的靜態(tài)內(nèi)部類,attr中聲明屬性;drawable中聲明一些圖片資源;layout中聲明布局文件;string中聲明字符串?,F(xiàn)在你應(yīng)該明白了setContentView(R.layout.main)這句話的意思了吧!它是通過訪問資源類R的內(nèi)部類layout的main屬性來訪問工程layout文件夾下的main.xml布局文件,在界面上展示視圖組件。3.string.xml文件代碼該文件是一個(gè)XML文件,該文件中聲明了系統(tǒng)中使用到的字符串常量。這樣有兩個(gè)好處:一是降低了程序的耦合性;二是Android通過一種特殊的方式來使用字符串,提高了程序的運(yùn)行效率。在我們運(yùn)行結(jié)果中顯示的程序標(biāo)題和文本內(nèi)容都來自該文件。4.main.xml布局文件該文件也是一個(gè)XML文件,該文件中聲明了程序中使用到的視圖組件。Android通過這種巧妙的方法將程序的表現(xiàn)層和控制層分開,降低了程序的耦合性,提高了程序的可配置性。當(dāng)然,我們也可以在程序中編碼實(shí)現(xiàn)視圖組件。該文件的第一行是XML文件的版本和編碼聲明。第二行是一個(gè)線型布局,該布局以垂直或水平方式擺放視圖組件。android:orientation="vertical"屬性表明組件以垂直方式擺放;android:layout_width="fill_parent"屬性表明布局的寬充滿父組件;android:layout_height="fill_parent"表明布局的高充滿父組件。下面是一個(gè)文本視圖,android:layout_width="fill_parent"屬性表明該組件的寬充滿父組件;android:layout_height="wrap_content"屬性表明組件的高依靠自身內(nèi)容的高;android:text="@string/hello"屬性表明文本內(nèi)容引用string.xml文件中的hello元素。5.AndroidManifest.xml文件代碼每一個(gè)Android工程都有一個(gè)名為“AndroidManifest.xml”的配置文件,在所有項(xiàng)目中該文件的名稱不變。該文件是Android工程的一個(gè)全局配置文件,所有Android中使用到的組件(如Activity、Service、ContentProvider和BroadcastReceiver)都要在該文件中聲明,并且該文件中還可以聲明一些權(quán)限以及SDK的最低版本等信息。該文件的第一行是XML文件版本和編碼的聲明。下面是manifest根元素,該元素中指定了命名空間、包名稱、版本代碼號(hào)和版本名稱等信息。application子元素中的兩個(gè)屬性分別指定程序的圖標(biāo)和標(biāo)題。下面是Activity組件的聲明,Activity有兩個(gè)屬性表明Activity的類名稱和標(biāo)題。<intent-filter>是找到該Activity的過濾器,這里的action表明該Activity是程序的入口。category屬性表明在加載程序時(shí)運(yùn)行。<uses-sdk>表明使用的SDK最低版本。我們通過對(duì)上述代碼的分析,基本上了解了一個(gè)Android應(yīng)用程序的基本結(jié)構(gòu)和運(yùn)行機(jī)制。第二篇技術(shù)篇第3章Android中的資源訪問第4章Android用戶界面第5章Android基本程序單元Activity第6章Android組件之間的信使Intent第7章AndroidService組件第8章Android廣播事件處理BroadcastReceiver第9章Android中的數(shù)據(jù)存取第10章ContentProvider第11章Android中的多媒體應(yīng)用第12章Android中的圖形圖像第13章Android中的互聯(lián)網(wǎng)應(yīng)用第14章Android中的GPS應(yīng)用第3章Android中的資源訪問概括地講,Android中的資源是指非代碼部分。例如,在我們的Android程序中要使用一些圖片來設(shè)置桌面,要使用一些音頻文件來設(shè)置鈴聲,要使用一些動(dòng)畫來顯示特效,要使用一些字符串來顯示提示信息。那么,這些圖片、音頻、動(dòng)畫和字符串等就叫做Android中的資源文件。我們?cè)趧?chuàng)建一個(gè)Android工程時(shí),和src源文件夾并列的有兩個(gè)文件夾,分別叫做res和assets。這兩個(gè)文件夾是用來保存資源文件的。在這兩個(gè)文件夾中保存的文件有所不同,在assets中保存的一般是原生的文件,例如,一個(gè)MP3文件,Android程序不能直接訪問,必須通過AssetManager類以二進(jìn)制流的形式來讀取。而res中的資源可以通過R資源類直接訪問。assets中的資源很少用到,而res中的資源經(jīng)常使用。如圖3.1所示,在該工程中和src并列的有兩個(gè)文件夾assets和res,res目錄下又有anim、drawable、layout、menu、raw、values和xml文件夾,分別用來保存動(dòng)畫、圖片、布局文件、菜單、原生文件、常量值和XML文件。圖3.1資源目錄結(jié)構(gòu)3.1資源簡介Android中的資源是在代碼中使用的外部文件。這些文件作為應(yīng)用程序的一部分,被編譯到應(yīng)用程序當(dāng)中。Android中支持大量的資源文件,如XML文件、圖片文件、音頻和視頻文件。XML文件的格式有不同的寫法,詳細(xì)內(nèi)容請(qǐng)參考本章后續(xù)小節(jié)。編譯到應(yīng)用程序當(dāng)中。Android中支持大量的資源文件本節(jié)我們將講解如何創(chuàng)建資源文件,以及如何在代碼中使用和如何在其他資源文件中引用該資源。在代碼中我們使用Context的getResources()方法得到Resources對(duì)象,該對(duì)象提供了獲得各種類型資源的方法。在其他資源中引用資源的一般格式是這樣的:@[包名稱:]資源類型/資源名稱。例如,下面的代碼是在布局文件中引用顏色資源、字符串資源和尺寸資源:本節(jié)我們將講解如何創(chuàng)建資源文件,以及如何在代碼中使用和如何在其他資源文件中引用該資源。在代碼中我們使用Context的getResources()方法得到Resources對(duì)象,該對(duì)象提供了獲得各種類型資源的方法。在其他資源中引用資源的一般格式是這樣的:@[包名稱:]資源類型/資源名稱。例如,下面的代碼是在布局文件中引用顏色資源、字符串資源和尺寸資源:3.1.1資源的類型和布局我們可以在工程的res目錄下創(chuàng)建和保存各種不同類型的資源文件。這些資源文件要有一定的布局和格式。Android使用資源編譯器工具AAPT來編譯這些資源文件。表3.1展示了Android中資源的布局和類型。表3.1Android資源布局類型表3.1.2資源文件的使用資源文件的使用分為在代碼中使用和在其他資源文件中引用該資源文件。在我們編譯一個(gè)Android應(yīng)用時(shí),Android會(huì)自動(dòng)生成一個(gè)R類,在該類中根據(jù)不同的資源類型又生成了相應(yīng)的內(nèi)部類,該類包含了系統(tǒng)中使用到的所有資源文件的標(biāo)示,其內(nèi)容如下所示。1.在代碼中使用資源文件在代碼中訪問資源文件,我們是通過使用R資源類中定義的資源文件類型和資源文件名稱來訪問的。具體格式為:R.資源文件類型.資源文件名稱。例如:另外,除了訪問用戶自己定義的資源文件,還可以訪問系統(tǒng)中的資源文件。大部分的資源文件被定義在android包下的R類中。訪問系統(tǒng)中的資源文件格式為:android.R.資源文件類型.資源文件名稱。例如:2.在其他資源文件中引用資源文件我們經(jīng)常會(huì)在布局文件的元素屬性中引用其他資源文件,經(jīng)常用到的有字符串、圖片、顏色等資源。例如,下列布局文件中的TextView組件引用了一個(gè)字符串來表示文本內(nèi)容,引用了一個(gè)顏色來表示文本顏色,引用了一個(gè)尺寸來表示文本尺寸。3.2使用顏色(color)資源3.2.1顏色值定義顏色值的定義是通過RGB三原色和一個(gè)alpha值來定義的。顏色值定義的開始是一個(gè)井號(hào)(#),后面是Alpha-Red-Green-Blue的格式。例如:#RGB#ARGB#RRGGBB#AARRGGBB3.2.2顏色資源XML文件的定義下面通過一個(gè)表格來展示顏色資源XML文件的定義,如表3.2所示。表3.2顏色的定義和使用3.2.3使用顏色資源下面通過一個(gè)實(shí)例來演示顏色資源的使用,本實(shí)例的功能是定義兩個(gè)顏色資源:紅色背景和藍(lán)色文字。實(shí)例步驟說明如下。定義一個(gè)名稱為“Chapter03_Resource”的Android工程,在該工程的res\values\目錄下,定義一個(gè)colors.xml顏色資源文件,內(nèi)容如下所示。在該工程的res\layout\目錄下定義一個(gè)布局資源文件,在該文件中添加一個(gè)TextView視圖組件,引用顏色資源,設(shè)置視圖組件TextView的文字顏色為藍(lán)色。定義一個(gè)TestColorActivity類,引用顏色資源文件,設(shè)置背景色為紅色。運(yùn)行程序,結(jié)果如圖3.2所示。圖3.2顏色資源應(yīng)用3.3使用字符串(string)資源在一個(gè)Android工程中,我們可能會(huì)使用到大量的字符串作為提示信息。這些字符串都可以作為字符串資源聲明在配置文件中,從而實(shí)現(xiàn)程序的可配置性。在代碼中我們使用Context.getString()方法,通過傳遞資源ID參數(shù)來得到該字符串,也可以在其他資源文件中引用字符串資源,引用格式為:"@string/字符串資源名稱。3.3.1字符串資源XML文件的定義我們通過表3.3來說明字符串資源是如何定義的,包括資源的位置、XML文件的格式、獲得資源的方法和引用資源的方法等。表3.3字符串資源得定義和使用3.3.2字符串資源XML文件的使用下面將通過一個(gè)實(shí)例來演示資源文件的用法。在該實(shí)例中用到兩個(gè)字符串資源:一個(gè)在布局文件中引用;另一個(gè)在Java代碼中引用。實(shí)例步驟說明如下。在該工程的res\values\目錄下,創(chuàng)建一個(gè)字符串資源文件stirngs.xml,內(nèi)容如下所示:在該工程的res\layout\目錄下,定義一個(gè)布局文件test_string.xml。在該布局文件中添加兩個(gè)TextView視圖對(duì)象:第一個(gè)TextView的文本內(nèi)容直接引用strings.xml文件中的資源;第二個(gè)TextView的文本內(nèi)容在代碼中設(shè)置。在工程的com.amaker.ch03.string包中,創(chuàng)建一個(gè)TestStringActivity類。在該類的onCreate()方法中,設(shè)置當(dāng)前的視圖布局,并獲得TextView實(shí)例。通過Context.getString()方法,從字符串資源中獲得字符串常量,并將其設(shè)置為TextView的文本內(nèi)容。運(yùn)行程序,結(jié)果如圖3.3所示。圖3.3字符串資源應(yīng)用3.4使用尺寸(dimen)資源我們可以使用一些常用的尺寸單位來定義一些文字尺寸、視圖組件的寬和高等。尺寸資源是一個(gè)數(shù)字類型的數(shù)據(jù),被定義在res\values\dimens.xml文件中。3.4.1Android中支持的尺寸單位在計(jì)算機(jī)中一般我們會(huì)用到的尺寸單位有厘米(cm)、毫米(mm)、像素(px)、英尺(in)等。Android中支持的尺寸單位如表3.4所示。表3.4Android中支持單位3.4.2尺寸資源XML文件的定義尺寸資源是定義在XML文件中的一些整型數(shù)值。有關(guān)尺寸資源的定義如表3.5所示。表3.5尺寸資源的定義和使用3.4.3尺寸資源XML文件的使用下面還是通過一個(gè)實(shí)例來演示尺寸資源的用法。該實(shí)例在布局文件中添加一個(gè)TextView和一個(gè)Button,分別使用尺寸資源文件來定義它們的寬和高。在工程的res\values\目錄下創(chuàng)建一個(gè)dimens.xml尺寸資源文件。在工程的res\layout\目錄下創(chuàng)建一個(gè)test_dimen.xml布局文件。在該布局文件中添加一個(gè)TextView和一個(gè)Button。TextView的寬和高引用尺寸資源來設(shè)置。Button的寬和高在代碼中設(shè)置。在com.amaker.dimen包中,創(chuàng)建一個(gè)TestDimensionActivity類。在該類頂部聲明使用的Button視圖組件,在onCreate()方法中實(shí)例化該組件,并定義尺寸資源設(shè)置其寬和高。運(yùn)行程序,結(jié)果如圖3.4所示。圖3.4尺寸資源應(yīng)用3.5使用原始XML資源如果項(xiàng)目中使用到了一些原始的XML文件,那么,我們可以定義一些XML文件供工程使用。XML文件定義在工程的res\xml\目錄下,通過Resources.getXML()方法來訪問。3.5.1原始XML資源文件的定義原始XML資源文件的定義信息通過表3.6來描述。表3.6原始XML資源文件定義和使用3.5.2原始XML文件的使用獲得原始XML文件的基本思路是,通過getResources().getXml()獲得XML原始文件,得到XmlResourceParser對(duì)象,通過該對(duì)象來判斷是文檔的開始還是結(jié)尾、是某個(gè)標(biāo)簽的開始還是結(jié)尾,并通過一些獲得屬性的方法來遍歷XML文件,從而訪問XML文件的內(nèi)容。下面的實(shí)例演示了如何訪問XML文件內(nèi)容,并將內(nèi)容顯示在一個(gè)TextView中。在“Chapter03_Resource”工程中的res\xml\目錄下,創(chuàng)建一個(gè)test.xml文件。該文件中定義了兩條客戶信息,屬性信息有姓名、年齡、性別和E-mail地址,內(nèi)容如下所示。在該工程的res\layout\目錄下,創(chuàng)建一個(gè)test_xml.xml布局文件,該布局文件中添加一個(gè)Button和一個(gè)TextView視圖組件。Button用于響應(yīng)單擊事件訪問XML內(nèi)容,TextView用于顯示XML內(nèi)容。在該工程的com.amaker.ch03.xml包中創(chuàng)建一個(gè)TestXmlActivity類。在該類頂部聲明使用到的TextView和Button,在onCreate()方法中實(shí)例化,添加Button的單擊事件,獲得XML內(nèi)容顯示在TextView中。運(yùn)行程序,結(jié)果如圖3.5所示。圖3.5XML資源應(yīng)用3.6使用drawables資源drawable資源是一些圖片或者顏色資源,主要用來繪制屏幕,通過Resources.getDrawable()方法獲得。drawable資源分為三類:BitmapFile(位圖文件)、ColorDrawable(顏色)、Nine-PatchImage(九片圖片)。這里只講述常用的位圖文件的使用。Android中支持的位圖文件有png、jpg和gif。表3.7描述了位圖文件的定義細(xì)節(jié)。表3.7尺寸資源的定義和使用下面通過實(shí)例的方式來演示位圖文件的使用。本實(shí)例首先在res\drawable\目錄下添加兩個(gè)位圖文件g1.jpg和moto.jpg,并將這兩個(gè)位圖文件顯示在Activity的ImageView中,第一個(gè)通過在布局文件中直接引用,第二個(gè)在Java代碼中引用。實(shí)例步驟說明如下。在“Chapter03_Resource”工程的res\drawable\目錄下添加兩張位圖文件g1.jpg和moto.jpg。創(chuàng)建一個(gè)布局文件test_bitmap。在該布局文件中添加兩個(gè)ImageView組件用來顯示圖標(biāo),其中第一個(gè)ImageView組件直接引用g1.jpg文件,第二個(gè)在Java代碼中進(jìn)行設(shè)置。在工程的com.amaker.ch03.drawable包中創(chuàng)建TestBitmapActivity類。在該類頂部聲明一個(gè)ImageView視圖組件,在onCreate()方法中實(shí)例化該組件,并通過Resources.getDrawable()方法獲得位圖資源,將ImageView組件設(shè)置為可顯示的圖片。運(yùn)行程序,結(jié)果如圖3.6所示。圖3.6位圖資源應(yīng)用3.7使用布局(layout)資源布局資源是Android中最常使用的一種資源,Android可以將屏幕中組件的布局方式定義在一個(gè)XML文件中,這有點(diǎn)像Web開發(fā)中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論