Android應(yīng)用程序開(kāi)發(fā)基礎(chǔ):Application組件
Android應(yīng)用程序開(kāi)發(fā)簡(jiǎn)介
Android應(yīng)用程序用Java做為開(kāi)發(fā)語(yǔ)言。aapt工具把編譯后的Java代碼連同其它應(yīng)用程序需要的數(shù)據(jù)和資源文件一起打包到一個(gè)Android文件包中,這個(gè)文件使用.apk做為擴(kuò)展名,它是發(fā)布應(yīng)用程序并安裝到移動(dòng)設(shè)備的媒介,用戶只需下載并安裝此文件到他們的設(shè)備即可。單個(gè).apk文件中的所有代碼被看作是一個(gè)應(yīng)用程序。
從很多方面來(lái)看,每個(gè)Android應(yīng)用程序都存在于它自己的世界之中:
◆默認(rèn)情況下,每個(gè)應(yīng)用程序均運(yùn)行于它自己的Linux進(jìn)程中。當(dāng)任一應(yīng)用程序開(kāi)始執(zhí)行時(shí),Android啟動(dòng)一個(gè)進(jìn)程,而當(dāng)應(yīng)用程序不再需要此進(jìn)程而其它應(yīng)用程序又需要系統(tǒng)資源時(shí),則關(guān)閉這個(gè)進(jìn)程。
◆每個(gè)進(jìn)程都運(yùn)行于自己的Java虛擬機(jī)(VM)中。所以應(yīng)用程序代碼實(shí)際上與其它應(yīng)用程序的代碼是隔離的。
◆默認(rèn)情況下,每個(gè)應(yīng)用程序均被賦予一個(gè)唯一的Linux用戶ID,并加以權(quán)限設(shè)置,使得那個(gè)應(yīng)用程序的文件僅對(duì)這個(gè)用戶、這個(gè)應(yīng)用程序可見(jiàn)。當(dāng)然,也有其它的方法使得這些文件同樣能被別的應(yīng)用程序所訪問(wèn)。
可以讓兩個(gè)應(yīng)用程序共有同一個(gè)用戶ID,這種情況下他們可以看到彼此的文件。為了保護(hù)系統(tǒng)資源,擁有同一個(gè)ID的應(yīng)用程序?qū)⑦\(yùn)行在同一個(gè)Linux進(jìn)程,以及同一個(gè)虛擬機(jī)之中。
Android應(yīng)用程序開(kāi)發(fā)的核心:Application組件
Android的核心功能之一就是一個(gè)應(yīng)用程序可以使用其它應(yīng)用程序的元素(如果那個(gè)應(yīng)用程序允許的話)。比如說(shuō),如果你的應(yīng)用程序需要一個(gè)圖片滾動(dòng)列表,而另一個(gè)應(yīng)用程序已經(jīng)開(kāi)發(fā)了一個(gè)合適、而且又允許別人使用的相同列表,可以直接調(diào)用那個(gè)滾動(dòng)列表來(lái)實(shí)現(xiàn)功能,而不用自己再開(kāi)發(fā)一個(gè)。而應(yīng)用程序并沒(méi)有包含或鏈接其它應(yīng)用程序的代碼,它只是在需要時(shí)啟用了其它應(yīng)用程序的那部分功能而已。
為達(dá)到這個(gè)目的,系統(tǒng)必須在一個(gè)應(yīng)用程序的一部分需要時(shí)啟動(dòng)這個(gè)應(yīng)用程序,并將那部分的Java對(duì)象實(shí)例化。與其它系統(tǒng)上的應(yīng)用程序不同,Android應(yīng)用程序沒(méi)有為應(yīng)用程序提供單獨(dú)的程序入口(比如說(shuō),沒(méi)有main()方法), 相反,而是提供了一些核心組件,系統(tǒng)可以在需要時(shí)實(shí)例化,運(yùn)行這些組件。共有四種組件類型:
Activity(活動(dòng))
Activity是為響應(yīng)用戶操作而展示的可視化用戶界面。比如說(shuō),一個(gè)Activity可以展示一個(gè)菜單項(xiàng)列表供用戶選擇,或者顯示一些包含說(shuō)明的照片。一個(gè)短消息應(yīng)用程序可以包括一個(gè)用于顯示做為發(fā)送對(duì)象的聯(lián)系人列表的Activity,一個(gè)給選定的聯(lián)系人寫短信的Activity以及翻閱以前的短信和改變?cè)O(shè)置的Activity。盡管它們一起寫作完成了一個(gè)完整的用戶界面,但每個(gè)Activity都與其它的Activity保持獨(dú)立。都是通過(guò)以Activity類為基類的子類實(shí)現(xiàn)。
一個(gè)應(yīng)用程序可以只有一個(gè)Activity,或者,如剛才提到的短信應(yīng)用程序那樣包含多個(gè)。每個(gè)Activity的作用,以及其數(shù)目,自然取決于應(yīng)用程序及其設(shè)計(jì)。通常,其中一個(gè)Activity被標(biāo)記啟動(dòng)Activity,用戶在應(yīng)用程序啟動(dòng)的時(shí)候首先看到該Activity的內(nèi)容。用當(dāng)前Activity啟動(dòng)一個(gè)新的Activity即可轉(zhuǎn)向其他的Activity。
每個(gè)Activity都被給予一個(gè)默認(rèn)的窗口以進(jìn)行繪制。通常,這個(gè)窗口是滿屏的,但它也可以是一個(gè)小的位于其它窗口之上的浮動(dòng)窗口。Activity也可以使用額外的窗口——比如,在Activity運(yùn)行過(guò)程中彈出一個(gè)需用戶反應(yīng)的小對(duì)話框,或是當(dāng)用戶選擇了屏幕上特定項(xiàng)目后彈出的重要信息窗口。
窗口顯示的可視內(nèi)容是由一系列視圖構(gòu)成的,這些視圖均繼承自View基類。每個(gè)視圖均控制著窗口中一塊特定的矩形空間。父級(jí)視圖包含并組織它的子視圖的布局。葉節(jié)點(diǎn)視圖(位于視圖層次***端)在它們控制的矩形中進(jìn)行繪制,并對(duì)用戶對(duì)其實(shí)施的操作做出響應(yīng)。所以,視圖是Activity與用戶進(jìn)行交互的界面。比如說(shuō),視圖可以顯示一個(gè)小圖片,并在用戶指點(diǎn)它的時(shí)候產(chǎn)生行為。Android有很多既定的視圖供用戶直接使用,包括按鈕、文本域、滾動(dòng)條、菜單項(xiàng)、復(fù)選框等等。
視圖及其層次是由Activity.setContentView()方法放入Activity的窗口之中。內(nèi)容視圖(Content View)是位于視圖層次根位置的視圖對(duì)象。(參考用戶界面章節(jié)的內(nèi)容獲取關(guān)于視圖及其層次的更多信息。)
Service(服務(wù))
服務(wù)沒(méi)有可視化的用戶界面,而是在一段時(shí)間內(nèi)在后臺(tái)運(yùn)行。比如說(shuō),一個(gè)服務(wù)可以在用戶做其它事情的時(shí)候在后臺(tái)播放背景音樂(lè)、從網(wǎng)絡(luò)獲取一些數(shù)據(jù)或者計(jì)算一些東西并提供給需要這個(gè)運(yùn)算結(jié)果的Activity使用。每個(gè)服務(wù)都繼承自Service基類。
媒體播放器播放播放列表中的曲目是一個(gè)不錯(cuò)的例子。播放器應(yīng)用程序可能有一個(gè)或多個(gè)Activity來(lái)給用戶選擇歌曲并進(jìn)行播放。然而,音樂(lè)播放這個(gè)任務(wù)本身不應(yīng)該為任何Activity所處理,因?yàn)橛脩羝谕谒麄冸x開(kāi)播放器應(yīng)用程序而開(kāi)始做別的事情時(shí),音樂(lè)仍在繼續(xù)播放。為達(dá)到這個(gè)目的,媒體播放器Activity應(yīng)該啟用一個(gè)運(yùn)行于后臺(tái)的服務(wù)。而系統(tǒng)將在這個(gè)Activity不再顯示在屏幕之后,仍維持音樂(lè)播放服務(wù)的運(yùn)行。我們可以連接(綁定)至一個(gè)正在運(yùn)行的服務(wù)(如果服務(wù)沒(méi)有運(yùn)行,則啟動(dòng))。連接之后,可以通過(guò)那個(gè)服務(wù)暴露出來(lái)的接口與服務(wù)進(jìn)行通訊。對(duì)于音樂(lè)服務(wù)來(lái)說(shuō),這個(gè)接口可以允許用戶暫停、回退、停止以及重新開(kāi)始播放。
如同Activity和其它組件一樣,服務(wù)運(yùn)行于應(yīng)用程序進(jìn)程的主線程內(nèi)。所以它不會(huì)對(duì)其它組件或用戶界面有任何干擾,它們一般會(huì)派生一個(gè)新線程來(lái)進(jìn)行一些耗時(shí)任務(wù)(比如音樂(lè)回放)。參見(jiàn)下述進(jìn)程和線程。
Broadcast(廣播接收器)
廣播接收器是一個(gè)專注于接收廣播通知信息,并做出對(duì)應(yīng)處理的組件。很多廣播是源自于系統(tǒng)代碼——比如,通知時(shí)區(qū)改變、電池電量低、拍攝了一張照片或者用戶改變了語(yǔ)言選項(xiàng)。應(yīng)用程序也可以進(jìn)行廣播——比如說(shuō),通知其它應(yīng)用程序一些數(shù)據(jù)下載完成并處于可用狀態(tài)。
應(yīng)用程序可以擁有任意數(shù)量的廣播接收器以對(duì)其所有感興趣的通知信息予以響應(yīng)。所有的接收器均繼承自BroadcastReceiver基類。
廣播接收器本身不顯示用戶界面。但它可以啟動(dòng)一個(gè)Activity來(lái)響應(yīng)收到的信息,或者用NotificationManager來(lái)通知用戶。通知可以用很多種方式來(lái)吸引用戶的注意力──閃動(dòng)背燈、震動(dòng)、播放聲音等等。一般來(lái)說(shuō)是在狀態(tài)欄上放一個(gè)持久(Persistent)的圖標(biāo),用戶可以打開(kāi)它并獲取消息。
ContentProvider(內(nèi)容提供者)
內(nèi)容提供者將一些特定的應(yīng)用程序數(shù)據(jù)提供給其它應(yīng)用程序使用。數(shù)據(jù)可以存儲(chǔ)于文件系統(tǒng)、SQLite數(shù)據(jù)庫(kù)或其它方式。內(nèi)容提供者繼承于ContentProvider 基類,為其它應(yīng)用程序讀取和存儲(chǔ)它管理的數(shù)據(jù)實(shí)現(xiàn)了一套標(biāo)準(zhǔn)方法。然而,應(yīng)用程序并不直接調(diào)用這些方法,而是使用一個(gè) ContentResolver 對(duì)象,調(diào)用它的方法。ContentResolver可以與任意的內(nèi)容提供者進(jìn)行會(huì)話,與Provider合作來(lái)管理其涉及的所有相關(guān)交互通訊。
每當(dāng)出現(xiàn)一個(gè)需要被特定組件處理的請(qǐng)求時(shí),Android會(huì)確保那個(gè)組件的應(yīng)用程序進(jìn)程處于運(yùn)行狀態(tài),或在必要的時(shí)候啟動(dòng)它。并確保那個(gè)相應(yīng)組件的實(shí)例存在,必要時(shí)會(huì)創(chuàng)建那個(gè)實(shí)例。
以上就介紹了Android應(yīng)用程序開(kāi)發(fā)的一些基礎(chǔ)。本文來(lái)自賴儀靈的博客:《Android SDK 1.5中文版 (Application基礎(chǔ)—1)》。
【編輯推薦】