1. 程式人生 > >Android應用程式元件介紹

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執行查詢操作。