Android四大元件概述

DM--Tutor發表於2012-11-04

應用程式元件

Android的核心功能之一就是一個應用程式可以使用其它應用程式的元素(如果那個應用程式允許的話)。比如說,如果你的應用程式需要一個圖片捲動列表,而另一個應用程式已經開發了一個合用的而又允許別人使用的話,你可以直接呼叫那個捲動列表來完成工作,而不用自己再開發一個。你的應用程式並沒有吸納或連結其它應用程式的程式碼,它只是在有需求的時候啟動了其它應用程式的那個功能部分。

為達到這個目的,系統必須在一個應用程式的一部分被需要時啟動這個應用程式,並將那個部分的Java物件例項化。與在其它系統上的應用程式不同,Android應用程式沒有為應用準備一個單獨的程式入口(比如說,沒有main()方法), 而是為系統依照需求例項化提供了基本的元件。共有四種元件型別:

Activity

Activity是為使用者操作而展示的視覺化使用者介面。比如說,一個activity可以展示一個選單項列表供使用者選擇,或者顯示一些包含說明的照片。一個短訊息應用程式可以包括一個用於顯示做為傳送物件的聯絡人的列表的activity,一個給選定的聯絡人寫簡訊的activity以及翻閱以前的簡訊和改變設定的activity。儘管它們一起組成了一個內聚的使用者介面,但其中每個activity都與其它的保持獨立。每個都是以Activity類為基類的子類實現。

一個應用程式可以只有一個activity,或者,如剛才提到的簡訊應用程式那樣,包含很多個。每個activity的作用,以及其數目,自然取決於應用程式及其設計。一般情況下,總有一個應用程式被標記為使用者在應用程式啟動的時候第一個看到的。從一個activity轉向另一個的方式是靠當前的activity啟動下一個。

每個activity都被給予一個預設的視窗以進行繪製。一般情況下,這個視窗是滿屏的,但它也可以是一個小的位於其它視窗之上的浮動視窗。一個activity也可以使用超過一個的視窗──比如,在activity執行過程中彈出的一個供使用者反應的小對話方塊,或是當使用者選擇了螢幕上特定專案後顯示的必要資訊。

視窗顯示的可視內容是由一系列檢視構成的,這些檢視均繼承自 View 基類。每個檢視均控制著視窗中一塊特定的矩形空間。父級檢視包含並組織它子檢視的佈局。葉節點檢視(位於檢視層次最底端)在它們控制的矩形中進行繪製,並對使用者對其直接操作做出響應。所以,檢視是activity與使用者進行互動的介面。比如說,檢視可以顯示一個小圖片,並在使用者指點它的時候產生動作。Android有很多既定的檢視供使用者直接使用,包括按鈕、文字域、卷軸、選單項、核取方塊等等。

檢視層次是由Activity.setContentView() 方法放入activity的視窗之中的。上下文檢視是位於檢視層次根位置的檢視物件。(參見使用者介面章節獲取關於檢視及層次的更多資訊。)

服務

服務沒有視覺化的使用者介面,而是在一段時間內在後臺執行。比如說,一個服務可以在使用者做其它事情的時候在後臺播放背景音樂、從網路上獲取一些資料或者計算一些東西並提供給需要這個運算結果的activity使用。每個服務都繼承自Service基類。

一個媒體播放器播放播放列表中的曲目是一個不錯的例子。播放器應用程式可能有一個或多個activity來給使用者選擇歌曲並進行播放。然而,音樂播放這個任務本身不應該為任何activity所處理,因為使用者期望在他們離開播放器應用程式而開始做別的事情時,音樂仍在繼續播放。為達到這個目的,媒體播放器activity應該啟用一個執行於後臺的服務。而系統將在這個activity不再顯示於螢幕之後,仍維持音樂播放服務的執行。

你可以連線至(繫結)一個正在執行的服務(如果服務沒有執行,則啟動之)。連線之後,你可以通過那個服務暴露出來的介面與服務進行通訊。對於音樂服務來說,這個介面可以允許使用者暫停、回退、停止以及重新開始播放。

如同activity和其它元件一樣,服務執行於應用程式程式的主執行緒內。所以它不會對其它元件或使用者介面有任何干擾,它們一般會派生一個新執行緒來進行一些耗時任務(比如音樂回放)。參見下述 程式和執行緒 

廣播接收器

廣播接收器是一個專注於接收廣播通知資訊,並做出對應處理的元件。很多廣播是源自於系統程式碼的──比如,通知時區改變、電池電量低、拍攝了一張照片或者使用者改變了語言選項。應用程式也可以進行廣播──比如說,通知其它應用程式一些資料下載完成並處於可用狀態。


應用程式可以擁有任意數量的廣播接收器以對所有它感興趣的通知資訊予以響應。所有的接收器均繼承自BroadcastReceiver基類。
廣播接收器沒有使用者介面。然而,它們可以啟動一個activity來響應它們收到的資訊,或者用NotificationManager來通知使用者。通知可以用很多種方式來吸引使用者的注意力──閃動背燈、震動、播放聲音等等。一般來說是在狀態列上放一個持久的圖示,使用者可以開啟它並獲取訊息。

內容提供者

內容提供者將一些特定的應用程式資料供給其它應用程式使用。資料可以儲存於檔案系統、SQLite資料庫或其它方式。內容提供者繼承於ContentProvider 基類,為其它應用程式取用和儲存它管理的資料實現了一套標準方法。然而,應用程式並不直接呼叫這些方法,而是使用一個 ContentResolver 物件,呼叫它的方法作為替代。ContentResolver可以與任意內容提供者進行會話,與其合作來對所有相關互動通訊進行管理。

參閱獨立的內容提供者章節獲得更多關於使用內容提供者的內容。

每當出現一個需要被特定元件處理的請求時,Android會確保那個元件的應用程式程式處於執行狀態,或在必要的時候啟動它。並確保那個相應元件的例項的存在,必要時會建立那個例項。

啟用元件:intent

當接收到ContentResolver發出的請求後,內容提供者被啟用。而其它三種元件──activity、服務和廣播接收器被一種叫做intent的非同步訊息所啟用。intent是一個儲存著訊息內容的Intent物件。對於activity和服務來說,它指明瞭請求的操作名稱以及作為操作物件的資料的URI和其它一些資訊。比如說,它可以承載對一個activity的請求,讓它為使用者顯示一張圖片,或者讓使用者編輯一些文字。而對於廣播接收器而言,Intent物件指明瞭宣告的行為。比如,它可以對所有感興趣的物件宣告照相按鈕被按下。

對於每種元件來說,啟用的方法是不同的:

  • 通過傳遞一個Intent物件至 Context.startActivity()Activity.startActivityForResult()以載入(或指定新工作給)一個activity。相應的activity可以通過呼叫 getIntent() 方法來檢視啟用它的intent。Android通過呼叫activity的onNewIntent()方法來傳遞給它繼發的intent。
    一個activity經常啟動了下一個。如果它期望它所啟動的那個activity返回一個結果,它會以呼叫startActivityForResult()來取代startActivity()。比如說,如果它啟動了另外一個activity以使使用者挑選一張照片,它也許想知道哪張照片被選中了。結果將會被封裝在一個Intent物件中,並傳遞給發出呼叫的activity的onActivityResult() 方法。
  • 通過傳遞一個Intent物件至Context.startService()將啟動一個服務(或給予正在執行的服務以一個新的指令)。Android呼叫服務的 onStart()方法並將Intent物件傳遞給它。
    與此類似,一個Intent可以被呼叫元件傳遞給 Context.bindService()以獲取一個正在執行的目標服務的連線。這個服務會經由onBind() 方法的呼叫獲取這個Intent物件(如果服務尚未啟動,bindService()會先啟動它)。比如說,一個activity可以連線至前述的音樂回放服務,並提供給使用者一個可操作的(使用者介面)以對回放進行控制。這個activity可以呼叫 bindService() 來建立連線,然後呼叫服務中定義的物件來影響回放。
    後面一節:遠端方法呼叫將更詳細的闡明如何繫結至服務。
  • 應用程式可以憑藉將Intent物件傳遞給 Context.sendBroadcast() ,Context.sendOrderedBroadcast(), 以及Context.sendStickyBroadcast()和其它類似方法來產生一個廣播。Android會呼叫所有對此廣播有興趣的廣播接收器的 onReceive()方法,將intent傳遞給它們。

欲瞭解更多intent訊息的資訊,請參閱獨立章節 Intent和Intent濾過器

關閉元件

內容提供者僅在響應ContentResolver提出請求的時候啟用。而一個廣播接收器僅在響應廣播資訊的時候啟用。所以,沒有必要去顯式的關閉這些元件。

而activity則不同,它提供了使用者介面,並與使用者進行會話。所以只要會話依然持續,哪怕對話過程暫時停頓,它都會一直保持啟用狀態。與此相似,服務也會在很長一段時間內保持執行。所以Android為關閉activity和服務提供了一系列的方法。

  • 可以通過呼叫它的finish()方法來關閉一個activity。一個activity可以通過呼叫另外一個activity(它用startActivityForResult() 啟動的)的finishActivity()方法來關閉它。
  • 服務可以通過呼叫它的stopSelf()方法來停止,或者呼叫 Context.stopService()

系統也會在元件不再被使用的時候或者Android需要為活動元件宣告更多記憶體的時候關閉它。

相關文章