安卓四大組件簡述

    在Android中,一個應用程序可以使用其它應用程序的組件,這是Android系統一個非常重要的特性。例如,你編寫的應用程序需要顯示一個可以滾動的圖片列表,如果其它某個應用程序已經開發了具有此功能的組件並對外發布了此組件以使其它應用程序能夠使用此組件,因此你可以直接調用這個組件來顯示圖片,而不需要重新開發一個具有此功能的組件。在需要的時候Android會啓動另外一個程序的部分代碼,這部分代碼實現了你請求執行的動作的功能,而不是在你的應用程序中直接包含另外一個應用程序的代碼。

 

    爲了實現這樣的功能,Android系統必須能夠在其它應用程序有請求的時候啓動一個應用程序進程並實例化部分java對象。因此與其它大部分系統不同,運行在Android系統上的應用程序並沒有一個應用程序入口點(類似java程序中的main方法)。相反,Android應用程序包含一些運行應用程序所必須的能夠被Android系統實例化的組件。這些組件主要包括以下四種類型。

Activity

    一個Activity通常展現爲一個可視化的用戶界面。例如,一個activity可能展現爲一個用戶可以選擇的菜單項列表或者展現一些圖片以及圖片的標題。一個消息服務應用程序可能包含一個顯示聯繫人列表的activity,一個編寫信息的activity,以及其它一些查看信息和修改應用程序設置的activity。雖然這些activity一起工作,共同組成了一個應用程序,但每一個activity都是相對獨立的。每一個activity都是Activity(android.app.Activity)的子類。

    一個應用程序可能只包含一個activity,或者像上面提到的消息服務程序一樣有多個activity。一個應用程序包含幾個activity以及各個activity完成什麼樣的功能完全取決於應用程序以及它的設計。通常每個應用程序都包含一個在應用程序啓動後第一個展現給用戶的activity。在當前展現給用戶的activity中啓動一個新的activity,可以實現從一個activity轉換到另外一個activity。

    每個activity都會有一個用於繪製用戶界面的窗口。通常這樣一個窗口會填充整個屏幕,當然這個窗口也可以比屏幕小並漂浮在其他窗口之上。activity還可以使用一些額外的窗口,例如一個要求用戶響應的彈出式對話框,或者是當用戶在屏幕上選擇一個條目後向用戶展現一些重要信息的窗口。

    展示activity窗口的可視化內容區域是一些具有層次關係(很像數據結構中的樹)的視圖,而視圖則是由類View的子類表示的。每個視圖控制窗口中的一個矩形區域。父視圖包含一些子視圖並管理子視圖的佈局。位於葉節點的視圖直接控制並響應用戶的動作。因此視圖就是activity與用戶交互的接口。例如,一個顯示圖片的視圖,當用戶單擊的時候它可能會啓動一個動作。Android有許多開發人員可以直接使用的視圖,包括按鈕,文本域,滾動條,菜單,複選框等。

    通過調用Activity.setContentView()方法來設置展現activity的窗口的視圖。內容視圖則是視圖層次結構中的根節點視圖。

Service

    service沒有用戶界面,但它會在後臺一直運行。例如,service可能在用戶處理其它事情的時候播放背景音樂,或者從網絡上獲取數據,或者執行一些運算,並把運算結構提供給activity展示給用戶。每個service都擴展自類Serivce。

    多媒體播放器播放音樂是應用service的一個非常好的例子。多媒體播放器程序可能含有一個或多個activity,用戶通過這些activity選擇並播放音樂。然而,音樂回放並不需要一個activity來處理,因爲用戶可能會希望音樂一直播放下去,即使退出了播放器去執行其它程序。爲了讓音樂一直播放,多媒體播放器activity可能會啓動一個service在後臺播放音樂。Android系統會使音樂回放service一直運行,即使在啓動這個service的activity退出之後。

    應用程序可以連接到一個正在運行中的service。當連接到一個service後,可以使用這個service向外暴露的接口與這個service進行通信。對於上面提到的播放音樂的service,這個接口可能允許用戶暫停,停止或重新播放音樂。

    與activity以及其它組件一樣,service同樣運行在應用程序進程的主線程中。所以它們不能阻塞其它組件或用戶界面,通常需要爲這些service派生一個線程執行耗時的任務。

Broadcase receiver

    broadcase receiver不執行任何任務,僅僅是接受並響應廣播通知的一類組件。大部分廣播通知是由系統產生的,例如改變時區,電池電量低,用戶選擇了一幅圖片或者用戶改變了語言首選項。應用程序同樣也可以發送廣播通知,例如通知其他應用程序某些數據已經被下載到設備上可以使用。

    一個應用程序可以包含任意數量的boradcase reveiver來響應它認爲很重要的通知。所有的broadcast receiver都擴展自類BroadcastReceiver。

    broadcast receiver不包含任何用戶界面。然而它們可以啓動一個activity以響應接受到的信息,或者通過NotificationManager通知用戶。可以通過多種方式使用戶知道有新的通知產生:閃動背景燈、震動設備、發出聲音等等。通常程序會在狀態欄上放置一個持久的圖標,用戶可以打開這個圖標並讀取通知信息。

Content provider

    應用程序可以通過content provider訪問其它應用程序的一些私有數據,這是Android提供的一種標準的共享數據的機制。共享的數據可以是存儲在文件系統中、SQLite數據庫中或其它的一些媒體中。content provider擴展自ContentProvider類,通過實現此類的一組標準的接口可以使其它應用程序存取由它控制的數據。然而應用程序並不會直接調用ContentProvider中的方法,而是通過類ContentResolver。ContentResolver能夠與任何一個ContentProvider通信,它與ContentProvider合作管理進程間的通信。

    任何時候當Android系統收到一個需要某個組件進行處理的請求的時候,Android會確保處理此請求的組件的宿主進程是否已經在運行,如果沒有,則立即啓動這個進程,當請求的組件的宿主進程已經在運行,它會繼續查看請求的組件是否可以使用,如果不能立即使用,它會創建一個請求的組件的實例來響應請求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章