android開發(fā)教程的資料_第1頁
android開發(fā)教程的資料_第2頁
android開發(fā)教程的資料_第3頁
android開發(fā)教程的資料_第4頁
android開發(fā)教程的資料_第5頁
已閱讀5頁,還剩154頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

android開發(fā)教程的資料第1頁/共159頁第一章

Android概述1.1什么是Android1.2Android的體系結(jié)構(gòu)1.3Android的應(yīng)用程序組件第2頁/共159頁Android的發(fā)展Android一詞的本義指“機(jī)器人”,2003年美國有一家以Android為名的小公司成立,開發(fā)手機(jī)平臺(tái)。Google在2005年收購Android之后,繼續(xù)進(jìn)行對(duì)Android系統(tǒng)開發(fā)。Google于2007年11月5日發(fā)布了開源的Android平臺(tái),并組建了開放手機(jī)聯(lián)盟(OpenHandsetAlliance),包括Google、中國移動(dòng)、T-Mobile、宏達(dá)電、高通、摩托羅拉等領(lǐng)軍企業(yè)第3頁/共159頁Android的發(fā)展在Google及其開放手機(jī)聯(lián)盟推出基于Linux平臺(tái)的開源手機(jī)操作系統(tǒng)Android之后,Google又不惜重金舉辦了Android開發(fā)者大賽,吸引了眾多開發(fā)者的目光。因?yàn)锳ndroid不僅功能強(qiáng)大,而且具有開放和免費(fèi)等先天優(yōu)勢(shì),所以全球范圍內(nèi)的電信行業(yè)、手機(jī)制造商更是毫不猶豫地加入到Android開放手機(jī)聯(lián)盟中來。2008年9月22日,美國運(yùn)營商T-MobileUSA在紐約正式發(fā)布了第一款基于Android操作系統(tǒng)的手機(jī)——T-MobileG1,這讓更多的移動(dòng)設(shè)備廠商看到了Android的光明前景都紛紛加入其中,甚至Android已經(jīng)涉足上網(wǎng)本市場(chǎng)。中國移動(dòng)也在Android的基礎(chǔ)之上推出了自己的操作系統(tǒng)OMS。第4頁/共159頁Android的發(fā)展2009年1季度G1銷售100萬支2009.3MWC華為發(fā)布Android手機(jī)Moto,三星,LG計(jì)劃2009年下半年推出Android手機(jī)2009獲得Orange,Vodafone,O2,Telefonica支持2009進(jìn)軍上網(wǎng)本第5頁/共159頁Android的特點(diǎn)開放性應(yīng)用程序無界限應(yīng)用程序是在平等的條件下創(chuàng)建的應(yīng)用程序可以輕松地嵌入網(wǎng)絡(luò)應(yīng)用程序可以并行運(yùn)行第6頁/共159頁Android的特點(diǎn)應(yīng)用程序無界限:Android上的應(yīng)用程序可以通過標(biāo)準(zhǔn)API訪問核心移動(dòng)設(shè)備功能。通過互聯(lián)網(wǎng),應(yīng)用程序可以聲明它們的功能可供其他應(yīng)用程序使用。第7頁/共159頁Android的特點(diǎn)應(yīng)用程序是在平等的條件下創(chuàng)建的:移動(dòng)設(shè)備上的應(yīng)用程序可以被替換或擴(kuò)展,即使是撥號(hào)程序或主屏幕這樣的核心組件。第8頁/共159頁Android的特點(diǎn)應(yīng)用程序可以輕松地嵌入網(wǎng)絡(luò):應(yīng)用程序可以輕松地嵌入HTML、JavaScript和樣式表,應(yīng)用程序還可以通過WebView顯示網(wǎng)絡(luò)內(nèi)容。第9頁/共159頁1.1什么是AndroidAndroid是一款針對(duì)移動(dòng)設(shè)備的軟件堆棧,其中包括操作系統(tǒng)(基于Linux內(nèi)核)、中間件和關(guān)鍵應(yīng)用程序。基于Android平臺(tái)的應(yīng)用程序的開發(fā),可以在AndroidSDK(SoftwareDevelopmentKit,軟件開發(fā)工具包)的幫助下使用Java語言來完成。AndroidSDK為我們提供了一組必要工具包和的API(ApplicationProgrammingInterface,應(yīng)用程序編程接口)。第10頁/共159頁1.1什么是AndroidAndroid采用Linux為操作系統(tǒng),所以系統(tǒng)程序包含了C語言的標(biāo)準(zhǔn)函數(shù)庫。應(yīng)用程序主要以Java語言在DalvikVM虛擬機(jī)上執(zhí)行。應(yīng)用程序開發(fā)環(huán)境以Eclipse為主,加上AndroidDevelopmentTools(ADT)插件及AndroidSDK。Android平臺(tái)的主旨是提供一個(gè)應(yīng)用程序架構(gòu)(ApplicationFramework),好讓各家OEM廠商可不必從頭進(jìn)行軟件開發(fā),就能推出一系列的Android平臺(tái)手機(jī)。第11頁/共159頁Android通常擁有的特性(1)Applicationframework:提供可重復(fù)使用及改寫的組件。(2)Dalvikvirtualmachine:提供給移植設(shè)備一個(gè)優(yōu)化過的Java虛擬機(jī)。(3)Integratedbrowser:基于開放源碼的WebKit引擎的一個(gè)瀏覽器,像Mac上的Safari也是從WebKit衍生出來的。(4)Optimizedgraphics:優(yōu)化過的繪圖函數(shù)庫,包含了SGL的2D繪圖函數(shù)庫及基于OpenGLES1.0規(guī)范的3D繪圖函數(shù)庫。(5)SQLite:一個(gè)結(jié)構(gòu)化的數(shù)據(jù)庫系統(tǒng)。第12頁/共159頁Android通常擁有的特性(6)Mediasupport:多媒體影音格式的支持,包含了MPEG4,H.264,MP3,AAC,AMR,JPG,PNG,GIF。(7)GSM:GSM手機(jī)的通話能力其實(shí)必須在硬件電路層次實(shí)現(xiàn),軟件層次無法實(shí)現(xiàn),只是Android平臺(tái)要求必須要有GSM通話能力,此項(xiàng)功效特點(diǎn)與其說是特性,不如說是訂立出最低的硬件要求規(guī)范。(8)Bluetooth,EDGE,3G,Wi-Fi,camera,GPS,compass,andaccelerometer:同GSM一樣,它必需由實(shí)際硬件決定是否支持。(9)Richdevelopmentenvironment:包含了設(shè)備模擬器,調(diào)試工具,內(nèi)存及性能評(píng)估分析工具及讓EclipseIDE支持Android項(xiàng)目的插件。第13頁/共159頁1.2Android的體系結(jié)構(gòu)Android的體系結(jié)構(gòu)分成(1)Applications,(2)ApplicationFramework,(3)Libraries,(4)AndroidRuntime,(5)LinuxKernel五大部分。Android本身是一套軟件堆棧(SoftwareStack),或稱為“軟件迭層架構(gòu)”,迭層主要分成三層:操作系統(tǒng)、中間件(Middleware)、應(yīng)用程序。想開發(fā)可在Android平臺(tái)上運(yùn)行的應(yīng)用程序,可用Java程序語言編寫。第14頁/共159頁1.2Android的體系結(jié)構(gòu)第15頁/共159頁ApplicationsAndroid系統(tǒng)自帶的應(yīng)用程序通常包含有電子郵件程序、短信程序、日歷、地圖、瀏覽器、通訊錄程序等,所有的應(yīng)用程序都由Java語言編寫。第16頁/共159頁ApplicationFramework應(yīng)用程序開發(fā)人員在編寫應(yīng)用程序時(shí)可以完整的使用統(tǒng)一的API接口。這個(gè)應(yīng)用程序框架是可以容易重復(fù)使用各種組件,這樣應(yīng)用程序就可以只需提供出它自己本身的特殊功能。應(yīng)用程序還可以較容易的去使用其它程序的特殊功能。這種統(tǒng)一機(jī)制,有助于開發(fā)人員去編寫自己新的軟件組件,而不用編寫一些已經(jīng)存在的重復(fù)代碼,提高開發(fā)效率。第17頁/共159頁ApplicationFramework組件(1)ViewsSystem(視圖系統(tǒng))(2)ContentProviders(內(nèi)容提供器)

(3)ResourceManager(資源管理器)

(4)NotificationManager(通知管理器)

(5)ActivityManager(活動(dòng)管理器)第18頁/共159頁ApplicationFramework組件(6)WindowManager(窗口管理器)

(7)LocationManager(定位管理器)

(8)TelephonyManager(電話管理器)

(9)PackageManager(包管理器)

(10)XMPPService:eXtensibleMessagingandPresenceProtocol第19頁/共159頁Libraries(1)SystemClibrary:一個(gè)由BSD衍生出來的標(biāo)準(zhǔn)C系統(tǒng)函數(shù)庫(libc),這個(gè)函數(shù)庫已針對(duì)Linux嵌入式設(shè)備進(jìn)行過優(yōu)化。(2)MediaLibraries:基于PacketVideo'sOpenCORE的多媒體函數(shù)庫;這個(gè)多媒體函數(shù)庫支持播放和錄制許多現(xiàn)在很流行的聲音及影像格式。比如:MPEG4,H.264,MP3,AAC,AMR,JPG及PNG。(3)SurfaceManager:這個(gè)部份讓開發(fā)者可以去存取顯示系統(tǒng),以及無接縫的實(shí)現(xiàn)2D/3D多應(yīng)用程序之間的整合。(4)LibWebCore:一個(gè)先進(jìn)的網(wǎng)頁瀏覽器引擎。(5)SGL:2D圖形引擎庫。第20頁/共159頁Libraries(6)3DLibraries:一個(gè)基于OpenGLES1.0規(guī)范的3D圖像引擎庫。它可以選擇硬件的3D加速或高度優(yōu)化的3D軟件程序去實(shí)現(xiàn)效果。(7)FreeType:位圖及矢量字形。(8)SQLite:SQLite是一套開放源碼的關(guān)系數(shù)據(jù)庫,供Android上所有的應(yīng)用程序使用。其特點(diǎn)在于輕量型(僅500KB左右的大小),適合手持式設(shè)備使用;此外桌面型計(jì)算的應(yīng)用程序也有使用,如OpenO2.0版之后就有內(nèi)建的SQLite。(9)SSL-SecureSocketLayer,專門用于保護(hù)網(wǎng)頁通訊的協(xié)議。第21頁/共159頁AndroidRuntimeAndroid雖然使用Java程序語言來開發(fā)、編寫應(yīng)用程序,但卻不使用一般大家目前在用的JavaRuntime(J2ME)版本來執(zhí)行Java程序,而是用Android自有的AndroidRuntime來執(zhí)行。AndroidRuntime包含下面兩個(gè)核心。(1)CoreLibraries(2)DalvikVirtualMachine第22頁/共159頁LinuxKernelAndroid平臺(tái)的操作系統(tǒng)使用的是Linux,其核心版本為2.6版Android所用的Linux核心,包含的功能主要有:安全(Security)、內(nèi)存管理(MemoryManagement)、進(jìn)程管理(ProcessManagement)、網(wǎng)絡(luò)堆棧(NetworkStack)、驅(qū)動(dòng)程序模型(DriverModel)等另外在前述的軟件堆棧與硬件間建立起一個(gè)抽象層(AbstractionLayer)。第23頁/共159頁1.3Android的應(yīng)用程序組件ActivityServiceContentProviderBroadcastReceiver第24頁/共159頁第二章

Android開發(fā)環(huán)境搭建2.1下載并安裝JDK2.2下載并安裝SDK2.3下載并安裝eclipse2.4下載并安裝ADT第25頁/共159頁工具包關(guān)系A(chǔ)ndroid的開發(fā)環(huán)境指用于開發(fā)Android應(yīng)用程序所需要的基本的開發(fā)工具,主要包括四個(gè)部分,分別是JDK、eclipse、ADT及AndroidSDK。第26頁/共159頁2.1下載并安裝JDK(1)下載最新的JDK,下載地址為:第27頁/共159頁2.1下載并安裝JDK(2)安裝JDK(3)配置JDK第28頁/共159頁2.1下載并安裝JDK(4)測(cè)試JDK第29頁/共159頁2.2下載并安裝SDK(1)下載AndroidSDK,我們可以到下載地址第30頁/共159頁2.2下載并安裝SDK(2)安裝AndroidSDK第31頁/共159頁2.2下載并安裝SDK(3)下載AndroidSDK的其他組件第32頁/共159頁2.2下載并安裝SDK(4)配置AndroidSDK第33頁/共159頁2.2下載并安裝SDK(5)測(cè)試AndroidSDK的配置第34頁/共159頁2.3下載并安裝eclipse(1)下載eclipse第35頁/共159頁2.3下載并安裝eclipse(2)安裝eclipse第36頁/共159頁2.4下載并安裝ADTADT是Google為Android開發(fā)者提供的Eclipse插件,可以很方便的開發(fā)應(yīng)用程序,下面我們來安裝和安裝ADT插件,步驟如下:(1)下載ADT。我可以在找到ADT的下載鏈接第37頁/共159頁2.4下載并安裝ADT(2)安裝ADT第38頁/共159頁2.4下載并安裝ADT(3)配置ADT第39頁/共159頁第三章

HelloWorld應(yīng)用程序3.1創(chuàng)建HelloWorld應(yīng)用程序3.2應(yīng)用程序結(jié)構(gòu)分析3.3調(diào)試應(yīng)用程序3.4導(dǎo)入已存在項(xiàng)目第40頁/共159頁3.1創(chuàng)建HelloWorld應(yīng)用程序ADT提供了簡單的生成Android應(yīng)用框架的功能,我們現(xiàn)在使用ADT通過Eclipse創(chuàng)建一個(gè)Android工程。在創(chuàng)建工程之前,首先要有一個(gè)運(yùn)行應(yīng)用程序的環(huán)境,可以是真實(shí)的Android手機(jī),也可以是模擬器。這里使用模擬器的方式,即使用AVD來運(yùn)行我們的應(yīng)用程序。第41頁/共159頁什么是AVD從Android1.5開始引入了AVD(AndroidVirtualDevice)這個(gè)概念。AVD是一個(gè)經(jīng)過配置的模擬器。在創(chuàng)建AVD時(shí)可以配置的選項(xiàng)有:模擬器影像大小、觸摸屏、軌跡球、攝像頭、屏幕分辨率、鍵盤、GSM、GPS、Audio錄放、SD卡支持、緩存區(qū)大小等。第42頁/共159頁創(chuàng)建AVD下面我們便來配置Android模擬器,具體步驟如下所示。(1)打開“AndroidSDKandAVDManager”第43頁/共159頁創(chuàng)建AVD(2)新建AVD第44頁/共159頁創(chuàng)建AVD(3)運(yùn)行AVD第45頁/共159頁3.2應(yīng)用程序結(jié)構(gòu)分析“PackageExplorer”導(dǎo)航器中的“HelloWorld”項(xiàng)目第46頁/共159頁R.javaR.java是在建立項(xiàng)目時(shí)自動(dòng)生成的,這個(gè)文件是只讀模式,不能更改,R.java文件是定義該項(xiàng)目所有資源的索引文件。先來看看“HelloWorld”項(xiàng)目的R.java文件第47頁/共159頁AndroidManfest.xmlAndroidManfest.xml文件則包含了該項(xiàng)目中所使用的Activity、Service、Receiver,我們先來打開“HelloWorld”項(xiàng)目中的AndroidManfest.xml文件第48頁/共159頁String.xml資源文件中一些常量的定義第49頁/共159頁main.xml“HelloWorld”項(xiàng)目的布局文件(layout)第50頁/共159頁布局和參數(shù)LinearLayoutandroid:orientation:表示這個(gè)介質(zhì)的版面配置方式是從上到下垂直地排列其內(nèi)部的視圖。android:orientation:表示這里是水平排列android:layout_width:定義當(dāng)前視圖在屏幕上所占的寬度,fill_parent即填充整個(gè)屏幕。android:layout_height:定義當(dāng)前視圖在屏幕上所占的高度,fill_parent即填充整個(gè)屏幕。wrap_content:隨著文字欄位的不同而改變這個(gè)視圖的寬度或高度。layout_weight:用于給一個(gè)線性布局中的多個(gè)視圖的重要度賦值。第51頁/共159頁布局和參數(shù)TextViewandroid:layout_width為整個(gè)屏幕的寬度android:layout_height可以根據(jù)文字來改變高度android:text則設(shè)置了這個(gè)TextView要顯示的文字內(nèi)容,這里引用了@string中的hello字符串,即String.xml文件中的hello所代表的字符串資源。hello字符串的內(nèi)容“HelloWorld,HelloWorld!”這就是我們?cè)凇癏elloWorld”項(xiàng)目運(yùn)行時(shí)看到的字符串。第52頁/共159頁HelloWorld.java主程序HelloWorld類繼承自Activity類,重寫了voidonCreate(BundlesavedInstanceState)方法。在onCreate方法中通過setContentView(R.layout.main)設(shè)置了Activity要顯示的布局文件(\layout\main.xml)。第53頁/共159頁結(jié)構(gòu)特點(diǎn)以上的應(yīng)用程序結(jié)構(gòu)是Android開發(fā)的特點(diǎn),這樣可以很輕松地將代碼和UI(UserInterface,用戶接口;用戶界面)分開,在國際化和程序維護(hù)方面有著巨大的作用。如果Android程序需要自適應(yīng)國際化,比如說多國語言等問題,那么就可以定義不同語言的UI布局,在程序裝載時(shí)調(diào)用不同的布局。而且,如果需要修改UI的一些問題,就不必查看代碼了,直接更改這些布局文件即可。當(dāng)然,這需要開發(fā)者在開發(fā)時(shí)使用這種MVC框架,盡量減少使用“硬編碼”。第54頁/共159頁3.3調(diào)試應(yīng)用程序在eclipse開發(fā)工具中調(diào)試程序的方法很多,但是使用eclipse調(diào)試Android程序時(shí)需要注意一些細(xì)節(jié)上的問題。DDMS的使用斷點(diǎn)的使用adb的使用第55頁/共159頁DDMS的使用在eclipse+ADT的開發(fā)環(huán)境中沒有直接跟蹤對(duì)象內(nèi)容的方法,但是我們可以使用Google提供的ADT插件DDMS(DalvikDebugMonitorService)在eclipse上輕松地調(diào)試Android程序。DDMS為我們提供了許多功能,例如:測(cè)試設(shè)備截屏,針對(duì)特定的進(jìn)程查看正在運(yùn)行的線程以及堆信息,LogCat,廣播狀態(tài)信息,模擬電話呼叫,接收SMS,虛擬地理坐標(biāo)等等(1)切換到DDMS的方法(2)LogCat使用(3)FileExplorer使用第56頁/共159頁切換到DDMS的方法第57頁/共159頁切換到DDMS的方法在“DDMS”界面中選擇“Devices”標(biāo)簽,查看其菜單的功能,我們可以看到DebugProcess(調(diào)試進(jìn)程)、UpdateThreads(更新線程)、UpdateHeap(更新堆)、CauseGC(引起垃圾回收)、StopProcess(停止進(jìn)程)、ScreenCapture(屏幕截圖)、Resetadb(重啟AndroidDebugBridge)菜單選項(xiàng),如圖51所示。Android程序運(yùn)行時(shí)的各種狀態(tài),比如進(jìn)程信息、線程分析、堆內(nèi)存的占用,結(jié)束一個(gè)進(jìn)等程。當(dāng)然,這些操作都是在DDMS框架下進(jìn)行的,日常開發(fā)的程序是無法執(zhí)行調(diào)用的。如果adb調(diào)試橋運(yùn)行不穩(wěn)定,可以選擇“resetadb”來重新啟動(dòng)“adb.exe”進(jìn)程。第58頁/共159頁LogCat使用“LogCat”通過“android.util.Log”類的靜態(tài)方法來查找錯(cuò)誤和打印系統(tǒng)日志消息。它是一個(gè)進(jìn)行日志輸出的API,我們?cè)贏ndroid程序中可以隨時(shí)為某一個(gè)對(duì)象插入一個(gè)Log,然后在DDMS中觀察LogCat的輸出是否正常。android.util.Log常用的方法有以下5個(gè):Log.v(Stringtag,Stringmsg);Log.d(Stringtag,Stringmsg);Log.i(Stringtag,Stringmsg);Log.w(Stringtag,Stringmsg);Log.e(Stringtag,Stringmsg);第59頁/共159頁LogCat使用這5種方法的首字母分別對(duì)應(yīng)VERBOSE、DEBUG、INFO、WARN、ERROR。當(dāng)利用DDMS進(jìn)行調(diào)試時(shí),它們的區(qū)別并不大,只是顯示的顏色不同,我們可以控制要顯示的某一類錯(cuò)誤,一般我們?nèi)绻褂谩皵帱c(diǎn)”方式來調(diào)試程序,則使用Log.e比較合適。但是根據(jù)規(guī)范建議Log.v,Log.d信息應(yīng)當(dāng)只存在于開發(fā)過程中,最終版本只可以包含Log.i,Log.w,Log.e這三種日志信息。第60頁/共159頁LogCat使用下面對(duì)“HelloWorld”程序進(jìn)行調(diào)試,首先修改“HelloWorld.java”第61頁/共159頁LogCat使用點(diǎn)擊“Run”→“Debug”菜單命令,進(jìn)入調(diào)試模式第62頁/共159頁LogCat使用切換到“DDMS”界面,在“Devices”標(biāo)簽中選擇項(xiàng)目運(yùn)行的AVD,并點(diǎn)擊“LogCat”標(biāo)簽第63頁/共159頁FileExplorer使用FileExplorer顯示的是已經(jīng)連接的AVD的文件及目錄,通過FileExplorer可以向AVD上傳文件或從AVD中下載文件的本地。下面介紹文件的上傳方法。在“Devices”標(biāo)簽中選擇已經(jīng)運(yùn)行的AVD,并選擇“FileExplorer”,打開SD卡所在的目錄,最后上傳文件,第64頁/共159頁斷點(diǎn)的使用在調(diào)試Android程序時(shí),我們同樣可以通過設(shè)置斷點(diǎn)的方式來調(diào)試程序。在啟動(dòng)應(yīng)用程序進(jìn)行調(diào)試時(shí),eclipse會(huì)自動(dòng)切換到Debug透視圖。毫無疑問,最常見的調(diào)試步驟是設(shè)置斷點(diǎn),這樣可以檢查條件語句或循環(huán)內(nèi)的變量和值。要在Java透視圖的PackageExplorer視圖中設(shè)置斷點(diǎn),雙擊選擇的源代碼文件,在一個(gè)編輯器中打開它。遍歷代碼,將鼠標(biāo)放在可疑代碼一行的標(biāo)記欄(在編輯器區(qū)域的左側(cè))上,雙擊即可設(shè)置斷點(diǎn)。(2)點(diǎn)擊“Run”→“Debug”菜單命令,切換到了“Debug”頁面,這里可以對(duì)程序進(jìn)行調(diào)試。第65頁/共159頁adb的使用Android調(diào)試橋(AndroidDebugBridge,adb)是多種用途的工具,該工具可以幫助我們管理設(shè)備(Android-powereddevice)或模擬器(emulatorinstance)的狀態(tài)。Android調(diào)試系統(tǒng)是一個(gè)客戶/服務(wù)器系統(tǒng),包括三個(gè)組成部分。

●一個(gè)在你用于開發(fā)程序的電腦上運(yùn)行的客戶端。你可以通過shell端使用adb命令啟動(dòng)客戶端。其他Android工具比如說ADT插件和DDMS同樣可以產(chǎn)生adb客戶端。

●在你用于發(fā)的機(jī)器上作為后臺(tái)進(jìn)程運(yùn)行的服務(wù)器。該服務(wù)器負(fù)責(zé)管理客戶端與運(yùn)行于模擬器或設(shè)備上的adb守護(hù)程序(daemon)之間的通信。

●一個(gè)以后臺(tái)進(jìn)程的形式運(yùn)行于模擬器或設(shè)備上的守護(hù)程序(daemon)。第66頁/共159頁(1)發(fā)出adb命令發(fā)出Android命令:可以在我們的開發(fā)機(jī)上的命令行或腳本上發(fā)布Android命令,使用方法:adb[-d|-e|-s<serialNumber>]<command>第67頁/共159頁(2)查詢模擬器或設(shè)備實(shí)例在發(fā)出adb命令之前,有必要知道什么樣的模擬器或設(shè)備實(shí)例與adb服務(wù)器是相連的。可以通過使用devices命令來得到一系列相關(guān)聯(lián)的模擬器或設(shè)備:adbdevices作為回應(yīng),adb為每個(gè)實(shí)例都制定了相應(yīng)的狀態(tài)信息:第68頁/共159頁(3)給特定的模擬器或設(shè)備實(shí)例發(fā)送命令如果有多個(gè)模擬器或設(shè)備實(shí)例在運(yùn)行,在發(fā)布adb命令時(shí)需要指定一個(gè)目標(biāo)實(shí)例。這樣做,需使用-s選項(xiàng)的命令。使用-s選項(xiàng)的格式是:adb-s<serialNumber><command>如上所示,給一個(gè)命令指定了目標(biāo)實(shí)例,這個(gè)目標(biāo)實(shí)例使用由adb分配的序列號(hào)。我們可以使用devices命令來獲得運(yùn)行著的模擬器或設(shè)備實(shí)例的序列號(hào)來運(yùn)行命令,如圖中所示,這個(gè)命令在emulator-5554上安裝軟件包ESFileExplorer.apk。第69頁/共159頁(4)安裝軟件我們可以使用adb從開發(fā)電腦上復(fù)制一個(gè)應(yīng)用程序,并且將其安裝在一個(gè)模擬器或設(shè)備實(shí)例。像這樣做,使用install命令。這個(gè)install命令要求我們必須指定所要安裝的.apk文件的路徑:adbinstall<path_to_apk>第70頁/共159頁(5)卸載軟件卸載軟件使用uninstall命令,其使用格式如下:adbuninstall<package>這里的package為安裝的軟件的包名,這里以我們前面的HelloWorld項(xiàng)目為例,包名即為“org.myandroid.HelloWorld”,當(dāng)運(yùn)行程序使模擬器死機(jī)時(shí),我們也可以使用uninstall命令來強(qiáng)行卸載這個(gè)應(yīng)用程序。第71頁/共159頁(6)啟動(dòng)shell命令db提供了shell端,通過shell端你可以在模擬器或設(shè)備上運(yùn)行各種命令。這些命令以2進(jìn)制的形式保存在本地的模擬器或設(shè)備的文件系統(tǒng)中。不管我們是否完全進(jìn)入到模擬器或設(shè)備的adb遠(yuǎn)程shell端,我們都能用shell命令來執(zhí)行命令。當(dāng)沒有完全進(jìn)入到遠(yuǎn)程shell的時(shí)候,這樣使用shell命令來執(zhí)行一條命令:adb[-d|-e|-s{<serialNumber>}]shell<shellCommand>進(jìn)入模擬器或設(shè)備的遠(yuǎn)程shell端時(shí),這樣使用shell命令:adb[-d|-e|-s{<serialNumber>}]shell第72頁/共159頁(6)啟動(dòng)shell命令通過adb遠(yuǎn)程shell端,我們可以通過sqlite3命令程序來管理數(shù)據(jù)庫。sqlite3工具包含了許多使用命令,比如:“.dump”:顯示表的內(nèi)容,“.schema”:可以顯示出已經(jīng)存在的表空間的SQLCREATE結(jié)果集。sqlite3還允許你遠(yuǎn)程執(zhí)行SQL命令。第73頁/共159頁(7)關(guān)閉adbserver在某些情況下,我們可能需要終止Android調(diào)試系統(tǒng)的運(yùn)行,然后再重新啟動(dòng)它。例如,如果Android調(diào)試系統(tǒng)不響應(yīng)命令,我們可以先終止服務(wù)器然后再重啟,這樣就可能解決這個(gè)問題,用kill-server可以終止adbserver??梢杂胊db發(fā)出的任何命令來重新啟動(dòng)服務(wù)器。kill-server命令的使用格式如下:adbkill-server第74頁/共159頁3.4導(dǎo)入已存在項(xiàng)目在安裝了Android開發(fā)環(huán)境之后,可以直接將Android項(xiàng)目導(dǎo)入到eclipse中。啟動(dòng)eclipse,選擇“File”→“Import…”菜單,展開“General”項(xiàng),選擇“ExistingProjectsintoWorkspace”導(dǎo)入項(xiàng)目到工作空間。第75頁/共159頁3.4導(dǎo)入已存在項(xiàng)目然后點(diǎn)擊“Next”按鈕,進(jìn)入選擇項(xiàng)目文件目錄,選擇好項(xiàng)目目錄后,點(diǎn)擊“Finish”按鈕,等待導(dǎo)入項(xiàng)目完成。如果需要將項(xiàng)目文件一起拷貝到工作空間,就需要選擇“Copyprojectsintoworkspace”復(fù)選框。第76頁/共159頁第四章

Android用戶界面開發(fā)4.1用戶界面開發(fā)簡介4.2單個(gè)Activity的用戶界面示例4.3多個(gè)Activity的用戶界面示例第77頁/共159頁4.1用戶界面開發(fā)簡介Android的用戶界面可以有兩種實(shí)現(xiàn)方式:使用XML或者是使用Java代碼。通過直接書寫代碼的方式來實(shí)現(xiàn)界面是比較麻煩的事情。舉個(gè)例子來說,如果我們有DHTML的經(jīng)驗(yàn),那么這兩者的區(qū)別可以比喻為:用XML來實(shí)現(xiàn)用戶界面就像直接寫HTML代碼,而用Java代碼來實(shí)現(xiàn)用戶界面就像用JavaScript創(chuàng)建DOM對(duì)象來拼接頁面。所以,使用XML來布局界面應(yīng)該是首選。第78頁/共159頁XML布局Android使用一個(gè)XML文件來定義用戶界面。為了方便理解,我們可以直接把它理解為一個(gè)HTML文件。事實(shí)上,它也確實(shí)比較像一個(gè)HTML文件。第79頁/共159頁XML布局這里面有一個(gè)比較重要的類叫做ViewGroup,這個(gè)XML的root節(jié)點(diǎn)必須是一個(gè)ViewGroup,或者是一個(gè)單一的Widget(整個(gè)XML只有一個(gè)元素)。Android幾乎所有的UI似乎都和ViewGroup有或多或少的關(guān)系。但是它只是一個(gè)abstractclass,并不能直接使用,我們能用的,是它的一些子類,例如:AbsoluteLayout、FrameLayout、LinearLayout、RelativeLayout、TableLayout等,第80頁/共159頁XML布局AbsoluteLayout:絕對(duì)定位的布局方式,在它內(nèi)部嵌套的元素必須指定具體的位置。FrameLayout:幀布局方式,說幀不太容易理解,可以說成是層布局方式,也就是說,在它內(nèi)部的元素,是一層一層的疊加在一起的。如果用過Photoshop,或者Flash,這里面的層的概念是和他們一致的。如果最上層的元素是不透明的,并且比下面的元素尺寸要大,那么將看不到下面的元素,只能看到頂層元素。這些層的順序是:最新聲明的放到最前面??梢赃@樣理解,Android按文件的書寫順序來組織這個(gè)布局,先聲明的放在第一層,再聲明的放到第二層,…,最后聲明的放在最頂層。第81頁/共159頁XML布局LinearLayout:線性布局方式,這種布局比較常用,也比較簡單,就是每個(gè)元素占一行,當(dāng)然也可能聲明為橫向排放,也就是每個(gè)元素占一列。RelativeLayout:相對(duì)定位的布局方式,在定位元素的位置的時(shí)候,使用相對(duì)位置,可以相對(duì)其他元素,也可以相對(duì)這個(gè)布局。就像是說:我現(xiàn)在站在A和B的中間;或者說,我站在隊(duì)伍的中間。前者就是相對(duì)其他元素來定義位置,后者是相對(duì)整個(gè)布局來定義位置。TableLayout:表格的布局方式,這里面的Table和HTML中的Table類似。第82頁/共159頁XML布局從上面這幾個(gè)類從名字就可看的出來,他們是Layout,也就是布局。如果用過HTML,那么每一個(gè)Layout,可以理解為有了特定排版樣式的DIV。在DIV的內(nèi)部,可以放置其他的DIV,當(dāng)然也可以放置最底層的元素,比如說文本、文本框、單選按鈕、圖片等等。這里面所說的最底層的元素,它們有一個(gè)超類叫做View,同時(shí)ViewGroup也是它的子類。ViewGroup就是能容納其他View的View。第83頁/共159頁ViewGroup和View總結(jié)(1)ViewGroupViewGroup是一個(gè)android.view.ViewGroup(android.view.View的子類)類的對(duì)象,顧名思義,ViewGroup是一個(gè)特殊的View對(duì)象,他的功能是裝載和管理一組下層的View和其他的ViewGroup,ViewGroup可以為UI增加結(jié)構(gòu),并且將復(fù)雜的屏幕元素構(gòu)成一個(gè)獨(dú)立的實(shí)體。作為一個(gè)基類,ViewGroup為Layout(布局)服務(wù),Layout則是一組提供屏幕界面通用類型的完全實(shí)現(xiàn)子類。Layout可以為一組View構(gòu)建一個(gè)結(jié)構(gòu)。第84頁/共159頁ViewGroup和View總結(jié)(2)View任何一個(gè)View對(duì)象都將繼承android.view.View類。它是一個(gè)存儲(chǔ)有屏幕上特定的一個(gè)矩形布局和內(nèi)容屬性的數(shù)據(jù)結(jié)構(gòu)。一個(gè)View對(duì)象可以處理測(cè)距、布局、繪圖、焦點(diǎn)變換、滾動(dòng)條,以及屏幕區(qū)域自己表現(xiàn)的按鍵和手勢(shì)。View類為Widget服務(wù),Widget則是一組用于繪制交互屏幕元素的完全實(shí)現(xiàn)子類。Widget處理自己的測(cè)距和繪圖,所以可以快速地用它們素構(gòu)建UI。可用到的Widget包括TextView、EditText、Button、RadioButton、CheckBox和ScrollView等。第85頁/共159頁XML布局總結(jié)(1)這個(gè)XML文件是由許多View嵌套組成的。(2)如果布局中有多個(gè)元素,那么最頂層必須是ViewGroup(一個(gè)ViewGroup對(duì)象同時(shí)也是一個(gè)View對(duì)象),不可以是View,如果整個(gè)布局只有一個(gè)元素,那么最頂層元素就是這個(gè)唯一的元素。(3)在ViewGroup可以內(nèi)部嵌套View(既然可以嵌套View,就更可以嵌套ViewGroup了)(4)在View中,不可嵌套其他東西了,要不然它就是ViewGroup了,就是這么定義的。第86頁/共159頁HelloWorld應(yīng)用程序用戶界面分析這里將針對(duì)上一章創(chuàng)建的“HelloWorld”項(xiàng)目,對(duì)其用戶界面作簡要介紹。main.xmlR.javaHelloWorld.java第87頁/共159頁main.xmlmain.xml源碼詳細(xì)解釋如下,這里每一種元素可以定義屬性有很多,并且這些屬性都可以和HTML的css中的屬性來類比。(1)首先,定義了一個(gè)LinearLayout,前面說過,這個(gè)布局要么將子元素水平排列,要么將它們豎直排列。(2)然后,定義了一個(gè)TextView,一個(gè)TextView,就是一塊區(qū)域,用來顯示文本,用這個(gè)View定義的元素只能用來顯示,是不可以編輯的,如果想要可編輯的文本塊,那么應(yīng)該使用它的子類EditText。第88頁/共159頁R.java這里涉及到了一些資源文件,直觀的說,就是res目錄下的那些目錄和文件,常用的有:●res/drawable/:用來存放圖片文件●res/layout/:用來存放布局定義文件●res/values/:用來存放一些變量、參數(shù)等文件第89頁/共159頁R.java這里涉及到了一些資源文件,直觀的說,就是res目錄下的那些目錄和文件,常用的有:●res/drawable/:用來存放圖片文件●res/layout/:用來存放布局定義文件●res/values/:用來存放一些變量、參數(shù)等文件這些資源文件都是獨(dú)立于代碼而存在的,在代碼中要訪問到這些資源需使用R.java文件。在Android的代碼中,有一個(gè)文件比較奇怪,這個(gè)文件就是R.java,在R.java的注釋部分,有這樣一段話:“AUTO-GENERATEFILE.DONOTMODIFY”,這個(gè)文件是自動(dòng)生成的,不要修改。第90頁/共159頁R.java●

這個(gè)文件就是Java代碼和獨(dú)立于Java代碼的資源文件之間的訪問窗口,Java程序可以通過R.java來訪問那些資源文件?!襁@個(gè)文件是在程序編譯過程中由aapt(AndroidAssetPackagingTool)自動(dòng)生成●這個(gè)文件中的屬性都是publicstaticfinal的,所以可以直接在Java代碼中引用,每個(gè)屬性都代表一個(gè)資源,看起來就像為每個(gè)資源都定義了一個(gè)ID,然后通過這個(gè)ID來訪問資源●所有的資源文件都被編譯進(jìn)最后生成的二進(jìn)制包中,這樣能夠帶來很高的性能和效率第91頁/共159頁HelloWorld.java接下來再看一下,如何在Java代碼中使用這個(gè)R.java。第92頁/共159頁HelloWorld.java這其中的R.layout.main,通過setContextView(),被Java程序調(diào)用。這段代碼中引入了另外一個(gè)非常重要的概念:Activity。如果套用MVC來理解的話:ViewGroup和View屬于View領(lǐng)域的東西,Activity可以理解為Control領(lǐng)域的東西,雖然可以這么類比著來理解,但是Activity其實(shí)做了更多的事情,由它將View和一些數(shù)據(jù)、操作等結(jié)合在一起,完成一個(gè)相對(duì)完整的行為、活動(dòng)。所以,任何View要被顯示,必須通過Activity來進(jìn)行。這樣每個(gè)Activity都會(huì)包含特定的行為,多個(gè)Activity互相合作,最終組成一個(gè)完整的Android程序。在示例的Activity中,有一個(gè)onCreate()方法,這個(gè)方法會(huì)在此Activity被創(chuàng)建的時(shí)刻調(diào)用。在方法內(nèi)部,設(shè)置此Activity的視圖為R.layout.main中定義的視圖,也就是res/layout/main.xml中定義的視圖(視圖、布局、GUI、UI意義相同,可統(tǒng)一用View表示)。第93頁/共159頁4.2單個(gè)Activity的用戶界面示例一個(gè)簡單的和用戶交互的示例,這個(gè)程序的需求是:

●畫面上有三行元素,第一行是一個(gè)TextView,用來顯示文字●第二行是一個(gè)EditText,用戶將在此輸入文字●第三行是一個(gè)Button●用戶點(diǎn)擊Button之后,會(huì)在第一行的TextView中顯示:Hello,(用戶在第二行中輸入的文字)。比如說用戶在輸入框中輸入:“UI”,那么點(diǎn)擊Button之后,會(huì)在顯示區(qū)域顯示:“Hello,UI”。第94頁/共159頁4.2單個(gè)Activity的用戶界面示例要完成這個(gè)程序,首先是創(chuàng)建一個(gè)Android項(xiàng)目,這個(gè)默認(rèn)創(chuàng)建的項(xiàng)目實(shí)際就是一個(gè)最基本的“HelloWorld”項(xiàng)目,但此時(shí)新建的項(xiàng)目名字命名為“HelloOneActivity”,然后是在此基礎(chǔ)上修改與完善項(xiàng)目,這里大概需要用5步:第95頁/共159頁UI的設(shè)計(jì)(1)先完成UI的設(shè)計(jì),修改在res/layout/目錄下的main.xml的文件第96頁/共159頁UI的設(shè)計(jì)這里解釋一下這幾個(gè)語句:●android:id=”@+id/textview_display”這個(gè)是用來為當(dāng)前的View聲明一個(gè)ID,這樣,在Java程序中就可以通過這個(gè)ID來找到這個(gè)元素,進(jìn)而能夠操作這個(gè)元素。●android:textSize=”20px”聲明字體大小為20px,對(duì)于每種View,都會(huì)有一系列的可以設(shè)置的屬性,具體的屬性可參考每個(gè)View的說明文檔。第97頁/共159頁聲明資源(2)創(chuàng)建好這個(gè)布局文件之后,再把這個(gè)文件需要的android:text=”@string/sayhello”在res/values/strings.xml中聲明一下。這時(shí)已經(jīng)可以運(yùn)行一下這個(gè)Activity,看看最終顯示的效果是否和預(yù)期的一致,如果有差別,可再調(diào)整一下。第98頁/共159頁修改交互動(dòng)作第3步,現(xiàn)在,UI已經(jīng)設(shè)計(jì)好了,修改ADT自動(dòng)創(chuàng)建的Activity,其名字為:HelloOneActivity.java,用這個(gè)Activity來顯示這個(gè)UI。第99頁/共159頁修改交互動(dòng)作這里面有些語句需要解釋:●Buttonbutton=(Button)findViewById(R.id.button_sayhello)這個(gè)語句中的findViewById()是一個(gè)比較簡單、重要、常用并且是一直用的語句,其功能就是在當(dāng)前的ContentView中按ID來找到對(duì)應(yīng)的View。例如這里,通過R.id.button_sayhello,就能找到第1步提到的Button了。這里面的R.id.button_sayhello是在Build的時(shí)候,由aapt自動(dòng)生成的R.java中的內(nèi)容。對(duì)資源文件中的android:id=”@+id/textview_display”,就會(huì)在R.java中對(duì)應(yīng)的生成一個(gè)ID。●button.setOnClickListener(newView.OnClickListener())現(xiàn)在的GUI程序,好像都喜歡事件驅(qū)動(dòng)的模型,有人這樣描述過GUI系統(tǒng)本質(zhì):在事件驅(qū)動(dòng)下動(dòng)態(tài)地展現(xiàn)數(shù)據(jù)模型的圖形系統(tǒng)。在這個(gè)語句中,setOnClickListener就是為button添加一個(gè)事件監(jiān)聽,監(jiān)聽OnClick事件,也就是說,如果一旦觸發(fā)button的OnClick事件,就會(huì)執(zhí)行后面定義的功能。第100頁/共159頁運(yùn)行程序接口(4)運(yùn)行程序第101頁/共159頁4.3多個(gè)Activity的用戶界面示例這里將解釋如何創(chuàng)建多個(gè)Activity的用戶界面,以及了解Activity的生命周期。這個(gè)多Activity的示例程序的功能大概是這樣的:●在主頁面上有三個(gè)元素:一個(gè)文本輸入框,兩個(gè)按鈕。用戶可以在文本框中輸入一些字符●點(diǎn)擊第一個(gè)按鈕,將彈出一個(gè)對(duì)話框形式的Activity,顯示”Hello,…”●如果點(diǎn)擊的是第二個(gè)按鈕,將顯示另一個(gè)全屏的Activity,顯示”Hello,…”第102頁/共159頁4.3多個(gè)Activity的用戶界面示例(1)創(chuàng)建項(xiàng)目。這里,項(xiàng)目的名字為“HelloThreeActivity”,應(yīng)用程序的名字為“ActivityLifecycle”,包名為“org.myandroid.HelloThreeActivity”,默認(rèn)創(chuàng)建的Activity的名字為“ActivityLifecycle”。第103頁/共159頁4.3多個(gè)Activity的用戶界面示例(2)先完成UI的設(shè)計(jì),創(chuàng)建布局。從程序來看,似乎有三個(gè)Activity,但是第二個(gè)和第三個(gè)幾乎是相同的,于是,只創(chuàng)建兩個(gè)布局。第104頁/共159頁main.xml內(nèi)容第105頁/共159頁dialog.xml內(nèi)容豐富第106頁/共159頁4.3多個(gè)Activity的用戶界面示例(3)然后,需要把上面提到的字符變量聲明一下,修改res/values/strings.xml第107頁/共159頁4.3多個(gè)Activity的用戶界面示例(4)創(chuàng)建Activity,需要定義三個(gè)Activity:分別將他們定義為:ActivityLifecycle(用來顯示主畫面)、AlertDialog(用來顯示對(duì)話框)和AlertActivity(用來顯示那個(gè)全屏的Activity)。(5)編輯AndroidManifest.xml,這個(gè)文件像一個(gè)戶口簿一樣記錄每一個(gè)Activity的信息,Android系統(tǒng)會(huì)通過這個(gè)文件得到:執(zhí)行這個(gè)程序的時(shí)候,啟動(dòng)的是那個(gè)Activity等信息。不僅如此,這個(gè)還包括Intent、Provider等其他一些信息。(6)這時(shí)就可以運(yùn)行程序了。第108頁/共159頁生命周期的詳細(xì)說明●如果一個(gè)Activity顯示在最前端,它的狀態(tài)是active或者是running●如果一個(gè)Activity失去焦點(diǎn),但是還能在屏幕上看到它,比如說,被一個(gè)非全屏的或者是透明的另一個(gè)Activity遮蓋,它此時(shí)的狀態(tài)是paused。一個(gè)處于paused狀態(tài)的Activity,保持著所有自身的狀態(tài)和信息,秉持著與windowmanager的聯(lián)系,但是當(dāng)系統(tǒng)內(nèi)存不足時(shí),可能會(huì)被系統(tǒng)終止●如果一個(gè)Activity完全看不見了,被其他的Activity完全擋住,它的狀態(tài)變成stopped。處于stopped的Activity雖然也保留著如同paused狀態(tài)一樣的特性,但是此時(shí)的它更容易被系統(tǒng)終止●如果一個(gè)Activity處于paused或者stopped狀態(tài)時(shí),系統(tǒng)可以通過要求Activity結(jié)束或者強(qiáng)制kill的方式從內(nèi)存中刪除這個(gè)Activity,當(dāng)它在此需要顯示時(shí),就需要restart和重新加載以前的數(shù)據(jù),可見,適時(shí)的保存數(shù)據(jù)的重要性第109頁/共159頁Android應(yīng)用的生命周期第110頁/共159頁第五章

Android數(shù)據(jù)存儲(chǔ)開發(fā)5.1SharedPreferences5.2Files5.3SQLite5.4Network5.5ContentProvider第111頁/共159頁數(shù)據(jù)存儲(chǔ)開發(fā)概述在Android中,可供選擇的存儲(chǔ)方式主要有5種,分別是SharedPreferences、Files(文件)、SQLite(SQLite數(shù)據(jù)庫)、Network(網(wǎng)絡(luò))和ContentProvider(內(nèi)容提供器)。●SharedPreferences,類似于我們常用的ini文件,用來保存應(yīng)用程序的一些屬性設(shè)置,在Android平臺(tái)常用于存儲(chǔ)較簡單的參數(shù)設(shè)置。數(shù)據(jù)存放在目錄:/data/data/<packagename>/shared_prefs/中,存儲(chǔ)成XML格式的文件。我們無法在多個(gè)應(yīng)用程序間共享Preferences數(shù)據(jù)?!馞iles(文件存取I/O),文件用來存儲(chǔ)大數(shù)量的數(shù)據(jù)采用java.io.*庫所提供有I/O接口,讀寫文件。只有本地文件可以被訪問。優(yōu)點(diǎn)是可以存儲(chǔ)大容量的數(shù)據(jù),其缺點(diǎn)是文件更新或是格式改變可能會(huì)導(dǎo)致巨大的編程工作。第112頁/共159頁數(shù)據(jù)存儲(chǔ)開發(fā)概述●

SQLite(SQLite數(shù)據(jù)庫),SQLite是一個(gè)開源的輕量級(jí)關(guān)系型數(shù)據(jù)庫,具有ACID(指數(shù)據(jù)庫事務(wù)正確執(zhí)行的四個(gè)基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability))的特性。其體積大小只用幾千字節(jié),部分的支持一些SQL的指令,例如:ALTER、TABLE等。Android提供了一個(gè)名為SQLiteDatabase的類,該類封裝了一些操作數(shù)據(jù)庫的API,使用該類可以完成對(duì)數(shù)據(jù)進(jìn)行添加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作(這些操作簡稱為CRUD)?!馧etwork(網(wǎng)絡(luò)),Android還提供了網(wǎng)絡(luò)存儲(chǔ)數(shù)據(jù)的方式,需要要使用兩個(gè)包:.*和.*。其實(shí)就是與網(wǎng)絡(luò)服務(wù)器取得聯(lián)系,將數(shù)據(jù)存放于網(wǎng)絡(luò)服務(wù)器上或從網(wǎng)絡(luò)服務(wù)器讀取數(shù)據(jù)。第113頁/共159頁數(shù)據(jù)存儲(chǔ)開發(fā)概述●ContentProvider,ContentProvider是所有應(yīng)用程序之間數(shù)據(jù)存儲(chǔ)和檢索的一個(gè)橋梁,它的作用就是使得各個(gè)應(yīng)用程序之間實(shí)現(xiàn)數(shù)據(jù)共享。Android為常見的一些數(shù)據(jù)提供了ContentProvider(包括音頻、視頻、圖片和通訊錄)。每個(gè)ContentProvider都會(huì)對(duì)外提供一個(gè)公共的URI(包裝成Uri對(duì)象),如果應(yīng)用程序有數(shù)據(jù)需要共享時(shí),就需要使用ContentProvider為這些數(shù)據(jù)定義一個(gè)URI,然后其他的應(yīng)用程序就可以通過ContentProvider傳入這個(gè)URI來對(duì)數(shù)據(jù)進(jìn)行操作。URI由3個(gè)部分組成:"content://"、數(shù)據(jù)的路徑、標(biāo)識(shí)ID(可選)。第114頁/共159頁5.1SharedPreferences首先介紹的是SharedPreferences,它是Android提供用來存儲(chǔ)一些簡單的配置信息的一種機(jī)制,例如,一些默認(rèn)歡迎語、登錄的用戶名和密碼等。其以鍵值對(duì)的方式存儲(chǔ),使得我們可以很方便的讀取和存入,下面是一個(gè)示例,其功能是保存文本框中的數(shù)據(jù),這里的用戶名和密碼。(1)新建Android項(xiàng)目“HelloSharedPreferences”。(2)修改其布局文件main.xml。在一個(gè)LinearLayout當(dāng)中放3個(gè)TextView和兩個(gè)EditView組件。第115頁/共159頁5.1SharedPreferences(3)修改HelloSharedPreferences.java,使得應(yīng)用程序退出時(shí),自動(dòng)保存上面文件框中的內(nèi)容。在onCreate中使用findViewById得到兩個(gè)EditView后,使用getSharedPreferences取得SharedPreferences對(duì)象settings,然后使用getString取得其中保存的值,最后使用setText將其值設(shè)置為兩個(gè)EditText的值。而在程序運(yùn)行onStop過程,也就是在程序退出時(shí),首先使用getSharedPreferences得到settings;然后調(diào)用edit()方法使其處于可以編輯狀態(tài),并使用putString將兩個(gè)EditText中的值保存起來;最后使用commit()方法提交即可保存。第116頁/共159頁5.1SharedPreferences(4)運(yùn)行程序。第117頁/共159頁5.2Files和傳統(tǒng)的Java中實(shí)現(xiàn)I/O的程序類似,在Android中,其提供了openFileInput和openFileOuput方法讀取設(shè)備上的文件,下面是一個(gè)示例程序,其功能是將文本框中輸入的內(nèi)容存入在文件中去。(1)創(chuàng)建“HelloFiles”項(xiàng)目。(2)修改布局文件main.xml。(3)在strings.xml中增加上面用的資源。(4)最后就是增加按鈕按下時(shí),把文本框中的內(nèi)容存入文件test.txt中的處理事件,在HelloFiles.java中增加內(nèi)容。第118頁/共159頁5.2Files(5)運(yùn)行程序,當(dāng)點(diǎn)下“Savetofile”時(shí),可在Android系統(tǒng)中的“/data/data/PACKAGE_NAME/files”目錄下看到應(yīng)用程序創(chuàng)建的text.txt文件。第119頁/共159頁5.3SQLiteSQLite是Android所帶的一個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)庫,它支持SQL語句,它是一個(gè)輕量級(jí)的嵌入式數(shù)據(jù)庫。這里以一個(gè)示例來說明在Android中對(duì)數(shù)據(jù)庫操作過程,在這個(gè)例子中,主要的內(nèi)容有如何新建一個(gè)數(shù)據(jù)庫;如何新建數(shù)據(jù)庫里邊的數(shù)據(jù)表;如何刪除數(shù)據(jù)庫里邊的數(shù)據(jù)表;如何在數(shù)據(jù)表中添加新數(shù)據(jù);如何刪除數(shù)據(jù)庫表中的數(shù)據(jù)等。第120頁/共159頁5.3SQLite在進(jìn)行數(shù)據(jù)庫開發(fā)之前,需要了解什么是SQLiteDatabase及SQLiteOpenHelper?!馭QLiteDatabase,一個(gè)SQLiteDatabase的實(shí)例代表了一個(gè)SQLite的數(shù)據(jù)庫,通過SQLiteDatabase實(shí)例的一些方法,我們可以執(zhí)行SQL語句,對(duì)數(shù)據(jù)庫進(jìn)行增、刪、查、改的操作。需要注意的是,數(shù)據(jù)庫對(duì)于一個(gè)應(yīng)用來說是私有的,并且在一個(gè)應(yīng)用當(dāng)中,數(shù)據(jù)庫的名字也是惟一的。第121頁/共159頁5.3SQLite●SQLiteOpenHelper,根據(jù)這名字,我們可以看出這個(gè)類是一個(gè)輔助類。這個(gè)類主要生成一個(gè)數(shù)據(jù)庫,并對(duì)數(shù)據(jù)庫的版本進(jìn)行管理。當(dāng)在程序當(dāng)中調(diào)用這個(gè)類的方法getWritableDatabase()或者getReadableDatabase()方法的時(shí)候,如果當(dāng)時(shí)沒有數(shù)據(jù),那么Android系統(tǒng)就會(huì)自動(dòng)生成一個(gè)數(shù)據(jù)庫。SQLiteOpenHelper是一個(gè)抽象類,我們通常需要繼承它,并且實(shí)現(xiàn)里邊的3個(gè)函數(shù),具體函數(shù)如下所示?!鬿nCreate(SQLiteDatabase):在數(shù)據(jù)庫第一次生成的時(shí)候會(huì)調(diào)用這個(gè)方法,一般我們?cè)谶@個(gè)方法里邊生成數(shù)據(jù)庫表?!鬿nUpgrade(SQLiteDatabase,int,int):當(dāng)數(shù)據(jù)庫需要升級(jí)的時(shí)候,Android系統(tǒng)會(huì)主動(dòng)的調(diào)用這個(gè)方法。一般我們?cè)谶@個(gè)方法里邊刪除數(shù)據(jù)表,并建立新的數(shù)據(jù)表,當(dāng)然是否還需要做其他的操作,完全取決于應(yīng)用的需求。◆onOpen(SQLiteDatabase):這是當(dāng)打開數(shù)據(jù)庫時(shí)的回調(diào)函數(shù),一般也不會(huì)用到。第122頁/共159頁5.3SQLite(1)創(chuàng)建項(xiàng)目“HelloSQLite”項(xiàng)目。(2)修改布局文件main.xml這個(gè)界面的布局信息都在main.xml文件中,在一個(gè)LinearLayout當(dāng)中數(shù)值排列了5個(gè)Button,對(duì)應(yīng)功能可參見項(xiàng)目表代碼。(3)我們?cè)贖elloSQLite.java文件中看到內(nèi)部類DatabaseHelper。DatabaseHelper類繼承SQLiteOpenHelper,并且重寫了onCreate和onUpgrade方法。在onCreate()方法里邊首先我們構(gòu)造一條SQL語句,然后調(diào)用db.execSQL(sql)執(zhí)行SQL語句。這條SQL語句為我們生成了一張數(shù)據(jù)庫表。目前我們還不需要升級(jí)數(shù)據(jù)庫,所以我們?cè)趏nUpgrade()函數(shù)里邊沒有執(zhí)行任何操作。第123頁/共159頁5.3SQLite(4)插入記錄操作。我們單擊插入兩條記錄的按鈕,如果數(shù)據(jù)成功插入到數(shù)據(jù)庫當(dāng)中的diary表中,那么在界面的title區(qū)域就會(huì)有成功的提示。單擊“插入兩條記錄”按鈕后,程序執(zhí)行了監(jiān)聽器里的onClick方法,并最終執(zhí)行了上述程序里的insertItem方法。(5)查詢記錄。單擊“查詢數(shù)據(jù)庫”的按鈕,會(huì)在界面的title區(qū)域顯示當(dāng)前數(shù)據(jù)表當(dāng)中數(shù)據(jù)的條數(shù)。單擊這個(gè)按鈕后,程序執(zhí)行了監(jiān)聽器里的onClick方法,并最終執(zhí)行了上述程序里的showItems方法,第124頁/共159頁5.3SQLite(6)刪除記錄。單擊“刪除一條記錄”的按鈕后,如果成功刪除,我們可以看到在屏幕的標(biāo)題(title)區(qū)域有文字提示。單擊刪除一條記錄的按鈕后,程序執(zhí)行了監(jiān)聽器里的onClick方法,并最終執(zhí)行了上述程序里的deleteItem方法。(7)刪除數(shù)據(jù)表。單擊“刪除數(shù)據(jù)表”,我們可以刪除diary這張數(shù)據(jù)表。(8)重新建立數(shù)據(jù)表。第125頁/共159頁5.3SQLite(9)完成整個(gè)應(yīng)用程序的編寫,并運(yùn)行程序。第126頁/共159頁5.4Network前面介紹的幾種存儲(chǔ)都是將數(shù)據(jù)存儲(chǔ)在本地設(shè)備上,除此之外,還有一種存儲(chǔ)(獲?。?shù)據(jù)的方式,通過網(wǎng)絡(luò)來實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和獲取,下面看一個(gè)在Android上調(diào)用WebService的例子。(1)功能說明,通過郵政編碼查詢?cè)摰貐^(qū)的天氣預(yù)報(bào),以POST發(fā)送的方式發(fā)送請(qǐng)求到站點(diǎn),訪問WebS站點(diǎn)上提供查詢天氣預(yù)報(bào)的服務(wù),具體信息請(qǐng)參考其WSDL文檔,網(wǎng)址為:/WeatherForecast.asmx?WSDL。輸入:美國某個(gè)城市的郵政編碼。輸出:該郵政編碼對(duì)應(yīng)城市的天氣預(yù)報(bào)。第127頁/共159頁5.4Network(2)實(shí)現(xiàn)過程將分以下幾步完成,首先是建立一個(gè)Android項(xiàng)目,由于需要訪問外部網(wǎng)絡(luò),創(chuàng)建完項(xiàng)目后,需要在AndroidManifest.xml文件中加入如下代碼申請(qǐng)權(quán)限許可。(3)實(shí)現(xiàn)網(wǎng)絡(luò)應(yīng)用,這里只是簡單的運(yùn)行程序,然后在LogCat中返回結(jié)果。以HTTPPOST的方式發(fā)送(這里的SERVER_URL并不是指WSDL的URL,而是服務(wù)本身的URL)。第128頁/共159頁5.4Network(4)運(yùn)行程序,從LogCat中查看運(yùn)行結(jié)果。第129頁/共159頁5.5ContentProviderAndroid這個(gè)系統(tǒng)和其他的操作系統(tǒng)還不太一樣,數(shù)據(jù)在Android當(dāng)中是私有的,當(dāng)然這些數(shù)據(jù)包括文件數(shù)據(jù)和數(shù)據(jù)庫數(shù)據(jù)以及一些其他類型的數(shù)據(jù)。為了能使兩個(gè)程序之間能夠進(jìn)行數(shù)據(jù)進(jìn)行的交換,解決的辦法主要靠ContentProvider。ContentProviderContentResolverUri第130頁/共159頁ContentProvider一個(gè)ContentProvider類實(shí)現(xiàn)了一組標(biāo)準(zhǔn)的方法接口,從而能夠讓其他的應(yīng)用保存或讀取此ContentProvider的各種數(shù)據(jù)類型。也就是說,一個(gè)程序可以通過實(shí)現(xiàn)一個(gè)ContentProvider的抽象接口將自己的數(shù)據(jù)暴露出去。外界根本看不到,也不用看到這個(gè)應(yīng)用暴露的數(shù)據(jù)在應(yīng)用當(dāng)中是如何存儲(chǔ)的,或者是用數(shù)據(jù)庫存儲(chǔ)還是用文件存儲(chǔ),還是通過網(wǎng)上獲得,這些一切都不重要,重要的是外界可以通過這一套標(biāo)準(zhǔn)及統(tǒng)一的接口和程序里的數(shù)據(jù)打交道,可以讀取程序的數(shù)據(jù),也可以刪除程序的數(shù)據(jù)。第131頁/共159頁ContentProviderContentProvider常見接口query(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder):通過Uri進(jìn)行查詢,返回一個(gè)Cursor。insert(Uriurl,ContentValuesvalues):將一組數(shù)據(jù)插入到Uri指定的地方。update(Uriuri,ContentValuesvalues,Stringwhere,String[]selectionArgs):更新Uri指定位置的數(shù)據(jù)。delete(Uriurl,Stringwhere,String[]selectionArgs):刪除指定Uri并且符合一定條件的數(shù)據(jù)。第132頁/共159頁ContentResolver外界的程序通過ContentResolver接口可以訪問ContentProvider提供的數(shù)據(jù),在Activity當(dāng)中通過getContentResolver()可以得到當(dāng)前應(yīng)用的ContentResolver實(shí)例。ContentResolver提供的接口和ContentProvider中需要實(shí)現(xiàn)的接口對(duì)應(yīng),主要有以下幾個(gè)。query(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder):通過Uri進(jìn)行查詢,返回一個(gè)Cursor。insert(Uriurl,ContentValuesvalues):將一組數(shù)據(jù)插入到Uri指定的地方。update(Uriuri,ContentValuesvalues,Stringwhere,String[]selectionArgs):更新Uri指定位置的數(shù)據(jù)。delete(Uriurl,Stringwhere,String[]selectionArgs):刪除指定Uri并且符合一定條件的數(shù)據(jù)。第133頁/共159頁Uri在ContentProvider和ContentResolver當(dāng)中用到了Uri的形式通常有兩種,一種是指定全部數(shù)據(jù),另一種是指定某個(gè)ID的數(shù)據(jù)。我們看下面的例子。content://contacts/people/ 這個(gè)Uri指定的就是全部的聯(lián)系人數(shù)據(jù)。content://contacts/people/1 這個(gè)Uri指定的是ID為1的聯(lián)系人的數(shù)據(jù)。第134頁/共159頁Uri在上邊兩個(gè)類中用到的Uri一般由3部分組成。第一部分是:"content://"。第二部分是:要獲得數(shù)據(jù)的一個(gè)字符串片段。最后就是:ID(如果沒有指定ID,那

溫馨提示

  • 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)論