安卓第三夜 概念漫游
拿起一個(gè)手機(jī),總是滿屏的應(yīng)用圖標(biāo)。點(diǎn)擊圖標(biāo),選擇應(yīng)用,玩一把游戲,刷一下微博,寫一篇日記。“叮咚”一聲,郵件應(yīng)用提醒有一封新來(lái)的郵件。在安卓里,眼花繚亂的應(yīng)用承載著各種有趣的功能。歡迎來(lái)到安卓應(yīng)用的世界。
每一個(gè)應(yīng)用都是存儲(chǔ)在手機(jī)中的一段小程 序。編寫這段小程序,是每個(gè)安卓開發(fā)者的主要工作。程序運(yùn)行后成為一個(gè)進(jìn)程后,在進(jìn)程的內(nèi)存空間中新建一個(gè)Dalvik虛擬機(jī)。程序預(yù)設(shè)的各種視覺(jué)效果和 功能,都會(huì)在這一虛擬機(jī)中進(jìn)行。如同一個(gè)小小的軍團(tuán),安卓應(yīng)用也需要不同功能的單元配合。
Activity
步兵是軍團(tuán)的基石
使用手機(jī)的大多數(shù)時(shí)候,你會(huì)停留在某一個(gè)“頁(yè) 面”,比如和戀人的對(duì)話頁(yè)面、切水果頁(yè)面、相機(jī)的取景頁(yè)面。用安卓的術(shù)語(yǔ)講,頁(yè)面是一個(gè)Activity,它是一個(gè)占據(jù)整個(gè)屏幕的界面。用戶和手機(jī)可以通 過(guò)Activity交流。頁(yè)面,也就是Activity,是手機(jī)應(yīng)用中如此常見(jiàn)的概念,以至于用戶有時(shí)會(huì)忽視它們的存在,就像那些無(wú)比普通的小步兵。
觀察這些頁(yè)面,我們會(huì)發(fā)現(xiàn)一些共同點(diǎn)。
Activity包含一些特別的視覺(jué)元素,比如豎直列表、一個(gè)彩色的背景或者一個(gè)小小的按鈕。
Activity呈現(xiàn)各種信息,比如圖片、文字、輸入欄等等。靜態(tài)信息之外,Activity也可以播放動(dòng)態(tài)的動(dòng)畫或視頻。
用戶可以與Activity互動(dòng),輸入信息、點(diǎn)擊按鈕、上下滑動(dòng),而Activity會(huì)根據(jù)這些互動(dòng)動(dòng)作,觸發(fā)特定的效果。
一個(gè)應(yīng)用往往包含多個(gè)頁(yè)面。在某些情況 下,我們會(huì)從當(dāng)前Activity離開,激活并前往下一個(gè)Activity。在聯(lián)系人條目菜單的頁(yè)面上,點(diǎn)擊某個(gè)聯(lián)系人,進(jìn)入一個(gè)新的頁(yè)面,這個(gè)新的頁(yè)面 上包含該聯(lián)系人的具體信息;再點(diǎn)擊返回鍵,我們退出了包含具體信息的頁(yè)面,又回到聯(lián)系人條目菜單的頁(yè)面上。應(yīng)用的進(jìn)程空間中有一個(gè)棧(stack), 用來(lái)記錄我們依次激活的各個(gè)Activity。新激活的Activity被壓入到棧的頂端。在手機(jī)屏幕上,我們只能看到棧頂?shù)倪@個(gè)Activity,也只 能和該Activity互動(dòng)。當(dāng)我們點(diǎn)擊返回鍵時(shí),當(dāng)前Activity結(jié)束,從棧中彈出。上一個(gè)被激活的Activity出現(xiàn)在棧頂,重新占領(lǐng)手機(jī)屏 幕。這也就是我們按返回鍵時(shí),能回到歷史頁(yè)面(聯(lián)系人條目菜單)的原理。
正如默默守衛(wèi)的小步兵,Activity也總是處于一種相對(duì)靜止的某個(gè)狀態(tài),比如運(yùn)行、暫停、停止等。Activity的許多功能,都是在狀態(tài)切換中 完成的。狀態(tài)轉(zhuǎn)換過(guò)程中執(zhí)行的命令,都是程序員預(yù)設(shè)好的,包含在特定的方法中。比如一個(gè)Activity從未激活狀態(tài)到運(yùn)行狀態(tài)的過(guò)程中,會(huì)自動(dòng)執(zhí)行 Activity對(duì)象的onStart()方法。安卓程序員在該方法中,設(shè)計(jì)Activity在目標(biāo)狀態(tài)的效果:實(shí)現(xiàn)特定的頁(yè)面布局,為按鈕注冊(cè)回調(diào)函 數(shù),訪問(wèn)互聯(lián)網(wǎng)獲取信息等。再比如,Activity從暫停到恢復(fù)的狀態(tài),會(huì)執(zhí)行onRestart()方法。安卓程序員可以在該方法中,實(shí)現(xiàn)諸如調(diào)整亮 度和彈出提示之類的功能。這正如小兵在平時(shí)訓(xùn)練時(shí),預(yù)設(shè)了切換過(guò)程中要做的事情。小兵從一個(gè)狀態(tài)進(jìn)入到另一個(gè)狀態(tài),比如從“警戒”到“預(yù)備射擊”。在該狀 態(tài)過(guò)程中,士兵執(zhí)行預(yù)設(shè)動(dòng)作,即裝填子彈,隨即進(jìn)入射擊待命狀態(tài)。
有趣的是,一個(gè)安卓的Activity與互聯(lián) 網(wǎng)上的一個(gè)Web頁(yè)面非常相似。它們都是充斥屏幕的頁(yè)面,包含視覺(jué)元素和信息。用戶可以通過(guò)這樣的頁(yè)面實(shí)現(xiàn)某些功能。就連這些界面的編寫方式,也有相似之 處:安卓用XML設(shè)計(jì)一個(gè)頁(yè)面,而Web用HTML設(shè)計(jì)一個(gè)頁(yè)面。你甚至于可以把一個(gè)應(yīng)用直接看做包含了多個(gè)頁(yè)面的小型網(wǎng)站。
Service
應(yīng)用得當(dāng),騎兵是戰(zhàn)場(chǎng)上的一把利劍。
安卓軍團(tuán)的另一個(gè)重要組成部分是Service。在安卓應(yīng)用中,Activity負(fù)責(zé)的界面大部分時(shí)間處于相對(duì)靜止的狀態(tài),直到有特定的觸發(fā)時(shí)間發(fā)生。這種異步的工作方式,能有效的節(jié)省系統(tǒng)資源。然而,有一些工作需要一個(gè)持續(xù)運(yùn)行的程序來(lái)負(fù)責(zé)的,比如:
每五分鐘登錄郵件服務(wù)器,檢查新郵件
保持聯(lián)系人條目與云服務(wù)器同步
相對(duì)大運(yùn)算量的工作,比如圖像和視頻編輯
這些工作并不需要界面交互。必須的時(shí) 候,安卓應(yīng)用可以啟動(dòng)一個(gè)Service。Service在背景運(yùn)行,來(lái)負(fù)責(zé)上述的需要長(zhǎng)時(shí)間運(yùn)行的工作。Service對(duì)象本身在主線程內(nèi)工作。在設(shè)計(jì) Service時(shí),安卓程序員一般會(huì)為Service內(nèi)大計(jì)算量的部分開啟新線程,以便不影響主線程的運(yùn)行。當(dāng)我們刷微博時(shí),背景Service中訪問(wèn)互 聯(lián)網(wǎng),以獲得新的微博,并更新到微博列表頁(yè)面。Service中的互聯(lián)網(wǎng)訪問(wèn)不會(huì)影響到閱讀舊有的微博條目。Service盡管功能強(qiáng)大,但它持續(xù)運(yùn)行的 工作方式會(huì)比較消耗運(yùn)算資源。在手機(jī)這樣運(yùn)算資源有限的移動(dòng)平臺(tái)上,Service就好像一支精貴的騎兵。
Broadcast Receiver
預(yù)備隊(duì),隨時(shí)待命。
除了Activity和Service,安卓應(yīng)用還有一種重要的功能單元,就是Broadcast Receiver。它的功能比較簡(jiǎn)單,就是在接收到系統(tǒng)廣播后,執(zhí)行特定的功能。Broadcast Receiver接收的是Intent對(duì)象,將在后面詳解。
Intent
傳令兵少送了一道命令,軍團(tuán)輸了一場(chǎng)戰(zhàn)爭(zhēng)。
上面講了Activity和Service,每個(gè)Activity和Service之間都可以實(shí)現(xiàn)特定的功能。一個(gè)完整的應(yīng)用需要將這些單個(gè)的功能個(gè)體粘合起來(lái),比如從一個(gè)Activity啟動(dòng)另一個(gè)Activity,在比如從一個(gè)Activity內(nèi)部啟動(dòng)一個(gè)Service。安卓中的Intent就是軍團(tuán)中的傳令兵,粘合各個(gè)功能單元。
Intent對(duì)象說(shuō)明了下一步要做的事情,比如啟動(dòng)一個(gè)Activity或Service。我們可以在舊的Activity中發(fā)起一個(gè)Intent對(duì)象,從而連接新舊的功能單元。在Intent對(duì)象中,可以說(shuō)明要激活的功能單元,比如具體某一個(gè)Activity。Intent還可以附加數(shù)據(jù),交給新的功能模塊。
如 果不具體說(shuō)明要激活的功能單元,Intent對(duì)象可以只說(shuō)明想要執(zhí)行的動(dòng)作,而由安卓系統(tǒng)尋找合適的下家。這樣的Intent對(duì)象會(huì)傳給安卓系統(tǒng)。安卓系 統(tǒng)根據(jù)Intent的要求,在整個(gè)系統(tǒng)范圍內(nèi)遍歷,找到合適的app來(lái)處理。合適與否,是由接收方的Intent Filter來(lái)決定的。每一個(gè)app的功能單元在編寫時(shí),都會(huì)附加一個(gè)Intent Filter的說(shuō)明,注明該功能單元愿意執(zhí)行的動(dòng)作。如果Intent中說(shuō)明的動(dòng)作與Intent Filter說(shuō)明的吻合,那么該app就是一個(gè)備選對(duì)象。如果有多個(gè)合適的備選對(duì)象,安卓手機(jī)會(huì)跳出菜單,供用戶選擇。
總結(jié)
這里提到了安卓開發(fā)中最基本的一些概念。大體看來(lái),一個(gè)安卓應(yīng)用總是由數(shù)個(gè)功能單元構(gòu)成,這些功能單元由Intent連接。我將在后面的文章中,深入更多細(xì)節(jié)。
功能單元:Activity, Service, Broadcast Receiver
本文鏈接:http://www.cnblogs.com/vamei/p/3657249.html