在本系列教程當(dāng)中,我們了解了在進(jìn)行應(yīng)用程序創(chuàng)建過程中需要使用到的各種 Android 基礎(chǔ)開發(fā)功能。到目前為止,我們已經(jīng)一同學(xué)習(xí)了 Android 應(yīng)用程序中的結(jié)構(gòu)與典型元素,其中包括用戶界面元素以及數(shù)據(jù)存儲(chǔ)。
在本系列教程當(dāng)中,我們了解了在進(jìn)行應(yīng)用程序創(chuàng)建過程中需要使用到的各種 Android 基礎(chǔ)開發(fā)功能。到目前為止,我們已經(jīng)一同學(xué)習(xí)了 Android 應(yīng)用程序中的結(jié)構(gòu)與典型元素,其中包括用戶界面元素以及數(shù)據(jù)存儲(chǔ)。利用當(dāng)下已經(jīng)掌握的知識(shí),大家完全可以著手創(chuàng)建自己的 Android 應(yīng)用。不過在實(shí)際操作之前,我們還要梳理一遍部分常用 Android 組件——這也正是今天這篇文章的主要內(nèi)容。在本系列的下一篇文章中,我們將探討 SDK 示例代碼。
介紹 Android 應(yīng)用程序當(dāng)中包含四大組件:Activity、Service、Content Provider 以及 Broadcast Receiver。只要大家創(chuàng)建或者使用其中的任何一種,就必須將對應(yīng)元素添加到項(xiàng)目清單當(dāng)中。我們之前已經(jīng)跟 Activity 打了不少交道,因此在今天的文章中我就不再浪費(fèi)篇幅加以介紹了?,F(xiàn)在讓我們把注意力集中在另外三種主要應(yīng)用程序組件身上。需要強(qiáng)調(diào)的是,我還將介紹大家在應(yīng)用程序當(dāng)中最可能用到的其它一些資源,其中包括 fragment 以及 action bar。
1.Service 在 Android 系統(tǒng)當(dāng)中,一項(xiàng) Service 就相當(dāng)于一個(gè)后臺(tái)進(jìn)程。Service 通常被用于那些正在進(jìn)行或者需要持續(xù)很長一段時(shí)間的進(jìn)程。事實(shí)上 Service 并不具備用戶界面,因此它們通常需要與其它組件結(jié)合起來以實(shí)現(xiàn)功效,例如與 Activity 聯(lián)手。最典型的例子就是,在應(yīng)用程序當(dāng)中 Activity 會(huì)在用戶操作的同時(shí)啟動(dòng)一項(xiàng) Service,這項(xiàng) Service 也許會(huì)將數(shù)據(jù)上傳至 Web 資源當(dāng)中。用戶可以繼續(xù)與該 Activity 進(jìn)行交互,但與此同時(shí) Service 的運(yùn)作卻不受影響——因?yàn)樗膱?zhí)行一直在后臺(tái)完成。
提示:如果大家希望執(zhí)行獲取互聯(lián)網(wǎng)數(shù)據(jù)之類的后臺(tái)進(jìn)程,其中也不一定非要使用 Service 類。根據(jù)應(yīng)用實(shí)際需求的不同,大家可能更適合在自己的 Activity 中利用內(nèi)部 AsyncTask 類來解決問題。它能讓后臺(tái)進(jìn)程與用戶界面徹底分離,但我們的 Activity 仍然可以接收來自 AsyncTask 的運(yùn)作結(jié)果并將其上更新至用戶界面當(dāng)中。
要將一項(xiàng) Service 組件添加到清單當(dāng)中,我們需要利用以下語法及其元素取代應(yīng)用程序元素:
大家可以在 Eclipse 當(dāng)中創(chuàng)建一個(gè) Service 類,其過程與之前介紹過的 Activity 一樣、只不過這次是把 Service 選擇為超級(jí)類。Service 與 Activity 組件的區(qū)別我們之前已經(jīng)談到過,二者之間存在多種重大差異。如果我們以 Activity 為起點(diǎn)啟動(dòng)一項(xiàng) Service,而用戶又通過導(dǎo)航從該 Activity 切換到了其它應(yīng)用程序處,那么該 Service 仍將繼續(xù)運(yùn)行。因此,Service 擁有的生命周期與我們所熟知的 Activity 完全不同,大家需要將這一點(diǎn)牢記于心、從而確保自己的應(yīng)用程序能夠有效運(yùn)轉(zhuǎn)。
其它應(yīng)用程序組件可以與 Service 綁定,并向其請求并接收數(shù)據(jù)。如果一項(xiàng)綁定 Service 正處于運(yùn)行當(dāng)中,那么所有與之相綁定的組件停止之后它也將同時(shí)進(jìn)入停止?fàn)顟B(tài)。盡管 Service 與應(yīng)用程序的用戶界面并無關(guān)聯(lián),但隨 Activity 啟動(dòng)的 Service 會(huì)與之運(yùn)行在同一線程當(dāng)中。然而,如果大家的 Service 需要使用大量處理資源,那么我們最好為其創(chuàng)建一個(gè)獨(dú)立的運(yùn)行線程。請大家 點(diǎn)擊此處 查看更多來自《Android 開發(fā)者指南》中關(guān)于 Service 的說明。
2.Content Provider 另一種組件 Content Provider 用于管理數(shù)據(jù)集。這里指的數(shù)據(jù)集既可以單純歸屬于我們的應(yīng)用程序,也可以與其它應(yīng)用所共享、能夠?qū)?shù)據(jù)進(jìn)行查詢及修改。如果大家為自己的應(yīng)用程序創(chuàng)建了一個(gè)用于管理數(shù)據(jù)的 Content Provider,那么我們的 UI 組件(例如 Activity)就能夠使用該 Content Provider,通常是利用 Content Resolver 類來實(shí)現(xiàn)與數(shù)據(jù)的交互。當(dāng)被其它應(yīng)用程序使用時(shí),該 Content Provider 則通過標(biāo)準(zhǔn)方法來訪問數(shù)據(jù)、從而與數(shù)據(jù)庫等結(jié)構(gòu)化數(shù)據(jù)集實(shí)現(xiàn)交互。
如果大家對于關(guān)系類數(shù)據(jù)庫已經(jīng)非常熟悉,那么應(yīng)該非常了解 Content Provider 所使用的數(shù)據(jù)訪問方法。數(shù)據(jù)會(huì)被 Content Provider 提交給一系列包含行與列的表格,其中每行(或者每條記錄)中的列都包含一個(gè)單獨(dú)的數(shù)據(jù)值。因此,處理通過 Content Provider 返回的數(shù)據(jù)與處理數(shù)據(jù)庫查詢結(jié)果非常相似。
雖然有時(shí)候我們可能會(huì)創(chuàng)建一個(gè)專門的 Content Provider 程序,但在最初著手開發(fā)自己的第一款應(yīng)用時(shí)、大家基本上還是會(huì)直接使用由其他開發(fā)者或者 Android 系統(tǒng)本身所提供的 Content Provider——例如設(shè)備日程表或者聯(lián)系人。Content Provider 能夠定義客戶端應(yīng)用所需要的權(quán)限,從而實(shí)現(xiàn)內(nèi)容使用。為了在應(yīng)用程序當(dāng)中使用 Content Provider,大家需要在清單當(dāng)中為其添加相應(yīng)的權(quán)限。
提示:如果大家只是需要一套應(yīng)用程序當(dāng)中的結(jié)構(gòu)化數(shù)據(jù)源,那么我們通常并不需要單獨(dú)創(chuàng)建 Content Provider。大家可以創(chuàng)建一套只適用于我們應(yīng)用程序本身的 SQLite 數(shù)據(jù)庫,而完全不需要使用 Content Provider 類。我們需要?jiǎng)?chuàng)建 Content Provider 的惟一情況在于,大家希望從我們的應(yīng)用程序當(dāng)中將結(jié)構(gòu)化數(shù)據(jù)復(fù)制到其它應(yīng)用處,或者大家希望使用搜索框架。
3.Broadcast Receiver Android 系統(tǒng)能夠發(fā)出多種應(yīng)用程序能夠響應(yīng)的廣播信息。大家也可以開發(fā)出應(yīng)用程序來發(fā)出這些廣播,但這種可能性與監(jiān)聽現(xiàn)有廣播相比要低得多,至少對我們的第一款應(yīng)用來說是這樣。系統(tǒng)通知當(dāng)中包含關(guān)于設(shè)備硬件的各類信息,例如電池電量、屏幕關(guān)閉以及充電器是否接入插座等等。
為了接收來自 Android 系統(tǒng)的廣播通知,我們的應(yīng)用程序需要使用 Broadcast Receiver。舉個(gè)典型的例子,電池電量工具會(huì)在電池電量發(fā)生實(shí)際變化時(shí)更新顯示結(jié)果。在這種情況下,大家可以將 Service 類與 Broadcast Receiver 配合使用,從而保證應(yīng)用程序始終在后臺(tái)監(jiān)聽通知內(nèi)容。
Android 系統(tǒng)將廣播通知稱為 intent,它能夠被用于啟動(dòng) Activity。作為系統(tǒng)執(zhí)行的操作,intent 可以實(shí)現(xiàn) Activity 啟動(dòng)或者發(fā)出通知。要使用 Broadcast Receiver,我們的應(yīng)用程序必須在清單中對其作出聲明;此外還有一套備選 intent filter,用于指示我們想要接收的操作:
通過以上代碼,我們應(yīng)用中的 Broadcast Receiver 就能夠接收“battery low(電池電量低)”這一 intent。請注意,我們無法通過在清單中聲明 action 這種方式接收全部系統(tǒng)通知。在某些情況下,大家必須完成注冊來實(shí)現(xiàn)通知接收,例如在 Java 當(dāng)中使用 BATTERY_CHANGED action。
4.其它類 正如大家所見,Android 組件的設(shè)計(jì)初衷在于為不同應(yīng)用程序提供彼此之間的交互效果。正如廣播通知可用于系統(tǒng)之上的任何應(yīng)用,Android 還提供其它一系列 action、幫助我們在應(yīng)用程序中完成各類常見任務(wù)——例如撥打電話號(hào)碼。同樣,大家也可以使用由其他開發(fā)人員所提供的功能,從而快速實(shí)現(xiàn)預(yù)定處理流程、節(jié)約代碼開發(fā)量并幫助自己將更多精力集中在應(yīng)用程序的獨(dú)特之處上。當(dāng)我們啟動(dòng)一項(xiàng) intent 時(shí),可以通過設(shè)置使其向啟動(dòng)中的 Activity 返回一個(gè)結(jié)果——即使所啟動(dòng)的 intent 并非我們應(yīng)用程序的組成部分。這就使我們的應(yīng)用能夠在要求操作完成之后繼續(xù)運(yùn)行。
其它值得關(guān)注的 Android 組件還包括 fragment 以及 action bar。下面就讓我們簡單對二者進(jìn)行探討:
Fragment 比起單純利用 Activity 以及布局配置來定義應(yīng)用程序中各個(gè)屏幕下的用戶界面,使用 fragment 的話效率可能會(huì)更高一些。在 fragment 的幫助下,大家可以將自己的用戶界面拆分為邏輯部分,甚至在應(yīng)用程序的多個(gè)屏幕之間重復(fù)使用同樣的部分。這樣一來,我們不僅能夠節(jié)約大量花在實(shí)現(xiàn)同樣視覺/交互元素上的重復(fù)勞動(dòng),同時(shí)也實(shí)現(xiàn)了修改一點(diǎn)即完成對整款應(yīng)用變更的效果。Fragment 在 Android 系統(tǒng)中屬于 Activity 中的組成部分,因此每個(gè) fragment 都要與其所在的 Activity 生命周期相適應(yīng)。
Action Bar 在應(yīng)用程序開發(fā)過程中,action bar 也是我們經(jīng)常需要用到的關(guān)鍵性用戶界面元素。它的作用在于為我們的應(yīng)用程序提供足以作用于整套 Android 系統(tǒng)的用戶界面,這也使它成為該平臺(tái)用戶們最熟悉的元素。一般來說,action bar 當(dāng)中所顯示的條目包括用戶在應(yīng)用程序當(dāng)中所處的位置以及應(yīng)用程序各個(gè)部分之間的導(dǎo)航系統(tǒng)。要在 Activity 當(dāng)中使用 action bar,大家需要保證自己的類當(dāng)中包含 ActionBarActivity 類,并在清單當(dāng)中將 AppCompat 主題應(yīng)用在該 Activity 當(dāng)中。
總結(jié) 具體使用哪一種 Android 類及組件取決于大家的應(yīng)用程序到底要執(zhí)行哪些任務(wù)。不過經(jīng)過文章的論述,相信應(yīng)該能夠幫助大家對類與組件的類型及數(shù)量有所了解,并根據(jù)實(shí)際情況作出正確選擇。對于特定特性或者功能來說,我們往往很難決定具體該使用哪款組件或者類,因此請大家在判斷之前確保自己對它們的作用擁有清晰的了解。在接下來的教程當(dāng)中,我們將探討 Android 示例代碼以及應(yīng)用程序的發(fā)布流程。
原文鏈接:
http://mobile.tutsplus.com/tutorials/android/android-sdk-common-android-components/