Android平臺開發(fā)簡介_第1頁
Android平臺開發(fā)簡介_第2頁
Android平臺開發(fā)簡介_第3頁
Android平臺開發(fā)簡介_第4頁
Android平臺開發(fā)簡介_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、AndroidAndroid平臺開發(fā)簡介平臺開發(fā)簡介平臺介紹及開發(fā)基本流程2011-42011-4月月什么是Android? Android是Google在2007年11月5日推出的開源手機(jī)操作系統(tǒng)。目前Android在中國的發(fā)展是 非常火的,為了節(jié)省研發(fā)費(fèi)用,國內(nèi)很多的手機(jī)廠商和移動運(yùn)營商紛紛加入到了android陣營,其中包括中國移動,中國聯(lián)通,中國電信,華為,聯(lián)想等大企業(yè)。在中國不管是知名的手機(jī)生產(chǎn)廠商還是山寨手機(jī)廠商,都已經(jīng)開始生產(chǎn)Android操作系統(tǒng)的手機(jī)。另外android應(yīng)用的范圍不僅僅在手機(jī),還被應(yīng)用在汽車、平板電腦、和智能上網(wǎng)設(shè)備上,聽說國外已經(jīng)有了安裝有Android系統(tǒng)

2、,并且能夠上網(wǎng)的智能電飯煲,用戶在千里之外就可以操作電飯煲進(jìn)行煮飯。由于大家大多使用的手機(jī)都屬傻瓜手機(jī),也就是打打電話、發(fā)發(fā)短信。從今天開始,大家就應(yīng)該改變這個觀念了,你們需要把智能手機(jī)看作是一臺電腦,它能完成電腦所能完成的一切。所以你可以像在電腦一樣,在智能手機(jī)上安裝軟件,以滿足你工作和生活的需要。如何安裝 Android SDK 和Eclipse 插件所需開發(fā)環(huán)境所需開發(fā)環(huán)境:JDK 5或以上版本(僅有JRE不夠) 、Eclipse 3.4 或以上版本,推薦使用“伽利略”版。下載用于在下載用于在Eclipse 開發(fā)開發(fā)android應(yīng)用的應(yīng)用的ADT 插件插件 在企業(yè)開發(fā)中,很多程序員使用

3、Eclipse IDE作為應(yīng)用的開發(fā)環(huán)境。為了使得Android應(yīng)用的創(chuàng)建,運(yùn)行和調(diào)試更加方便快捷。Android的開發(fā)團(tuán)隊(duì)專門針對Eclipse IDE定制了一個插件:Android Development Tools(ADT) 下載地址:http:/ Eclipse 插件插件 (ADT)啟動 Eclipse,選擇 Help Install New Software,在出現(xiàn)的對話框里,點(diǎn)擊Add按鈕,在對話框的name一欄輸入“ADT”, 然后點(diǎn)擊Archive.,瀏覽和選擇已經(jīng)下載的ADT插件插件壓縮文件。 點(diǎn)擊 OK.。返回可用軟件的視圖,你會看到這個插件,然后選擇Developer T

4、ools (會選中下面的“Android Developer Tools”和 “Android Editors“),點(diǎn)擊 Next,最后重啟 Eclipse。下載安裝下載安裝Android SDK:Android SDK包含了開發(fā)Android應(yīng)用所依賴的jar文件、運(yùn)行環(huán)境及相關(guān)工具。 下載地址: http:/ Eclipse,選擇window-preferences,在打開的視圖左邊點(diǎn)擊android,在右邊的SDK Location中選擇Android SDK所在位置。開發(fā)第一個Android應(yīng)用打開Eclipse,新建項(xiàng)目(點(diǎn)擊FileNewProject),在項(xiàng)目列表中展開Andro

5、id目錄,選擇Android Project,如下圖:開發(fā)第一個Android應(yīng)用開發(fā)第一個Android應(yīng)用點(diǎn)擊”finish”即可完成項(xiàng)目的創(chuàng)建,創(chuàng)建后的項(xiàng)目已經(jīng)是一個可運(yùn)行的Android應(yīng)用,我們可以通過下面方式運(yùn)行此應(yīng)用:點(diǎn)擊工具欄上機(jī)器人形狀的虛擬設(shè)備管理器(簡稱“AVD“),如下:開發(fā)第一個Android應(yīng)用“尚未注冊網(wǎng)絡(luò)”錯誤信息的解決辦法打開Android模擬器時,出現(xiàn)無信號,拔打電話或發(fā)短信時,提示“尚未注冊網(wǎng)絡(luò)”錯誤信息的解決方案如下。l 場景一:你的電腦沒有連接上互聯(lián)網(wǎng),同時也沒有在局域網(wǎng)。 解決辦法:右鍵點(diǎn)擊網(wǎng)上鄰居,選擇屬性,在網(wǎng)絡(luò)連接窗口中右鍵點(diǎn)擊本地連接,選擇屬

6、性,設(shè)置TCP/IP屬性如下: IP地址:00 子網(wǎng)掩碼: 默認(rèn)網(wǎng)關(guān):00 首選DNS服務(wù)器:00l 場景二:你的電腦沒有連接上互聯(lián)網(wǎng),但在局域網(wǎng)。 解決辦法:右鍵點(diǎn)擊網(wǎng)上鄰居,選擇屬性,在網(wǎng)絡(luò)連接窗口中右鍵點(diǎn)擊本地連接,選擇屬性,設(shè)置TCP/IP屬性如下: IP地址:設(shè)置成你所在局域網(wǎng)的IP,如:00 子網(wǎng)掩碼:設(shè)置成你所在局域網(wǎng)的掩碼,如: 默認(rèn)網(wǎng)關(guān):設(shè)置成你所在局域網(wǎng)的網(wǎng)關(guān),一般網(wǎng)關(guān)的IP格式為:*.*.*.1,如: 首選DNS

7、服務(wù)器:設(shè)置成你所在局域網(wǎng)的路由器IP,一般路由器的IP格式為:*.*.*.1,如:l 最后一種解決方案是:讓你的電腦連接上互聯(lián)網(wǎng)。開發(fā)第一個Android應(yīng)用在項(xiàng)目上右鍵點(diǎn)擊run as Android application,如下圖:Android應(yīng)用程序架構(gòu)src/ java原代碼存放目錄原代碼存放目錄gen/ 自動生成目錄自動生成目錄gen 目錄中存放所有由Android開發(fā)工具自動生成的文件。目錄中最重要的就是R.java文件。 這個文件由Android開發(fā)工具自動產(chǎn)生的。Android開發(fā)工具會自動根據(jù)你放入res目錄的xml界面文件、圖標(biāo)與常量,同步更新修改

8、R.java文件。正因?yàn)镽.java文件是由開發(fā)工具自動生成的,所以我們應(yīng)避免手工修改R.java。R.java在應(yīng)用中起到了字典的作用,它包含了界面、圖標(biāo)、常量等各種資源的id,通過R.java,應(yīng)用可以很方便地找到對應(yīng)資源。另外編繹器也會檢查R.java列表中的資源是否被使用到,沒有被使用到的資源不會編繹進(jìn)軟件中,這樣可以減少應(yīng)用在手機(jī)占用的空間。res/ 資源資源(Resource)目錄目錄在這個目錄中我們可以存放應(yīng)用使用到的各種資源,如xml界面文件,圖片或數(shù)據(jù)。assets資源目錄資源目錄Android除了提供/res目錄存放資源文件外,在/assets目錄也可以存放資源文件,而且/

9、assets目錄下的資源文件不會在R.java自動生成ID,所以讀取/assets目錄下的文件必須指定文件的路徑,如:file:/android_asset/xxx.3gpAndroidManifest.xml 項(xiàng)目清單文件項(xiàng)目清單文件 這個文件列出了應(yīng)用程序所提供的功能,以后你開發(fā)好的各種組件需要在該文件中進(jìn)行配置,如果應(yīng)用使用到了系統(tǒng)內(nèi)置的應(yīng)用(如電話服務(wù)、互聯(lián)網(wǎng)服務(wù)、短信服務(wù)、GPS服務(wù)等等),你還需在該文件中聲明使用權(quán)限。perties 項(xiàng)目環(huán)境信息項(xiàng)目環(huán)境信息,一般是不需要修改此文件Android中的顯示單位l px (pixels)像素 一般HVGA代表320

10、 x480像素,這個用的比較多。l dip或dp (device independent pixels)設(shè)備獨(dú)立像素 這個和設(shè)備硬件有關(guān),一般為了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。l sp (scaled pixels best for text size)比例像素 主要處理字體的大小,可以根據(jù)系統(tǒng)的字體自適應(yīng)。除了上面三個顯示單位,下面還有幾個不太常用:l in (inches)英寸l mm (millimeters)毫米 l pt (points)點(diǎn),1/72英寸為了適應(yīng)不同分辨率,不同的像素密度,推薦使用dip ,文字使用sp。Android開發(fā)平臺是開放的平臺

11、,而位于四層框架頂端的應(yīng)用開發(fā),必然涉及到Android組件。本文將為大家詳細(xì)介紹Android組件。 組件(Component),在談及所謂架構(gòu)和重用的時候,是一個重要的事情。很多時候都會說基于組件的軟件架構(gòu),指的是期望把程序做樂高似的,有一堆接口標(biāo)準(zhǔn)封裝完整的組件放在哪里,想用的時候取上幾個一搭配,整個程序就構(gòu)建完成了。 在開篇的時候就在說,Android是一個為組件化而搭建的平臺,它引入所謂Mash-Up的概念,這使得你在應(yīng)用的最上層,想做的不組件化都是很困難的一件事,具體說來,Android有四大組件:Activity、Service、Broadcast Receiver、Conten

12、t Provider。 Android四大組建Activity是為用戶操作而展示的可視化用戶界面。比如說,一個activity可以展示一個菜單項(xiàng)列表供用戶選擇,或者顯示一些包含說明的照片。一個短消息應(yīng)用程序可以包括一個用于顯示做為發(fā)送對象的聯(lián)系人的列表的activity,一個給選定的聯(lián)系人寫短信的activity以及翻閱以前的短信和改變設(shè)置的activity。盡管它們一起組成了一個內(nèi)聚的用戶界面,但其中每個activity都與其它的保持獨(dú)立。每個都是以Activity類為基類的子類實(shí)現(xiàn)。一個應(yīng)用程序可以只有一個activity,或者,如剛才提到的短信應(yīng)用程序那樣,包含很多個。每個activit

13、y的作用,以及其數(shù)目,自然取決于應(yīng)用程序及其設(shè)計(jì)。一般情況下,總有一個應(yīng)用程序被標(biāo)記為用戶在應(yīng)用程序啟動的時候第一個看到的。從一個activity轉(zhuǎn)向另一個的方式是靠當(dāng)前的activity啟動下一個。每個activity都被給予一個默認(rèn)的窗口以進(jìn)行繪制。一般情況下,這個窗口是滿屏的,但它也可以是一個小的位于其它窗口之上的浮動窗口。一個activity也可以使用超過一個的窗口比如,在activity運(yùn)行過程中彈出的一個供用戶反應(yīng)的小對話框,或是當(dāng)用戶選擇了屏幕上特定項(xiàng)目后顯示的必要信息。窗口顯示的可視內(nèi)容是由一系列視圖構(gòu)成的,這些視圖均繼承自 View 基類。每個視圖均控制著窗口中一塊特定的矩形

14、空間。父級視圖包含并組織它子視圖的布局。葉節(jié)點(diǎn)視圖(位于視圖層次最底端)在它們控制的矩形中進(jìn)行繪制,并對用戶對其直接操作做出響應(yīng)。所以,視圖是activity與用戶進(jìn)行交互的界面。比如說,視圖可以顯示一個小圖片,并在用戶指點(diǎn)它的時候產(chǎn)生動作。Android有很多既定的視圖供用戶直接使用,包括按鈕、文本域、卷軸、菜單項(xiàng)、復(fù)選框等等。Activity 活動服務(wù)沒有可視化的用戶界面,而是在一段時間內(nèi)在后臺運(yùn)行。比如說,一個服務(wù)可以在用戶做其它事情的時候在后臺播放背景音樂、從網(wǎng)絡(luò)上獲取一些數(shù)據(jù)或者計(jì)算一些東西并提供給需要這個運(yùn)算結(jié)果的activity使用。每個服務(wù)都繼承自Service基類。一個媒體播

15、放器播放播放列表中的曲目是一個不錯的例子。播放器應(yīng)用程序可能有一個或多個activity來給用戶選擇歌曲并進(jìn)行播放。然而,音樂播放這個任務(wù)本身不應(yīng)該為任何activity所處理,因?yàn)橛脩羝谕谒麄冸x開播放器應(yīng)用程序而開始做別的事情時,音樂仍在繼續(xù)播放。為達(dá)到這個目的,媒體播放器activity應(yīng)該啟用一個運(yùn)行于后臺的服務(wù)。而系統(tǒng)將在這個activity不再顯示于屏幕之后,仍維持音樂播放服務(wù)的運(yùn)行。你可以連接至(綁定)一個正在運(yùn)行的服務(wù)(如果服務(wù)沒有運(yùn)行,則啟動之)。連接之后,你可以通過那個服務(wù)暴露出來的接口與服務(wù)進(jìn)行通訊。對于音樂服務(wù)來說,這個接口可以允許用戶暫停、回退、停止以及重新開始播放。

16、如同activity和其它組件一樣,服務(wù)運(yùn)行于應(yīng)用程序進(jìn)程的主線程內(nèi)。所以它不會對其它組件或用戶界面有任何干擾,它們一般會派生一個新線程來進(jìn)行一些耗時任務(wù)(比如音樂回放)。Service服務(wù)和接收器廣播接收器是一個專注于接收廣播通知信息,并做出對應(yīng)處理的組件。很多廣播是源自于系統(tǒng)代碼的比如,通知時區(qū)改變、電池電量低、拍攝了一張照片或者用戶改變了語言選項(xiàng)。應(yīng)用程序也可以進(jìn)行廣播比如說,通知其它應(yīng)用程序一些數(shù)據(jù)下載完成并處于可用狀態(tài)。應(yīng)用程序可以擁有任意數(shù)量的廣播接收器以對所有它感興趣的通知信息予以響應(yīng)。所有的接收器均繼承自BroadcastReceiver基類。廣播接收器沒有用戶界面。然而,它們

17、可以啟動一個activity來響應(yīng)它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力閃動背燈、震動、播放聲音等等。一般來說是在狀態(tài)欄上放一個持久的圖標(biāo),用戶可以打開它并獲取消息。Broadcast Receiver 接收器內(nèi)容提供者將一些特定的應(yīng)用程序數(shù)據(jù)供給其它應(yīng)用程序使用。數(shù)據(jù)可以存儲于文件系統(tǒng)、SQLite數(shù)據(jù)庫或其它方式。內(nèi)容提供者繼承于ContentProvider 基類,為其它應(yīng)用程序取用和存儲它管理的數(shù)據(jù)實(shí)現(xiàn)了一套標(biāo)準(zhǔn)方法。然而,應(yīng)用程序并不直接調(diào)用這些方法,而是使用一個 ContentResolver 對象,調(diào)用它的方

18、法作為替代。ContentResolver可以與任意內(nèi)容提供者進(jìn)行會話,與其合作來對所有相關(guān)交互通訊進(jìn)行管理。參閱獨(dú)立的內(nèi)容提供者章節(jié)獲得更多關(guān)于使用內(nèi)容提供者的內(nèi)容。每當(dāng)出現(xiàn)一個需要被特定組件處理的請求時,Android會確保那個組件的應(yīng)用程序進(jìn)程處于運(yùn)行狀態(tài),或在必要的時候啟動它。并確保那個相應(yīng)組件的實(shí)例的存在,必要時會創(chuàng)建那個實(shí)例。Content Provider當(dāng)接收到ContentResolver發(fā)出的請求后,內(nèi)容提供者被激活。而其它三種組件activity、服務(wù)和廣播接收器被一種叫做intent的異步消息所激活。intent是一個保存著消息內(nèi)容的Intent對象。對于activit

19、y和服務(wù)來說,它指明了請求的操作名稱以及作為操作對象的數(shù)據(jù)的URI和其它一些信息。比如說,它可以承載對一個activity的請求,讓它為用戶顯示一張圖片,或者讓用戶編輯一些文本。而對于廣播接收器而言,Intent對象指明了聲明的行為。比如,它可以對所有感興趣的對象聲明照相按鈕被按下。對于每種組件來說,激活的方法是不同的:通過傳遞一個Intent對象至 Context.startActivity()或Activity.startActivityForResult()以載入(或指定新工作給)一個activity。相應(yīng)的activity可以通過調(diào)用 getIntent() 方法來查看激活它的inte

20、nt。Android通過調(diào)用activity的onNewIntent()方法來傳遞給它繼發(fā)的intent。一個activity經(jīng)常啟動了下一個。如果它期望它所啟動的那個activity返回一個結(jié)果,它會以調(diào)用startActivityForResult()來取代startActivity()。比如說,如果它啟動了另外一個activity以使用戶挑選一張照片,它也許想知道哪張照片被選中了。結(jié)果將會被封裝在一個Intent對象中,并傳遞給發(fā)出調(diào)用的activity的onActivityResult() 方法。 組件的連接者-Intent 通過傳遞一個Intent對象至Context.startSe

21、rvice()將啟動一個服務(wù)(或給予正在運(yùn)行的服務(wù)以一個新的指令)。Android調(diào)用服務(wù)的 onStart()方法并將Intent對象傳遞給它。與此類似,一個Intent可以被調(diào)用組件傳遞給 Context.bindService()以獲取一個正在運(yùn)行的目標(biāo)服務(wù)的連接。這個服務(wù)會經(jīng)由onBind() 方法的調(diào)用獲取這個Intent對象(如果服務(wù)尚未啟動,bindService()會先啟動它)。比如說,一個activity可以連接至前述的音樂回放服務(wù),并提供給用戶一個可操作的(用戶界面)以對回放進(jìn)行控制。這個activity可以調(diào)用 bindService() 來建立連接,然后調(diào)用服務(wù)中定義的

22、對象來影響回放。 應(yīng)用程序可以憑借將Intent對象傳遞給 Context.sendBroadcast() ,Context.sendOrderedBroadcast(), 以及Context.sendStickyBroadcast()和其它類似方法來產(chǎn)生一個廣播。Android會調(diào)用所有對此廣播有興趣的廣播接收器的 onReceive()方法,將intent傳遞給它們。Manifest 文件當(dāng)Android啟動一個應(yīng)用程序組件之前,它必須知道那個組件是存在的。所以,應(yīng)用程序會在一個manifest文件中聲明它的組件,這個文件會被打包到Android包中。這個.apk文件還將涵括應(yīng)用程序的代碼

23、、文件以及其它資源。這個manifest文件以XML作為結(jié)構(gòu)格式,而且對于所有應(yīng)用程序,都叫做AndroidManifest.xml。為聲明一個應(yīng)用程序組件,它還會做很多額外工作,比如指明應(yīng)用程序所需鏈接到的庫的名稱(除了默認(rèn)的Android庫之外)以及聲明應(yīng)用程序期望獲得的各種權(quán)限。但manifest文件的主要功能仍然是向Android聲明應(yīng)用程序的組件。舉例說明,一個activity可以如下聲明:元素的name屬性指定了實(shí)現(xiàn)了這個activity的 Activity的子類。icon和label屬性指向了包含展示給用戶的此activity的圖標(biāo)和標(biāo)簽的資源文件。其它組件也以類似的方法聲明 元

24、素用于聲明服務(wù), 元素用于聲明廣播接收器,而 元素用于聲明內(nèi)容提供者。 manifest文件中未進(jìn)行聲明的activity、服務(wù)以及內(nèi)容提供者將不為系統(tǒng)所見,從而也就不會被運(yùn)行。然而,廣播接收器既可以在manifest文件中聲明,也可以在代碼中進(jìn)行動態(tài)的創(chuàng)建,并以調(diào)用Context.registerReceiver()的方式注冊至系統(tǒng)。 如前所述,一個activity可以啟動另外一個,甚至包括與它不處于同一應(yīng)用程序之中的。舉個例子說,假設(shè)你想讓用戶看到某個地方的街道地圖。而已經(jīng)存在一個具有此功能的activity了,那么你的activity所需要做的工作就是把請求信息放到一個Intent對象里

25、面,并把它傳遞給startActivity()。于是地圖瀏覽器就會顯示那個地圖。而當(dāng)用戶按下BACK鍵的時候,你的activity又會再一次的顯示在屏幕上。對于用戶來說,這看起來就像是地圖瀏覽器是你activity所在的應(yīng)用程序中的一個組成部分,其實(shí)它是在另外一個應(yīng)用程序中定義,并運(yùn)行在那個應(yīng)用程序的進(jìn)程之中的。Android將這兩個activity放在同一個任務(wù)中來維持一個完整的用戶體驗(yàn)。簡單的說,任務(wù)就是用戶所體驗(yàn)到的“應(yīng)用程序”。它是安排在一個堆棧中的一組相關(guān)的activity。堆棧中的根activity就是啟動了這整個任務(wù)的那個一般情況下,它就是用戶在應(yīng)用程序加載器中所選擇的。而堆棧最

26、上方的activity則是當(dāng)前運(yùn)行的用戶直接對其進(jìn)行操作的。當(dāng)一個activity啟動另外一個的時候,新的activity就被壓入堆棧,并成為當(dāng)前運(yùn)行的activity。而前一個activity仍保持在堆棧之中。當(dāng)用戶按下BACK鍵的時候,當(dāng)前activity出棧,而前一個恢復(fù)為當(dāng)前運(yùn)行的activity。Activity和任務(wù)ActivityActivity生命周期生命周期用戶界面用戶界面User InterfaceUser Interface在一個Android應(yīng)用中,用戶界面是由View 和ViewGroup對象構(gòu)建的。View與ViewGroup都有很多種類,而它們都是View類的子類

27、。 View View對象是Android平臺中用戶界面體現(xiàn)的基礎(chǔ)單位。View類是它稱為“widgets(工具)”的子類的基礎(chǔ),它們提供了諸如文本輸入框和按鈕之類的UI對象的完整實(shí)現(xiàn)。ViewGroup類同樣為其被稱為“Layouts(布局)”的子類奠定了基礎(chǔ),它們提供了象流式布局、表格布局以及相對布局之類的布局架構(gòu)。View對象是一個數(shù)據(jù)體,它的屬性存儲了用于屏幕上一塊矩形區(qū)域的布局參數(shù)及內(nèi)容。并負(fù)責(zé)這塊它所轄的這個矩形區(qū)域之中所有測量、布局、焦點(diǎn)轉(zhuǎn)換、卷動以及按鍵/觸摸手勢的處理。作為一個用戶界面對象,View同時也擔(dān)任著用戶交互關(guān)鍵點(diǎn)以及交互事件接受者的角色。布局布局LayoutLay

28、out定義并展現(xiàn)你的視圖層次的最常用的方法是使用XML布局文件。如同HTML一樣,XML為布局提供了一種可讀的結(jié)構(gòu)。XML中的每個元素都是View或ViewGroup對象(抑或它們的子類)。View對象是樹的葉節(jié)點(diǎn),而ViewGroup對象是樹的分支(參閱樓上的視圖層次圖)。XML元素的名稱與它體現(xiàn)的Java類相對應(yīng)。所以一個元素將在你的UI中生成一個TextView,而 則創(chuàng)建一個LinearLayout視圖組。當(dāng)你載入一個布局資源時,Android系統(tǒng)會根據(jù)你布局中的元素初始化這些運(yùn)行時對象。舉例來說,一個包含文本視圖和一個按鈕的簡單垂直布局如下: 請注意:LinearLayout 元素包

29、含了TextView 和Button 對象。你可以在其中另外安置一個LinearLayout (或其它類型的視圖組),以延展這個視圖層次,構(gòu)建更復(fù)雜的布局。用戶界面事件用戶界面事件UI EventsUI Events當(dāng)你在用戶界面中加入了一些視圖和工具之后,你可能想要知道如何讓它們與用戶交互,進(jìn)而實(shí)現(xiàn)你的動作。如欲獲得用戶界面事件通知,你需要做以下兩件事情之一:定義一個事件偵聽器并將其注冊至視圖。通常情況下,這是你偵聽事件的主要方式。View類包含了一大堆命名類似 OnListener的接口,每個都帶有一個叫做On()的回調(diào)方法。比如: View.OnClickListener (用以處理視圖

30、中的點(diǎn)擊),View.OnTouchListener (用以處理視圖中的觸屏事件),以及View.OnKeyListener (用以處理視圖中的設(shè)備按鍵事件)。所以,如果你希望你的視圖在它被”點(diǎn)擊”(比如選擇了一個按鈕)的時候獲得通知,你就要實(shí)現(xiàn)OnClickListener,定義它的onClick()回調(diào)方法(在其中進(jìn)行相應(yīng)處理),并將它用setOnClickListener()方法注冊到視圖上。 為視圖覆寫一個現(xiàn)有的回調(diào)方法。這種方法主要用于你自己實(shí)現(xiàn)了一個View類,并想偵聽其上發(fā)生的特定事件。比如說當(dāng)屏幕被觸摸(onTouchEvent()),當(dāng)軌跡球發(fā)生了移動(onTrackball

31、Event())或者是設(shè)備上的按鍵被按下(onKeyDown())。這種方式允許你為自己定制的視圖中發(fā)生的每個事件定義默認(rèn)的行為,并決定是否需要將事件傳遞給其它的子視圖。再說一次,這些是View類相關(guān)的回調(diào)方法,所以你只能在你構(gòu)建自定義組件時定義它們。 如何在視圖中處理用戶交互請參見處理用戶界面事件文檔。資源和資產(chǎn)資源和資產(chǎn)Resources and AssetsResources and Assets資源是Android應(yīng)用程序不可或缺的部分??傮w而言,資源是你想包含和引入到應(yīng)用程序里面的一些外部元素,比如圖片、音頻、視頻、文本字符串、布局、主題等。每個Android應(yīng)用程序包含一個資源目錄

32、(res/)和資產(chǎn)目錄(assets/),資產(chǎn)不經(jīng)常被使用,因?yàn)樗鼈兊膽?yīng)用程序很少。你僅在需要讀取原始字節(jié)流時才需要保存數(shù)據(jù)為資產(chǎn)。資源和資產(chǎn)目錄均駐留在Android項(xiàng)目樹的頂端,和源代碼目錄(src/)處在同一級上。資源和資產(chǎn)從表面上看沒多大區(qū)別,不過總體上,在存儲外部內(nèi)容時資源用得更多。真正的區(qū)別在于任何放置在資源目錄里的內(nèi)容可以通過您的應(yīng)用程序的R類訪問,這是被Android編譯過的。而任何存放在資產(chǎn)目錄里的內(nèi)容會保持它的原始文件格式,為了讀取它,你必須使用AssetManager來以字節(jié)流的方式讀取文件。所以保持文件和數(shù)據(jù)在資源中(res/)中會更方便訪問。目錄Directory資源

33、類型Resource Types res/anim/XML文件,它們被編譯進(jìn)逐幀動畫(frame by frame animation)或補(bǔ)間動畫(tweened animation)對象 res/drawable/.png、.9.png、.jpg文件,它們被編譯進(jìn)以下的Drawable資源子類型中: 要獲得這種類型的一個資源,可以使用Resource.getDrawable(id) 位圖文件 9-patches(可變尺寸的位圖) 為了獲取資源類型,使用mContext.getResources().getDrawable(R.drawable.imageId)注意:放在這里的圖像資源可能會被

34、aapt工具自動地進(jìn)行無損壓縮優(yōu)化。比如,一個真彩色但并不需要256色的PNG可能會被轉(zhuǎn)換為一個帶調(diào)色板的8位PNG。這使得同等質(zhì)量的圖片占用更少的資源。所以我們得意識到這些放在該目錄下的二進(jìn)制圖像在生成時可能會發(fā)生變化。如果你想讀取一個圖像位流并轉(zhuǎn)換成一個位圖(bitmap),請把圖像文件放在res/raw/目錄下,這樣可以避免被自動優(yōu)化。res/layout/被編譯為屏幕布局(或屏幕的一部分)的XML文件。參見布局聲明(Declaring Layout)res/values/可以被編譯成很多種類型的資源的XML文件。注意: 不像其他的res/文件夾,它可以保存任意數(shù)量的文件,這些文件保存了

35、要創(chuàng)建資源的描述,而不是資源本身。XML元素類型控制這些資源應(yīng)該放在R類的什么地方。盡管這個文件夾里的文件可以任意命名,不過下面使一些比較典型的文件(文件命名的慣例是將元素類型包含在該名稱之中): array.xml定義數(shù)據(jù) colors.xml定義color drawable和顏色的字符串值(color string values)。使用Resource.getDrawable()和Resources.getColor()分別獲得這些資源。 dimens.xml定義尺寸值(dimension value)。使用Resources.getDimension()獲得這些資源。 strings.x

36、ml定義字符串(string)值(使用Resources.getString()或者Resources.getText()獲取這些資源。getText()會保留在UI字符串上應(yīng)用的豐富的文本樣式)。 styles.xml定義樣式(style)對象。res/xml/ 任意的XML文件,在運(yùn)行時可以通過調(diào)用Resources.getXML()讀取。 res/raw/ 直接復(fù)制到設(shè)備中的任意文件。它們無需編譯,添加到你的應(yīng)用程序編譯產(chǎn)生的壓縮文件中。要使用這些資源,可以調(diào)用Resources.openRawResource(),參數(shù)是資源的ID,即R.raw.somefilename。 數(shù)據(jù)存儲與訪

37、問很多時候我們的軟件需要對處理后的數(shù)據(jù)進(jìn)行存儲或再次訪問。Android為數(shù)據(jù)存儲提供了多種方式,分別有如下幾種:l文件lSharedPreferences(參數(shù))lSQLite數(shù)據(jù)庫l內(nèi)容提供者(Content provider)l網(wǎng)絡(luò)使用文件進(jìn)行數(shù)據(jù)存儲首先給大家介紹使用文件如何對數(shù)據(jù)進(jìn)行存儲,Activity提供了openFileOutput()方法可以用于把數(shù)據(jù)輸出到文件中,具體的實(shí)現(xiàn)過程與在J2SE環(huán)境中保存數(shù)據(jù)到文件中是一樣的。public class FileActivity extends Activity Override public void onCreate(Bundl

38、e savedInstanceState) . FileOutputStream outStream = this.openFileOutput(itcast.txt, Context.MODE_PRIVATE); outStream.write(“ggggg.getBytes(); outStream.close(); openFileOutput()方法的第一參數(shù)用于指定文件名稱,不能包含路徑分隔符“/” ,如果文件不存在,Android 會自動創(chuàng)建它。創(chuàng)建的文件保存在/data/data/files目錄,如: /data/data/cn.itcast.action/files/itcas

39、t.txt ,通過點(diǎn)擊Eclipse菜單“Window”-“Show View”-“Other”,在對話窗口中展開android文件夾,選擇下面的File Explorer視圖,然后在File Explorer視圖中展開/data/data/files目錄就可以看到該文件。openFileOutput()方法的第二參數(shù)用于指定操作模式,有四種模式,分別為: Context.MODE_PRIVATE = 0Context.MODE_APPEND = 32768Context.MODE_WORLD_READABLE = 1Context.MODE_WORLD_WRITEABLE = 2使用文件進(jìn)行

40、數(shù)據(jù)存儲Context.MODE_PRIVATE:為默認(rèn)操作模式,代表該文件是私有數(shù)據(jù),只能被應(yīng)用本身訪問,在該模式下,寫入的內(nèi)容會覆蓋原文件的內(nèi)容,如果想把新寫入的內(nèi)容追加到原文件中。可以使用Context.MODE_APPENDContext.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內(nèi)容,否則就創(chuàng)建新文件。Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應(yīng)用是否有權(quán)限讀寫該文件。MODE_WORLD_READABLE:表示當(dāng)前文件可以被其他應(yīng)用讀?。籑ODE_WORLD_WRITEABLE:

41、表示當(dāng)前文件可以被其他應(yīng)用寫入。如果希望文件被其他應(yīng)用讀和寫,可以傳入: openFileOutput(itcast.txt, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);android有一套自己的安全模型,當(dāng)應(yīng)用程序(.apk)在安裝時系統(tǒng)就會分配給他一個userid,當(dāng)該應(yīng)用要去訪問其他資源比如文件的時候,就需要userid匹配。默認(rèn)情況下,任何應(yīng)用創(chuàng)建的文件,sharedpreferences,數(shù)據(jù)庫都應(yīng)該是私有的(位于/data/data/files),其他程序無法訪問。除非在創(chuàng)建時指定了Context.MOD

42、E_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程序才能正確訪問。使用SharedPreferences進(jìn)行數(shù)據(jù)存儲很多時候我們開發(fā)的軟件需要向用戶提供軟件參數(shù)設(shè)置功能,例如我們常用的QQ,用戶可以設(shè)置是否允許陌生人添加自己為好友。對于軟件配置參數(shù)的保存,如果是window軟件通常我們會采用ini文件進(jìn)行保存,如果是j2se應(yīng)用,我們會采用properties屬性文件或者xml進(jìn)行保存。如果是Android應(yīng)用,我們最適合采用什么方式保存軟件配置參數(shù)呢?Android平臺給我們提供了一個SharedPreferences類,它是一個輕

43、量級的存儲類,特別適合用于保存軟件配置參數(shù)。使用SharedPreferences保存數(shù)據(jù),其背后是用xml文件存放數(shù)據(jù),文件存放在/data/data/shared_prefs目錄下:SharedPreferences sharedPreferences = getSharedPreferences(itcast, Context.MODE_PRIVATE);Editor editor = sharedPreferences.edit();/獲取編輯器editor.putString(name, 傳智播客);editor.putInt(age, 4);mit();/提交修改生成的itcast

44、.xml文件內(nèi)容如下:傳智播客因?yàn)镾haredPreferences背后是使用xml文件保存數(shù)據(jù),getSharedPreferences(name,mode)方法的第一個參數(shù)用于指定該文件的名稱,名稱不用帶后綴,后綴會由Android自動加上。方法的第二個參數(shù)指定文件的操作模式,共有四種操作模式,這四種模式前面介紹使用文件方式保存數(shù)據(jù)時已經(jīng)講解過。如果希望SharedPreferences背后使用的xml文件能被其他應(yīng)用讀和寫,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權(quán)限。另外Activity還提供了另一個get

45、Preferences(mode)方法操作SharedPreferences,這個方法默認(rèn)使用當(dāng)前類不帶包名的類名作為文件的名稱。訪問SharedPreferences中的數(shù)據(jù)訪問SharedPreferences中的數(shù)據(jù)代碼如下:SharedPreferences sharedPreferences = getSharedPreferences(itcast, Context.MODE_PRIVATE);/getString()第二個參數(shù)為缺省值,如果preference中不存在該key,將返回缺省值String name = sharedPreferences.getString(name

46、, );int age = sharedPreferences.getInt(age, 1);如果訪問其他應(yīng)用中的Preference,前提條件是:該preference創(chuàng)建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE權(quán)限。如:有個為cn.itcast.action的應(yīng)用使用下面語句創(chuàng)建了preference。getSharedPreferences(itcast, Context.MODE_WORLD_READABLE);其他應(yīng)用要訪問上面應(yīng)用的preference,首先需要創(chuàng)建上面應(yīng)用的Context,然后通過C

47、ontext 訪問preference ,訪問preference時會在應(yīng)用所在包下的shared_prefs目錄找到preference :Context otherAppsContext = createPackageContext(cn.itcast.action, Context.CONTEXT_IGNORE_SECURITY);SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences(itcast, Context.MODE_WORLD_READABLE);String name = sha

48、redPreferences.getString(name, );int age = sharedPreferences.getInt(age, 0);如果不通過創(chuàng)建Context訪問其他應(yīng)用的preference,也可以以讀取xml文件方式直接訪問其他應(yīng)用preference對應(yīng)的xml文件,如: File xmlFile = new File(“/data/data/shared_prefs/itcast.xml”);/應(yīng)替換成應(yīng)用的包名使用嵌入式關(guān)系型SQLite數(shù)據(jù)庫存儲數(shù)據(jù)除了可以使用文件或SharedPreferences存儲數(shù)據(jù),還可以選擇使用SQLite數(shù)據(jù)庫存儲數(shù)據(jù)。在And

49、roid平臺上,集成了一個嵌入式關(guān)系型數(shù)據(jù)庫SQLite,SQLite3支持 NULL、INTEGER、REAL(浮點(diǎn)數(shù)字)、TEXT(字符串文本)和BLOB(二進(jìn)制對象)數(shù)據(jù)類型,雖然它支持的類型只有五種,但實(shí)際上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等數(shù)據(jù)類型,只不過在運(yùn)算或保存時會轉(zhuǎn)成對應(yīng)的五種數(shù)據(jù)類型。 SQLite最大的特點(diǎn)是你可以把各種類型的數(shù)據(jù)保存到任何字段中,而不用關(guān)心字段聲明的數(shù)據(jù)類型是什么。例如:可以在Integer類型的字段中存放字符串,或者在布爾型字段中存放浮點(diǎn)數(shù),或者在字符型字段中存放日期型值。 但有一種情況例外:定義為I

50、NTEGER PRIMARY KEY的字段只能存儲64位整數(shù), 當(dāng)向這種字段保存除整數(shù)以外的數(shù)據(jù)時,將會產(chǎn)生錯誤。 另外, SQLite 在解析CREATE TABLE 語句時,會忽略 CREATE TABLE 語句中跟在字段名后面的數(shù)據(jù)類型信息,如下面語句會忽略 name字段的類型信息:CREATE TABLE person (personid integer primary key autoincrement, name varchar(20)SQLite可以解析大部分標(biāo)準(zhǔn)SQL語句,如:查詢語句:select * from 表名 where 條件子句 group by 分組字句 havi

51、ng . order by 排序子句如:select * from person select * from person order by id desc select name from person group by name having count()1分頁SQL與mysql類似,下面SQL語句獲取5條記錄,跳過前面*3條記錄select * from Account limit 5 offset 3 或者 select * from Account limit 3,5插入語句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(傳智,3)更新語句:update 表名 set 字段名=值 where 條件子句。如:update person set name=傳智 where id=10刪除語句:delete from 表名 where 條件子句。如:delete from person where id=10使用SQLiteOpenHelper對數(shù)據(jù)庫進(jìn)行版本管理我們在編寫數(shù)據(jù)庫應(yīng)用軟件時,需要考慮這樣的問題:因?yàn)槲覀冮_發(fā)的軟件可能會安裝在很多用戶的手機(jī)上,如果應(yīng)用使用到了SQLite數(shù)據(jù)庫,我們必須在用戶初次使用軟件時創(chuàng)建出應(yīng)用使用到的數(shù)據(jù)庫表

溫馨提示

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

評論

0/150

提交評論