Android應用組件及Intent

1、四大應用組件

①Activity,Activity 表示應用中的一個屏幕,在manifiest中的聲明方式:<activity>

②服務Service,Service 是一個不使用用戶界面而在後臺執行操作的組件,在manifiest中的聲明方式:<service>;

③內容提供程序ContentProvider,在manifiest中的聲明方式:<provider>;

④廣播接收器BroadcastReceiver,在manifiest中的聲明方式:<receiver>;廣播接收器作爲BroadcastReceiver 的子類實現,並且每條廣播都作爲 Intent 對象進行傳遞。

其中,四種組件類型中的三種—Activity、服務和廣播接收器,通過名爲 Intent 的異步消息進行啓動。

2、Intent概述

Intent 是一個消息傳遞對象,您可以使用它從其他應用組件請求操作。

(1)啓動 Activity:

通過將 Intent 傳遞給 startActivity(),您可以啓動新的 Activity 實例。Intent 描述了要啓動的 Activity,並攜帶了所有必要的數據。

如果您希望在 Activity 完成後收到結果,請調用 startActivityForResult()。在 Activity 的onActivityResult() 回調中,您的 Activity 將結果作爲單獨的 Intent 對象接收。

(2)啓動服務:

通過將 Intent 傳遞給 startService(),您可以啓動服務執行一次性操作。Intent 描述了要啓動的服務,並攜帶了所有必要的數據。

如果服務旨在使用客戶端-服務器接口,則通過將 Intent 傳遞給 bindService(),您可以從其他組件綁定到此服務。

爲了避免無意中運行不同應用的 Service,請始終使用顯式 Intent 啓動您自己的服務,且不必爲該服務聲明 Intent 過濾器。使用隱式 Intent 啓動服務存在安全隱患,因爲您無法確定哪些服務將響應 Intent,且用戶無法看到哪些服務已啓動。從 Android 5.0(API 級別 21)開始,如果使用隱式 Intent 調用 bindService(),系統會引發異常。

(3)傳遞廣播:

廣播是任何應用均可接收的消息。通過將 Intent 傳遞給 sendBroadcast()、sendOrderedBroadcast() 或sendStickyBroadcast(),您可以將廣播傳遞給其他應用。

廣播接收器的過濾器可以通過調用 registerReceiver() 動態註冊。之後,您可以使用 unregisterReceiver() 註銷該接收器。這樣一來,應用便可僅在應用運行時的某一指定時間段內偵聽特定的廣播。

3、Intent分類

Intent分爲兩種類型:

顯式 Intent:按名稱(完全限定類名)指定要啓動的組件。

創建顯式 Intent 啓動 Activity 或服務時,系統將立即啓動 Intent 對象中指定的應用組件。

隱式 Intent :並不指定特定的組件,而是聲明要執行的常規操作,從而允許其他應用中的組件來處理它。

創建隱式 Intent 時,Android 系統通過將 Intent 的內容與在設備上其他應用的清單文件中聲明的 Intent 過濾器進行比較,從而找到要啓動的相應組件。如果Intent與Intent過濾器匹配,則系統將啓動該組件,並向其傳遞Intent對象。

4、Intent對象

Intent 對象攜帶了Android系統用來確定要啓動哪個組件的信息,以及收件人組件爲了正確執行操作而使用的信息。

Intent對象中包含的主要信息如下:

①組件名稱:要啓動的組件名稱。

您可以使用setComponent()、setClass()、setClassName()或Intent構造函數設置組件名稱。通過該信息確定顯式Intent所傳遞給的應用組件,隱式Intent不指定組件名稱,系統將根據其他Intent 信息決定哪個組件應當接收Intent。

②操作:指定要執行的通用操作(例如,“查看”或“選取”)的字符串。

您可以使用 setAction() 或 Intent 構造函數爲 Intent 指定操作。以下是一些用於啓動 Activity 的常見操作:

ACTION_VIEW:如果您擁有一些某項Activity可向用戶顯示的信息,則指定該操作

ACTION_SEND:如果您擁有一些用戶可通過其他應用共享的數據,則指定該操作

此外,您可以定義自己的操作,並請確保將應用的軟件包名稱作爲前綴。例如:static final String ACTION_TIMETRAVEL ="com.example.action.TIMETRAVEL";

③數據:引用待操作數據和/或該數據MIME類型的URI(Uri對象)。數據類型通常由Intent的操作決定。

要僅設置數據URI,請調用setData()。要僅設置MIME類型,請調用setType()。如有必要,您可以使用setDataAndType()同時顯式設置二者。

④類別:指定可接收該Intent 的組件的類型

您可以使用 addCategory() 指定類別。以下是一些常見類別:

CATEGORY_BROWSABLE:目標Activity允許本身通過網絡瀏覽器啓動。

CATEGORY_LAUNCHER:該Activity是任務的初始Activity。

⑤Extra:攜帶完成請求操作所需的附加信息的鍵值對。

您可以使用各種 putExtra() 方法添加 extra 數據,每種方法均接受兩個參數:鍵名和值。您還可以創建一個包含所有 extra 數據的 Bundle 對象,然後使用 putExtras() 將Bundle 插入 Intent 中。

⑥標誌:指定如何處理該Intent

使用setFlags()設置標誌,其中,FLAG_ACTIVITY_*標誌用於Context.startActivity(),FLAG_RECEIVER_*標誌用於Context.sendBroadcast()。

5、Intent過濾器

Intent過濾器是應用清單文件中的一個表達式,它指定該組件要接收的 Intent 類型。

每個Intent過濾器均根據Intent的操作、數據和類別指定自身接受的Intent類型。僅當隱式Intent可以通過Intent過濾器之一傳遞時,系統纔會將該Intent傳遞給應用組件。

每個 Intent 過濾器均由應用清單文件中的 <intent-filter> 元素定義,並嵌套在相應的應用組件(例如<activity>元素)中,一個應用組件可以有多個<intent-filter>。

在<intent-filter>內部,您可以使用以下三個元素中的一個或多個指定要接受的 Intent類型:

<action>:在name屬性中,聲明接受的Intent操作。該值必須是操作的文本字符串值,而不是類常量。

<data>:使用一個或多個指定數據 URI 各個方面(scheme、host、port、path 等)和 MIME 類型的屬性,聲明接受的數據類型。

<category>:在name 屬性中,聲明接受的 Intent 類別。該值必須是操作的文本字符串值,而不是類常量。

Android 會自動將 CATEGORY_DEFAULT類別應用於傳遞給 startActivity() 和 startActivityForResult()的所有隱式 Intent。因此,如需Activity接收隱式 Intent,則必須將"android.intent.category.DEFAULT" 的類別包括在其 Intent 過濾器中。

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