Android開發(fā)之旅:應(yīng)用程序基礎(chǔ)及組件_第1頁
Android開發(fā)之旅:應(yīng)用程序基礎(chǔ)及組件_第2頁
Android開發(fā)之旅:應(yīng)用程序基礎(chǔ)及組件_第3頁
Android開發(fā)之旅:應(yīng)用程序基礎(chǔ)及組件_第4頁
Android開發(fā)之旅:應(yīng)用程序基礎(chǔ)及組件_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Android開發(fā)之旅:應(yīng)用程序基礎(chǔ)及組件2010-04-1617:19by吳秦,33872閱讀,23評論,收藏,編輯成功屬于耐得住寂寞的人,接下來幾篇將講述Android應(yīng)用程序的原理及術(shù)語,可能會比較枯燥。如果能夠靜下心來看,相信成功將屬于你。引言為了后面的例子做準(zhǔn)備,本篇及接下來幾篇將介紹Android應(yīng)用程序的原理及術(shù)語,這些也是作為一個Android的開發(fā)人員必須要了解,且深刻理解的東西。本篇的主題如下:1、應(yīng)用程序基礎(chǔ)2、應(yīng)用程序組件2.1、活動(Activities)2.2、服務(wù)(Services)2.3、廣播接收者(Broadcastreceivers)2.4、內(nèi)容提供者(Co

2、ntentproviders)因為這些內(nèi)容比較理論,且沒有用例子來說明,看上去會比較枯燥,我就把這幾篇寫得算比較短,方便大家吸收。1、應(yīng)用程序基礎(chǔ)Android應(yīng)用程序是用Java編程語言寫的。編譯后的Java代碼包括應(yīng)用程序要求的任何數(shù)據(jù)和資源文件,通過aapt工具捆綁成一個Android包,歸檔文件以.apk為后綴。這個文件是分發(fā)應(yīng)用程序和安裝到移動設(shè)備的中介或工具,用戶下載這個文件到他們的設(shè)備上。一個.apk文件中的所有代碼被認(rèn)為是一個應(yīng)用程序。aapt:aapt是AndroidAssetPackagingTool的首字母縮寫,這個工具包含在SDK的tools/目錄下。查看、創(chuàng)建、更新與

3、zip兼容的歸檔文件(zip、jar、apk)。它也能將資源文件編譯成二進(jìn)制包。盡管你可能不會經(jīng)常直接使用appt,但是構(gòu)建腳本(buildscripts)和IDE插件會使用這個工具打包apk文件,構(gòu)成一個Android應(yīng)用程序。如需更詳細(xì)的使用細(xì)節(jié),打開一個終端,進(jìn)入tools/目錄下,運行命令:Linux或Mac操作系統(tǒng):./aaptWindows:aapt.exe注意:tools/目錄是扌旨androidSDK目錄下的/platforms/android-X/tools/在許多方面,每個Android應(yīng)用程序生活在它自己的世界:默認(rèn)情況下,每一個應(yīng)用程序運行在它自己的Linux進(jìn)程中。當(dāng)

4、應(yīng)用程序中的任何代碼需要執(zhí)行時,Android將啟動進(jìn)程;當(dāng)它不在需要和系統(tǒng)資源被其他應(yīng)用程序請求時,Android將關(guān)閉進(jìn)程。每個應(yīng)用程序都有他自己的Java虛擬機(VM),因此應(yīng)用程序代碼獨立于其他所有應(yīng)用程序的代碼運行。默認(rèn)情況下,每個應(yīng)用程序分配一個唯一的Linux用戶的ID。權(quán)限設(shè)置為每個應(yīng)用程序的文件僅對用戶和應(yīng)用程序本身可見雖然也有一些方法可以暴露他們給其他應(yīng)用程序。有可能設(shè)置兩個應(yīng)用程序共享一個用戶ID,這種情況下,他們能夠看到對方的文件。為了節(jié)省系統(tǒng)資源,具有相同ID的應(yīng)用程序也可以安排在同一個Linux進(jìn)程中,共享同一個VM。2、應(yīng)用程序組件Android的一個主要特點是,

5、一個應(yīng)用程序可以利用其他應(yīng)用程序的元素(假設(shè)這些應(yīng)用程序允許的話)。例如,如果你的應(yīng)用程序需要顯示一個圖像的滾動列表,且其他應(yīng)用程序已經(jīng)開發(fā)了一個合適的滾動條并可以提供給別的應(yīng)用程序用,你可以調(diào)用這個滾動條來工作,而不用自己開發(fā)一個。你的應(yīng)用程序不用并入其他應(yīng)用程序的代碼或鏈接到它。相反,當(dāng)需求產(chǎn)生時它只是啟動其他應(yīng)用程序塊。對于這個工作,當(dāng)應(yīng)用程序的任何部分被請求時,系統(tǒng)必須能夠啟動一個應(yīng)用程序的進(jìn)程,并實例化該部分的Java對象。因此,不像其他大多數(shù)系統(tǒng)的應(yīng)用程序,Android應(yīng)用程序沒有一個單一的入口點(例如,沒有main()函數(shù))。相反,系統(tǒng)能夠?qū)嵗瓦\行需要幾個必要的組件。有四種

6、類型的組件:活動(Activities)服務(wù)(Services)廣播接收者(Broadcastreceivers)內(nèi)容提供者(Contentproviders)然而,并不是所有的應(yīng)用程序都必須包含上面的四個部分,你的應(yīng)用程序可以由上面的一個或幾個來組建。當(dāng)你決定使用以上哪些組件來構(gòu)建Android應(yīng)用程序時,你應(yīng)該將它們列在AndroidManifest.xml文件中,在這個文件中你可以聲明應(yīng)用程序組件以及它們的特性和要求。關(guān)于AndroidManifest.xml在Android開發(fā)之旅:HelloWorld項目的目錄結(jié)構(gòu)的1.6、AndroidManifest.xml簡單介紹了一下,你可以

7、參考一下,下篇也將介紹它。2.1、活動(Activities)一個活動表示一個可視化的用戶界面,關(guān)注一個用戶從事的事件。例如,一個活動可能表示一個用戶可選擇的菜單項列表,或者可能顯示照片連同它的標(biāo)題。一個文本短信應(yīng)用程序可能有一個活動,顯示聯(lián)系人的名單發(fā)送信息;第二個活動,寫信息給選定的聯(lián)系人;其他活動,重新查看舊信息或更改設(shè)置。雖然他們一起工作形成一個整體的用戶界面,但是每個活動是獨立于其他活動的。每一個都是作為Activity基類的一個子類的實現(xiàn)。android.app.Activity類:因為幾乎所有的活動(activities)都是與用戶交互的,所以Activity類關(guān)注創(chuàng)建窗口,你可

8、以用方法setContentView(View)將自己的UI放到里面。然而活動通常以全屏的方式展示給用戶,也可以以浮動窗口或嵌入在另外一個活動中。有兩個方法是幾乎所有的Activity子類都實現(xiàn)的:onCreate(Bundle):初始化你的活動(Activity),比如完成一些圖形的繪制。最重要的是,在這個方法里你通常將用布局資源(layoutresource)調(diào)用setContentView(int)方法定義你的UI,和用findViewById(int)在你的UI中檢索你需要編程地交互的小部件(widgets)。setContentView指定由哪個文件指定布局(main.xml),可以

9、將這個界面顯示出來,然后我們進(jìn)行相關(guān)操作,我們的操作會被包裝成為一個意圖(Intent),然后這個意圖對應(yīng)有相關(guān)的activity進(jìn)行處理。onPauseO:處理當(dāng)離開你的活動時要做的事情。最重要的是,用戶做的所有改變應(yīng)該在這里提交(通常ContentProvider保存數(shù)據(jù))。一個應(yīng)用程序可能只包含一個活動,或者像剛才提到的短信應(yīng)用,它可能包含幾個活動。這些活動是什么,以及有多少,當(dāng)然這取決于它的應(yīng)用和設(shè)計。一般來講,當(dāng)應(yīng)用程序被啟動時,被標(biāo)記為第一個的活動應(yīng)該展示給用戶。從一個活動移動到另一個活動由當(dāng)前的活動完成開始下一個。每一個活動都有一個默認(rèn)的窗口。一般來講,窗口會填滿整個屏幕,但是它

10、可能比屏幕小或浮在其他窗口上。一個活動還可以使用額外的窗口例如彈出式對話框,或當(dāng)一用戶選擇屏幕上一個特定的項時一個窗口顯示給用戶重要的信息。窗口的可視內(nèi)容是由繼承自View基類的一個分層的視圖一對象提供。每個視圖控件是窗口內(nèi)的一個特定的矩形空間。父視圖包含和組織子女視圖的布局。葉子視圖(在分層的底層)繪制的矩形直接控制和響應(yīng)用戶的操作。因此,一個視圖是活動與用戶交互發(fā)生的地方。例如,一個視圖可能顯示一個小的圖片和當(dāng)用戶點擊圖片時發(fā)起一個行為。Android有一些現(xiàn)成的視圖你可以使用,包括按鈕(buttons)、文本域(textfields)、滾動條(scrollbars)、菜單項(menuit

11、ems)、復(fù)選框(checkboxes)等等。通過Activity.setContentView()方法放置一個視圖層次在一個活動窗口中。內(nèi)容視圖(contentview)是層次結(jié)構(gòu)的根視圖對象。層次結(jié)構(gòu)如下圖所示:圖1、視圖的層次結(jié)構(gòu)Activity.setContentView()方法:publicvoidsetContentView(intlayoutResID):根據(jù)布局資源設(shè)置活動的界面。資源將被夸大,添加布局資源文件中所有的最高層的視圖(top-levelviews)到活動.2.2、服務(wù)(Services)一個服務(wù)沒有一個可視化用戶界面,而是在后臺無期限地運行。例如一個服務(wù)可能是播

12、放背景音樂而用戶做其他一些事情,或者它可能從網(wǎng)絡(luò)獲取數(shù)據(jù),或計算一些東西并提供結(jié)果給需要的活動(activities)。每個服務(wù)都繼承自Service基類。每個服務(wù)類在AndroidManifest.xml中有相應(yīng)的聲明。服務(wù)可以通過Context.startService()和Context.bindService()啟動。一個典型的例子是一個媒體播放器播放一個播放列表中的歌曲。該播放器應(yīng)用程序?qū)⒖赡苡幸粋€或多個活動(activities),允許用戶選擇歌曲和開始播放。然而,音樂播放本身不會被一個活動處理,因為用戶希望保持音樂繼續(xù)播放,當(dāng)用戶離開播放器去做其他事情時。為了保持音樂繼續(xù)播放,媒

13、體播放器活動可以啟動一個服務(wù)運行在后臺。系統(tǒng)將保持音樂播放服務(wù)運行,甚至媒體播放器離開屏幕時??梢赃B接到(綁定到)一個持續(xù)運行的服務(wù)(并啟動服務(wù),如果它尚未運行)。連接之后,你可以通過服務(wù)暴露的接口與服務(wù)交流。對于音樂服務(wù),這個接口可以允許用戶暫停、倒帶、停止和重新播放。像活動(activities)和其他組件一樣,服務(wù)(services)運行在應(yīng)用程序進(jìn)程中的主線程中。因此,他們將不會阻止其他組件或用戶界面,他們往往產(chǎn)生其他一些耗時的任務(wù)(如音樂播放)。2.3、廣播接收者(Broadcastreceivers)一個廣播接收者是這樣一個組件,它不做什么事,僅是接受廣播公告并作出相應(yīng)的反應(yīng)。許多

14、廣播源自于系統(tǒng)代碼,例如公告時區(qū)的改變、電池電量低、已采取圖片、用戶改變了語言偏好。應(yīng)用程序也可以發(fā)起廣播,例如為了他其他程序知道某些數(shù)據(jù)已經(jīng)下載到設(shè)備且他們可以使用這些數(shù)據(jù)。一個應(yīng)用程序可以有任意數(shù)量的廣播接收者去反應(yīng)任何它認(rèn)為重要的公告。所有的接受者繼承自BroadcastReceiver基類。BroadcastReceiver類:是接受sendBroadcast()發(fā)送的意圖(intents)的基類??梢杂肅ontext.registerReceiver()動態(tài)地注冊這個類的實例,或者通過AndroidManifest.xml中receiver標(biāo)簽靜態(tài)發(fā)布。注意:如果你在Activity

15、.onResume()注冊一個接受者,你應(yīng)該在Activity.onPause()注銷它。因為當(dāng)暫停時你不會收到意圖,注銷它將削減不必要的系統(tǒng)開銷。不要在Activity.onSavelnstanceState()中注銷它,因為它將不會被調(diào)用,如果用戶移動到先前的堆棧。有兩種主要的可接受廣播類型:正常廣播(由Context.sendBroadcast發(fā)送)是完全異步的。所有的廣播接收者以無序方式運行,往往在同一時間接收。這樣效率較高,但是意味著接受者不能使用結(jié)果或終止廣播數(shù)據(jù)傳播。有序廣播(由Context.sendOrderedBroadcast發(fā)送)一次傳遞給一個接收者。由于每個接收者依次

16、執(zhí)行,因此它可以傳播到下一個接收器,也可以完全終止傳播以便他不會傳遞給其他接收者。接收者的運行順序可由匹配的意圖過濾器(intent-filter)的android:priority屬性控制。廣播接收者不顯示一個用戶界面。然而,它們啟動一個活動去響應(yīng)收到的信息,或者他們可能使用NotificationManager去通知用戶。通知可以使用多種方式獲得用戶的注意閃爍的背光、振動設(shè)備、播放聲音等等。典型的是放在一個持久的圖標(biāo)在狀態(tài)欄,用戶可以打開獲取信息。2.4、內(nèi)容提供者(Contentproviders)內(nèi)容提供者(contentprovider)使一個應(yīng)用程序的指定數(shù)據(jù)集提供給其他應(yīng)用程序。

17、這些數(shù)據(jù)可以存儲在文件系統(tǒng)中、在一個SQLite數(shù)據(jù)庫、或以任何其他合理的方式。內(nèi)容提供者繼承自ContentProvider基類并實現(xiàn)了一個標(biāo)準(zhǔn)的方法集,使得其他應(yīng)用程序可以檢索和存儲數(shù)據(jù)。然而,應(yīng)用程序并不直接調(diào)用這些方法。相反,替代的是它們使用一個ContentResolver對象并調(diào)用它的方法。ContentResolver能與任何內(nèi)容提供者通信,它與提供者合作來管理參與進(jìn)來的進(jìn)程間的通信。內(nèi)容提供者是Android應(yīng)用程序的主要組成部分之一,提供內(nèi)容給應(yīng)用程序。他們封裝數(shù)據(jù)且通過單個ContentResolver接口提供給應(yīng)用程序。只有需要在多個應(yīng)用程序間共享數(shù)據(jù)是才需要內(nèi)容提供者。

18、例如,通訊錄數(shù)據(jù)被多個應(yīng)用程序使用,且必須存儲在一個內(nèi)容提供者中。如果你不需要在多個應(yīng)用程序間共享數(shù)據(jù),你可以直接使用SQLiteDataBase。當(dāng)ContentResolver發(fā)出一個請求時,系統(tǒng)檢查給定的URI的權(quán)限并傳遞請求給內(nèi)容提供者注冊。內(nèi)容提供者能理解URI想要的東西。UriMatcher類用于幫組解析URIs。需要實現(xiàn)的方法主要如下:query(Uri,String,String,String,String)返回數(shù)據(jù)給調(diào)用者insert(Uri,ContentValues)插入數(shù)據(jù)到內(nèi)容提供者update(Uri,ContentValues,String,String)更新內(nèi)容

19、提供者已存在的數(shù)據(jù)delete(Uri,String,String)從內(nèi)容提供者中刪除數(shù)據(jù)getType(Uri)返回內(nèi)容提供者中的MIME類型數(shù)據(jù)更多的關(guān)于ContentResolver信息,請查看相關(guān)文檔。每當(dāng)有一個應(yīng)該由特定組件處理的請求,Android可以確保該組件的應(yīng)用程序正在運行,如果沒有就啟動它,而且一個適當(dāng)?shù)慕M件實例可用,如果沒有就創(chuàng)建。作者:吳秦出處:/skynet/本文基于署名2.5中國大陸許可協(xié)議發(fā)布,歡迎轉(zhuǎn)載,演繹或用于商業(yè)目的,但是必須保留本文的署名吳秦(包含鏈接).Android開發(fā)之旅:應(yīng)用程序基礎(chǔ)及組件(續(xù))2010-04-1701:14by吳秦,20919閱讀

20、,9評論,收藏,編輯成功屬于耐得住寂寞的人,你離成功又近了一步了。引言上篇Android開發(fā)之旅:應(yīng)用程序基礎(chǔ)及組件介紹了應(yīng)用程序的基礎(chǔ)知識及Android的四個組件,本篇將介紹如何激活組關(guān)閉組件等。本文的主題如下:1、激活組件:意圖(Intents)1.1、活動(Activity)組件的激活1.2、服務(wù)(Service)組件的激活1.3、廣播接收者(Broadcastreceiver)組件的激活2、關(guān)閉組件3、清單文件4、Intent過濾器1、激活組件:意圖(Intents)當(dāng)接收到ContentResolver發(fā)出的請求后,內(nèi)容提供者被激活。而其它三種組件活動、服務(wù)和廣播接收者,被一種叫做

21、意圖(intent)的異步消息激活。意圖是一個保存著消息內(nèi)容的Intent對象。對于活動和服務(wù)來說,Intent對象指明了請求的操作名稱以及作為操作對象的數(shù)據(jù)的URI和其它一些信息。例如,它可以傳遞對活動的一個請求,讓它為用戶顯示一張圖片,或者讓用戶編輯一些文本。而對于廣播接收者而言,Intent對象指明了廣播的行為。例如當(dāng)照相按鈕被按下,它可以對所有感興趣的對象廣播。對于每種組件來說,激活的方法是不同的。下面將分別介紹活動、服務(wù)、廣播接收者組件的激活方法。1.1、活動(Activity)組件的激活通過傳遞一個Intent對象至Context.startActivityO或Activity.s

22、tartActivityForResult()以載入(或指定新工作給)一個活動。相應(yīng)的活動可以看到初始的意圖,這個意圖通過getIntent()方法來查看激活活動。Android調(diào)用活動的onNewIntent()方法傳遞任何后續(xù)的意圖。一個活動經(jīng)常啟動了下一個。如果它期望它所啟動的那個活動返回一個結(jié)果,它會調(diào)用startActivityForResult()而不是startActivity()。例如,如果它啟動了一個活動讓用戶挑選一張照片,它可能會返回被選中的照片。結(jié)果以一個Intent對象傳遞調(diào)用活動的onActivityResult()方法。1.2、服務(wù)(Service)組件的激活通過傳

23、遞一個Intent對象至Context.startService()以啟動一個服務(wù)(或給予正在運行的服務(wù)以一個新的指令)。Android調(diào)用服務(wù)的onStart()方法并將Intent對象傳遞給它。與此類似,一個Intent可以傳遞給Context.bindService()以在調(diào)用的組件和目標(biāo)服務(wù)之間建立持續(xù)的連接。這個服務(wù)會在調(diào)用onBind()方法中接受這個Intent對象(如果服務(wù)尚未啟動,bindService()會先啟動它)。例如,一個活動可以連接至前面講到的音樂播放服務(wù),并提供給用戶一個可操作的(用戶界面)以對播放進(jìn)行控制。這個活動可以調(diào)用bindService()來建立連接,然

24、后調(diào)用服務(wù)中定義的對象來控制播放。1.3、廣播接收者(Broadcastreceiver)組件的激活應(yīng)用程序可以通過將Intent對象傳遞給Context.sendBroadcast()Context.sendOrderedBroadcast()Context.sendStickyBroadcast()及其它類似方法來產(chǎn)生一個廣播。Android會通過onReceive()方法將intent傳遞給所有對此廣播有興趣的廣播接收者。2、關(guān)閉組件內(nèi)容提供者僅在響應(yīng)ContentResolver提出請求的時候激活。而一個廣播接收者僅在響應(yīng)廣播信息的時候激活。所以,沒有必要去顯式的關(guān)閉這些組件。而活動則

25、不同,它提供了用戶界面。與用戶進(jìn)行會話,所以只要會話依然持續(xù),哪怕對話進(jìn)程空閑,它都會一直保持激活狀態(tài)。與此相似,服務(wù)也會在很長一段時間內(nèi)保持運行。所以Android提供方法有序地關(guān)閉活動和服務(wù)。可以通過調(diào)用它的finish()方法來關(guān)閉一個活動。一個活動也可以通過調(diào)用finishActivity()方法來關(guān)閉另外一個活動(它用startActivityForResult()啟動的)。服務(wù)可以通過調(diào)用它的stopSelf()方法來停止,或者調(diào)用Context.stopService()。當(dāng)組件不再被使用的時候或者Android必須要為更多活躍的組件回收內(nèi)存時,組件也可能會被系統(tǒng)關(guān)閉。3、清單(

26、manifest)文件當(dāng)Android啟動一個應(yīng)用程序組件之前,它必須知道那個組件是存在的。所以,應(yīng)用程序會在一個清單(manifest)文件中聲明它的組件,這個文件會被打包到Android包中。這個.apk文件還將包括應(yīng)用程序的代碼、文件以及其它資源。這個清單文件是XML結(jié)構(gòu)的文件,且所有的Android應(yīng)用程序都把它叫做AndroidManifest.xml。為聲明一個應(yīng)用程序組件,它還會做很多額外工作,比如指明應(yīng)用程序所需鏈接到的庫的名稱(除了默認(rèn)的Android庫之外)以及聲明應(yīng)用程序期望獲得的各種權(quán)限。但清單文件的主要功能仍然是向Android聲明應(yīng)用程序的組件。舉例說明,一個活動可

27、以如下聲明:田日AndroidManifest.xml?xmlversion二1.0encoding二utf-8?application.activityandroid:name=ject.FreneticActivityandroid:icon=drawable/small_pic.pngandroid:label=string/freneticLabel./activity/application/manifestactivity元素的name屬性指定了實現(xiàn)了這個活動的Activity類的子類,icon和label屬性指向了包含展示給用戶的此活動的圖標(biāo)和標(biāo)簽的資源文件。其它組件也以類似的方法聲明service元素用于聲明服務(wù),receiver元素用于聲明廣播接收者,而provider元素用于聲明內(nèi)容提供者。清單文件中未進(jìn)行聲明的活動、服務(wù)以及內(nèi)容提供者將不為系統(tǒng)所見,從而也就不會被運行。然而,廣播接收者既可以在清單文件中聲明,也可以在代碼中動態(tài)的創(chuàng)建(作為BroadcastReceiver對象)且調(diào)用Context.registerReceiver()方式注冊到系統(tǒng)。4、Intent過濾器In

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論