Android應用程序組件介紹


應用程序組件是Android應用程序的基本構建單元。每個組件是系統進入你的應用程序的不同入口點。不是所有的組件對於用戶都是實際上的入口點,有些是互相依賴的,但是每個組件都有特定的作用——每個都是唯一的構建單元,這些構建單元定義你應用程序的全部行為

 

有四種不同類型的應用程序組件。每種都有不同的用處並且有不同的生命周期。生命周期定義了他們是怎樣被創建和銷毀的。

四類不同的應用程序組件分別有:

Activities

一個Activity代表一個單獨的擁有用戶界面的屏幕。比如,一個郵件應用程序可能擁有一個顯示新郵件的列表的Activity,一個編寫郵件的Activity,一個讀郵件的Activity。雖然這些Activity一起工作,但是他們是相互獨立的。因此一個不同的應用程序也可以啟動這些Activity中的任何一個(如果郵件應用程序允許的話)。比如一個攝像頭應用程序為了能讓用戶分享一張圖片它能啟動郵件應用程序中的編寫郵件的Activity

 

一個Activity是由Activity類的子類來實現的。

 

Services

一個Service組件是運行在后台的一個進程,這個進程處理一個長時間的操作或者是一個遠程調用。一個Service不需要提供一個用戶界面。比如,一個Service可以在用戶運行一個不同程序的同時在后台播放音樂,或者在不阻塞一個Activity的用戶界面的同時獲取網絡數據。其他的組件,比如一個Activity,可以啟動一個Service並且與之交互。

 

一個Service是由Service的子類來實現的。

 

Content providers

一個Content provider管理一組共享的應用程序數據。你可以把這些數據存儲到文件系統、一SQLite數據庫、互聯網或者任何你的應用程序可以訪問的持久化存儲設備中。通過Content provider其他的應用程序能夠查詢甚至修改(如果Content provider允許修改操作)這些數據。例如Android系統提供了管理聯系人信息的Content provider。因此,任何一個應用程序在擁有相應權限的情況下都可以訪問這個Content provider管理的數據(比如ContactsContract.Data)來讀取或者修改某個聯系人的信息。

 

Content provider用於管理應用程序不與其他程序共享的的私有數據也是非常有用的。不如Note Pad例子程序就使用了一個Content provider來存儲數據。

 

一個Content Provider是由ContentProvider的子類來實現的,並且必須實現一組使其他應用程序能與之通信的API。更多信息請參照Content Providers開發者指南。

 

Broadcast receivers

一個Broadcast receiver組件用於響應整個系統的廣播通知。大量的廣播都是由系統產生的。例如屏幕關閉的廣播,電量不足的廣播,拍了一張相片的廣播。應用程序也可以發出廣播,例如讓其他應用程序知道一些數據已從網上下載了,並且它們可以使用這些數據。雖然broadcast receiver不顯示用戶界面,但是當廣播事件發生的時候他們可以創建一個狀態欄通知來提示用戶。更加普遍的情況是,一個Broadcast receiver只是一扇通向其他組件的“大門”,它只做非常少量的工作。例如它可以基於一個廣播事件啟動一個Service來完成一些工作。

 

一個Broadcast receiver是由BroadcastReceiver的子類來實現的,並且每個廣播都是當作一個Intent對象來傳遞的。

 

Android系統的一個獨一無二的設計就是一個應用程序可以啟動其它應用程序的組件。例如如果你希望用戶通過攝像頭來拍攝一張照片,而其他應用程序已經實現了這個功能,那么你的應用程序可以直接使用它,而不是自己開發一個Activity來實現這一功能。你不需要通過合並或者事件鏈接到攝像頭應用程序的代碼,而是直接啟動攝像頭應用程序實現拍照功能的Activity。當拍照完成時,照片功過事件返回到你的應用程序中。對於用戶來說,看起來拍照功能就是你的應用程序的一部分。

 

當系統啟動一個組件的時候,它為應用程序開啟一個進程(如果應用程序還沒有運行),並且實例化這個組件需要的所有的類。例如,如果你的應用程序啟動一個攝像頭應用程序中實現拍照功能的Activity,這個Activity運行在屬於攝像頭應用程序的進程中,而不是你的應用程序的進程中。因此,和其它大多數操作系統不一樣,Android應用程序不止一個單獨的入口。(例如,沒有main函數)

 

因為每個應用程序運行在獨立的進程中,並且每個進程都有文件權限來限制其它程序的訪問,你的應用程序不能直接啟動其它應用程序的組件。盡管如此,Android系統可以啟動它們。因此,你必須傳遞一個消息給Android系統,這個消息定義了你想啟動某個組件的意圖,Android系統接收到這個消息后為你啟動其他應用程序的組件。

 

啟動組件

四種組件中的三種——ActivityServiceBroadcast receiver——通過被稱作Intent的異步消息啟動。Intent在運行時把獨立的組件互相綁定(你可以認為Intent是組件為了請求一個操作派出的信使),不管這個組件是屬於你的應用程序還是他的應用程序。

 

一個Intent對象創建一個Intent,它定義了一個啟動某個或者某種組件的消息。一個Intent的意圖分別可以是明確的,也可以是含蓄的。

 

對於ActivityService來說,一個Intent定義了一個行為(例如,“展示”或者“發送”一些東西)和指定相關的數據的URI(其中包括啟動組件可能需要知道的數據)。例如,一個Intent可能傳遞一個Activity的請求來顯示一張圖片或者打開一個網頁。在某些情況下,你能夠啟動一個Activity來接收Intent中的數據,這個Activity也返回一個數據包含在Intent中(例如,你發布了一個Intent讓用戶選取一個聯系人信息,並且返回給你,返回的Intent中包含了指向選取的聯系人信息的URI)。

 

對於Broadcast receiver來說,Intent只是簡單地定義了被廣播的公告(例如一個顯示設備電池電量低的廣播只包括一個指出“電量低”的操作字符串)。

 

其他類型的組件,Content provider,不是由Intent來啟動,而是在ContentResolver向它發出一個請求時被啟動。Content resolver處理所有與Content provider的直接相關的事務,因此組件不需要直接與Content provider通信,替而代之調用ContentResolver對象的方法。這樣在Content provider和組件請求信息之間保留了一個抽象層(為了安全)。

 

啟動每種組件都有不同的方法:

你可以通過傳遞一個Intent對象到startActivity()或者startActivityForResult()(當你希望這個Activity返回結果時)方法來啟動一個Activity

你可以通過傳遞一個Intent對象到startService()方法來啟動一個Service(或者傳遞新的指令到正在運行的Service)。或者你可以通過傳遞一個Intent對象到bindService()來綁定到Service

你可以通過傳遞一個Intent對象到sendBroadcast()sendOrderedBroadcast()或者sendStickyBroadcast()方法來發布一個廣播。

你可以通過調用ContentResolver對象上的query()方法來對一個Content provider執行查詢操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM