安卓第三夜 概念漫遊(上)

Vamei發表於2014-08-03

作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段宣告。謝謝! 

 

拿起一個手機,總是滿屏的應用圖示。點選圖示,選擇應用,玩一把遊戲,刷一下微博,寫一篇日記。“叮咚”一聲,郵件應用提醒有一封新來的郵件。在安卓裡,眼花繚亂的應用承載著各種有趣的功能。歡迎來到安卓應用的世界。

每一個應用都是儲存在手機中的一段小程式。編寫這段小程式,是每個安卓開發者的主要工作。程式執行後成為一個程式後,在程式的記憶體空間中新建一個Dalvik虛擬機器。程式預設的各種視覺效果和功能,都會在這一虛擬機器中進行。如同一個小小的軍團,安卓應用也需要不同功能的單元配合。

 

Activity

步兵是軍團的基石

 

使用手機的大多數時候,你會停留在某一個“頁面”,比如和戀人的對話頁面、切水果頁面、相機的取景頁面。用安卓的術語講,頁面是一個Activity,它是一個佔據整個螢幕的介面。使用者和手機可以通過Activity交流。頁面,也就是Activity,是手機應用中如此常見的概念,以至於使用者有時會忽視它們的存在,就像那些無比普通的小步兵。

 

觀察這些頁面,我們會發現一些共同點。

  • Activity包含一些特別的視覺元素,比如一個豎直列表、一個彩色的背景或者一個小小的按鈕。
  • Activity呈現各種資訊,比如圖片、文字、輸入欄等等。靜態資訊之外,Activity也可以播放動態的動畫或視訊。
  • 使用者可以與Activity互動,輸入資訊、點選按鈕、上下滑動,而Activity會根據這些互動動作,觸發特定的效果。

 

 

一個應用往往包含多個頁面。在某些情況下,我們會從當前Activity離開,啟用並前往下一個Activity。在聯絡人條目選單的頁面上,點選某個聯絡人,進入一個新的頁面,這個新的頁面上包含該聯絡人的具體資訊;再點選返回鍵,我們退出了包含具體資訊的頁面,又回到聯絡人條目選單的頁面上。應用的程式空間中有一個(stack),用來記錄我們依次啟用的各個Activity。新啟用的Activity被壓入到棧的頂端。在手機螢幕上,我們只能看到棧頂的這個Activity,也只能和該Activity互動。當我們點選返回鍵時,當前Activity結束,從棧中彈出。上一個被啟用的Activity出現在棧頂,重新佔領手機螢幕。這也就是我們按返回鍵時,能回到歷史頁面(聯絡人條目選單)的原理。

 

 

正如默默守衛的小步兵,Activity也總是處於一種相對靜止的某個狀態,比如執行、暫停、停止等。Activity的許多功能,都是在狀態切換中完成的。狀態轉換過程中執行的命令,都是程式設計師預設好的,包含在特定的方法中。比如一個Activity從未啟用狀態到執行狀態的過程中,會自動執行Activity物件的onStart()方法。安卓程式設計師在該方法中,設計Activity在目標狀態的效果:實現特定的頁面佈局,為按鈕註冊回撥函式,訪問網際網路獲取資訊等。再比如,Activity從暫停到恢復的狀態,會執行onRestart()方法。安卓程式設計師可以在該方法中,實現諸如調整亮度和彈出提示之類的功能。這正如小兵在平時訓練時,預設了切換過程中要做的事情。小兵從一個狀態進入到另一個狀態,比如從“警戒”到“預備射擊”。在該狀態過程中,士兵執行預設動作,即裝填子彈,隨即進入射擊待命狀態。

Activity的狀態與轉換方法

 

有趣的是,一個安卓的Activity與網際網路上的一個Web頁面非常相似。它們都是充斥螢幕的頁面,包含視覺元素和資訊。使用者可以通過這樣的頁面實現某些功能。就連這些介面的編寫方式,也有相似之處:安卓用XML設計一個頁面,而Web用HTML設計一個頁面。你甚至於可以把一個應用直接看做包含了多個頁面的小型網站。

 

Service

應用得當,騎兵是戰場上的一把利劍。

 

安卓軍團的另一個重要組成部分是Service。在安卓應用中,Activity負責的介面大部分時間處於相對靜止的狀態,直到有特定的觸發時間發生。這種非同步的工作方式,能有效的節省系統資源。然而,有一些工作需要一個持續執行的程式來負責的,比如:

  • 每五分鐘登入郵件伺服器,檢查新郵件
  • 保持聯絡人條目與雲伺服器同步
  • 相對大運算量的工作,比如影象和視訊編輯 

 

這些工作並不需要介面互動。必須的時候,安卓應用可以啟動一個Service。Service在背景執行,來負責上述的需要長時間執行的工作。Service物件本身在主執行緒內工作。在設計Service時,安卓程式設計師一般會為Service內大計算量的部分開啟新執行緒,以便不影響主執行緒的執行。當我們刷微博時,背景Service中訪問網際網路,以獲得新的微博,並更新到微博列表頁面。Service中的網際網路訪問不會影響到閱讀舊有的微博條目。Service儘管功能強大,但它持續執行的工作方式會比較消耗運算資源。在手機這樣運算資源有限的移動平臺上,Service就好像一支精貴的騎兵。

 

 

Broadcast Receiver

預備隊,隨時待命。

 

除了Activity和Service,安卓應用還有一種重要的功能單元,就是Broadcast Receiver。它的功能比較簡單,就是在接收到系統廣播後,執行特定的功能。Broadcast Receiver接收的是Intent物件,將在後面詳解。

 

 

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快速教程”系列文章

相關文章