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