做者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝! html
拿起一個手機,老是滿屏的應用圖標。點擊圖標,選擇應用,玩一把遊戲,刷一下微博,寫一篇日記。「叮咚」一聲,郵件應用提醒有一封新來的郵件。在安卓裏,眼花繚亂的應用承載着各類有趣的功能。歡迎來到安卓應用的世界。程序員
每個應用都是存儲在手機中的一段小程序。編寫這段小程序,是每一個安卓開發者的主要工做。程序運行後成爲一個進程後,在進程的內存空間中新建一個Dalvik虛擬機。程序預設的各類視覺效果和功能,都會在這一虛擬機中進行。如同一個小小的軍團,安卓應用也須要不一樣功能的單元配合。小程序
步兵是軍團的基石服務器
使用手機的大多數時候,你會停留在某一個「頁面」,好比和戀人的對話頁面、切水果頁面、相機的取景頁面。用安卓的術語講,頁面是一個Activity,它是一個佔據整個屏幕的界面。用戶和手機能夠經過Activity交流。頁面,也就是Activity,是手機應用中如此常見的概念,以致於用戶有時會忽視它們的存在,就像那些無比普通的小步兵。app
觀察這些頁面,咱們會發現一些共同點。異步
一個應用每每包含多個頁面。在某些狀況下,咱們會從當前Activity離開,激活並前往下一個Activity。在聯繫人條目菜單的頁面上,點擊某個聯繫人,進入一個新的頁面,這個新的頁面上包含該聯繫人的具體信息;再點擊返回鍵,咱們退出了包含具體信息的頁面,又回到聯繫人條目菜單的頁面上。應用的進程空間中有一個棧(stack),用來記錄咱們依次激活的各個Activity。新激活的Activity被壓入到棧的頂端。在手機屏幕上,咱們只能看到棧頂的這個Activity,也只能和該Activity互動。當咱們點擊返回鍵時,當前Activity結束,從棧中彈出。上一個被激活的Activity出如今棧頂,從新佔領手機屏幕。這也就是咱們按返回鍵時,能回到歷史頁面(聯繫人條目菜單)的原理。函數
正如默默守衛的小步兵,Activity也老是處於一種相對靜止的某個狀態,好比運行、暫停、中止等。Activity的許多功能,都是在狀態切換中完成的。狀態轉換過程當中執行的命令,都是程序員預設好的,包含在特定的方法中。好比一個Activity從未激活狀態到運行狀態的過程當中,會自動執行Activity對象的onStart()方法。安卓程序員在該方法中,設計Activity在目標狀態的效果:實現特定的頁面佈局,爲按鈕註冊回調函數,訪問互聯網獲取信息等。再好比,Activity從暫停到恢復的狀態,會執行onRestart()方法。安卓程序員能夠在該方法中,實現諸如調整亮度和彈出提示之類的功能。這正如小兵在平時訓練時,預設了切換過程當中要作的事情。小兵從一個狀態進入到另外一個狀態,好比從「警惕」到「預備射擊」。在該狀態過程當中,士兵執行預設動做,即裝填子彈,隨即進入射擊待命狀態。佈局
Activity的狀態與轉換方法動畫
有趣的是,一個安卓的Activity與互聯網上的一個Web頁面很是類似。它們都是充斥屏幕的頁面,包含視覺元素和信息。用戶能夠經過這樣的頁面實現某些功能。就連這些界面的編寫方式,也有類似之處:安卓用XML設計一個頁面,而Web用HTML設計一個頁面。你甚至於能夠把一個應用直接看作包含了多個頁面的小型網站。網站
應用得當,騎兵是戰場上的一把利劍。
安卓軍團的另外一個重要組成部分是Service。在安卓應用中,Activity負責的界面大部分時間處於相對靜止的狀態,直到有特定的觸發時間發生。這種異步的工做方式,能有效的節省系統資源。然而,有一些工做須要一個持續運行的程序來負責的,好比:
這些工做並不須要界面交互。必須的時候,安卓應用能夠啓動一個Service。Service在背景運行,來負責上述的須要長時間運行的工做。Service對象自己在主線程內工做。在設計Service時,安卓程序員通常會爲Service內大計算量的部分開啓新線程,以便不影響主線程的運行。當咱們刷微博時,背景Service中訪問互聯網,以得到新的微博,並更新到微博列表頁面。Service中的互聯網訪問不會影響到閱讀舊有的微博條目。Service儘管功能強大,但它持續運行的工做方式會比較消耗運算資源。在手機這樣運算資源有限的移動平臺上,Service就好像一支精貴的騎兵。
預備隊,隨時待命。
除了Activity和Service,安卓應用還有一種重要的功能單元,就是Broadcast Receiver。它的功能比較簡單,就是在接收到系統廣播後,執行特定的功能。Broadcast Receiver接收的是Intent對象,將在後面詳解。
傳令兵少送了一道命令,軍團輸了一場戰爭。
上面講了Activity和Service,每一個Activity和Service之間均可以實現特定的功能。一個完整的應用須要將這些單個的功能個體粘合起來,好比從一個Activity啓動另外一個Activity,在好比從一個Activity內部啓動一個Service。安卓中的Intent就是軍團中的傳令兵,粘合各個功能單元。
Intent對象說明了下一步要作的事情,好比啓動一個Activity或Service。咱們能夠在舊的Activity中發起一個Intent對象,從而鏈接新舊的功能單元。在Intent對象中,能夠說明要激活的功能單元,好比具體某一個Activity。Intent還能夠附加數據,交給新的功能模塊。
若是不具體說明要激活的功能單元,Intent對象能夠只說明想要執行的動做,而由安卓系統尋找合適的下家。這樣的Intent對象會傳給安卓系統。安卓系統根據Intent的要求,在整個系統範圍內遍歷,找到合適的app來處理。合適與否,是由接收方的Intent Filter來決定的。每個app的功能單元在編寫時,都會附加一個Intent Filter的說明,註明該功能單元願意執行的動做。若是Intent中說明的動做與Intent Filter說明的吻合,那麼該app就是一個備選對象。若是有多個合適的備選對象,安卓手機會跳出菜單,供用戶選擇。
Intent和Intent Filter
這裏提到了安卓開發中最基本的一些概念。大致看來,一個安卓應用老是由數個功能單元構成,這些功能單元由Intent鏈接。我將在後面的文章中,深刻更多細節。
功能單元:Activity, Service, Broadcast Receiver
膠水:Intent
歡迎繼續閱讀「Java快速教程」系列文章