1. 程式人生 > >Android官方文件—APP元件(Intents and Intent Filters)

Android官方文件—APP元件(Intents and Intent Filters)

意圖和意圖過濾器

Intent是一個訊息物件,您可以使用它從另一個元件中請求動作。儘管意圖以多種方式實現元件之間的通訊,但有三個基本用法:

  • 啟動activity

活動表示應用程式中的單個螢幕。您可以通過將Intent傳遞給startActivity()來啟動Activity的新例項。 Intent描述了要啟動的activity並攜帶一些必要的資料。

如果要在activity結束時從activity中收到結果,請呼叫startActivityForResult()。您的activity在onActivityResult()回撥中將結果作為單獨的Intent物件接收。有關更多資訊,請參閱Activities

指南。

  • 啟動service

服務是在沒有使用者介面的情況下在後臺執行操作的元件。您可以通過將Intent傳遞給startService()來啟動服務以執行一次性操作(例如下載檔案)。 Intent描述了要啟動的服務並攜帶一些必要的資料。

如果服務是使用client-server介面設計的,則可以通過將Intent傳遞給bindService()來繫結到另一個元件的服務。有關更多資訊,請參閱Services指南。

  • 傳送廣播

廣播是任何應用都可以接收的訊息。系統為系統事件提供各種廣播,例如系統啟動或裝置開始充電時。您可以通過將Intent傳遞給sendBroadcast(),sendOrderedBroadcast()或sendStickyBroadcast()來向其他應用程式傳送廣播。

Intent型別

兩種型別的Intent:

  • 顯式Intent指定按名稱開始的元件(完全限定的類名)。您通常會使用顯式意圖在您自己的應用中啟動元件,因為您知道要啟動的活動或服務的類名。例如,響應使用者操作啟動新的activity或啟動服務以在後臺下載檔案。
  • 式Intent隱式意圖不指定特定元件,而是宣告要執行的操作,這允許來自另一個應用程式的元件處理它。例如,如果要向用戶顯示地圖上的位置,則可以使用隱式意圖請求另一個可以在地圖上顯示位置的應用程式。

當您使用顯式意圖建立啟動activity或service時,系統會立即啟動Intent物件中指定的應用程式元件。當您建立隱式intent時,Android系統會通過將intent的內容與裝置上其他應用程式的manifest檔案中宣告的intent過濾器進行比較來找到適當的元件。如果intent與intent過濾器匹配,則系統啟動該元件並將其傳遞給Intent物件。如果多個intent過濾器相容,系統將顯示一個對話方塊,以便使用者可以選擇要使用的應用程式。

意圖過濾器是應用程式清單檔案中的表示式,用於指定元件要接收的意圖型別。例如,通過為活動宣告一個意圖過濾器,您可以讓其他應用程式以某種意圖直接啟動您的活動。同樣,如果您沒有為活動宣告任何意圖過濾器,那麼只能使用顯式意圖啟動它。

警告:為確保您的應用程式安全,在啟動service時始終使用明確的意圖,並且不要為您的service宣告意圖過濾器。使用隱式意圖啟動service存在安全隱患,因為您無法確定哪些service將響應意圖,並且使用者無法檢視啟動哪個service。從Android 5.0(API級別21)開始,如果使用隱式intent呼叫bindService(),系統將引發異常。

圖1。 如何通過系統傳遞隱式意圖以啟動另一個活動的說明:[1]活動A建立一個帶有動作描述的Intent並將其傳遞給startActivity()。 [2] Android系統在所有應用中搜索與意圖匹配的意圖過濾器。當找到匹配時,[3]系統通過呼叫其onCreate()方法並將其傳遞給Intent來啟動匹配活動(Activity B)。

建立Intent

Intent物件攜帶Android系統用於確定啟動哪個元件的資訊(例如應該接收意圖的確切元件名稱或元件類別),並提供接收元件用於正確執行操作的資訊(例如要採取的操作和要處理的資料)。

Intent中包含的主要資訊如下:

Component name

要啟動的元件名稱。

這是可選的,但它是使顯式意圖的關鍵資訊,這意味著意圖僅傳遞給在app明確給定名稱的元件。如果沒有元件名稱,則意圖是隱式的,系統根據其他意圖資訊(例如下面描述的操作,資料和類別)決定哪個元件應該接收這個意圖。因此,如果您需要在應用程式中啟動特定元件,則應指定元件名稱。

注意:啟動服務時,應始終指定元件名稱。否則,您無法確定哪些服務將響應意圖,並且使用者無法檢視哪個服務啟動。

ComponentName物件是Intent的一個欄位,您可以使用目標元件的完全限定類名指定該物件,包括應用程式的包名稱。例如,com.example.ExampleActivity。您可以使用setComponent(),setClass(),setClassName()或Intent建構函式設定元件名稱。

Action

一個字串,指定要執行的一般操作(例如檢視或選取)。

在廣播意圖的情況下,這是觸發並廣播的動作。該操作很大程度上決定了意圖的其餘部分是如何構建的 - 特別是資料和附加內容中包含的內容。

您可以指定自己的Action以供應用程式中的意圖使用(或供其他應用程式用於呼叫自己應用程式中的元件),但通常應使用由Intent類或其他框架類定義的Action常量。以下是啟動活動的一些常見Action:

當您擁有活動可以向用戶顯示的某些資訊時,例如要在相簿應用中檢視的照片或要在地圖應用中檢視的地址,請將具有此Action的intent傳入startActivity()。

也稱為“共享”意圖,當您擁有使用者可以通過其他應用程式(例如電子郵件應用程式或社交共享應用程式)共享的某些資料時,請將具有此Action的intent傳入startActivity()。

有關定義通用action的更多常量,請參閱Intent類參考。其他操作在Android框架的其他位置定義,例如在“設定”中,用於在系統的“設定”應用中開啟特定螢幕的action。

您可以使用setAction()或Intent建構函式指定intent的action。

如果您定義自己的action,請確保將應用程式的包名稱作為字首。例如:

static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";

Data

URI(一個Uri物件),它標識要作用的資料和/或該資料的MIME型別。提供的資料型別通常由意圖的action決定。例如,如果操作是ACTION_EDIT,則資料應包含要編輯的文件的URI。

在建立intent時,除了URI之外,通常還需要指定資料型別(其MIME型別)。例如,即使URI格式可能類似,但能夠顯示影象的activity可能無法播放音訊檔案。因此,指定資料的MIME型別有助於Android系統找到接收意圖的最佳元件。但是,有時可以從URI推斷MIME型別 - 特別是當資料是content: URI時,表示資料位於裝置上並由ContentProvider控制,這使得資料MIME型別對系統可見。

要僅設定資料URI,請呼叫setData()。要僅設定MIME型別,請呼叫setType()。如有必要,可以使用setDataAndType()明確設定它們。

警告:如果要同時設定URI和MIME型別,請不要呼叫setData()和setType(),因為它們都會使另一個的值無效。應當使用setDataAndType()來設定URI和MIME型別。

Category

一個字串,包含有關應處理意圖的元件型別的其他資訊。可以在意圖中放置任意數量的類別描述,但大多數意圖不需要類別。以下是一些常見類別:

目標activity允許自己由Web瀏覽器啟動,以顯示由連結引用的資料,例如影象或電子郵件訊息。

activity是任務的初始活動,並列在系統的應用程式啟動器中。

有關完整的類別列表,請參閱Intent類說明。

您可以使用addCategory()指定類別。

上面列出的這些屬性(元件名稱,操作,資料和類別)表示intent的定義特徵。通過讀取這些屬性,Android系統能夠解析應該啟動應用程式的哪個元件。

但是,意圖還可以攜帶不影響如何解析應用程式元件的其他資訊。意圖還可以提供:

Extras

帶有完成所請求操作所需的附加資訊的鍵值對。正如某些操作使用特定型別的資料URI一樣,某些操作也使用特定的附加功能。您可以使用各種putExtra()方法新增額外資料,每個方法都接受兩個引數:鍵名和值。您還可以使用所有額外資料建立Bundle物件,然後使用putExtras()將Bundle插入Intent中。例如,在建立使用ACTION_SEND傳送電子郵件的意圖時,您可以使用EXTRA_EMAIL鍵指定“收件人”,並使用EXTRA_SUBJECT鍵指定“主題”。

Intent類為標準化資料型別指定了許多EXTRA_ *常量。如果您需要宣告自己的額外Key(用於您的應用收到的意圖),請務必將您應用的包名稱作為字首。例如:

static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";

Flags

Intent類中定義的標誌,用作intent的元資料。flags可以指示Android系統如何啟動activity(例如,activity應該屬於哪個task)以及如何在啟動activity後對其進行處理(例如,它是否屬於最近activity的列表)。 有關更多資訊,請參閱setFlags()方法

顯式意圖舉例

顯式意圖是您用於啟動特定應用程式元件的意圖,例如應用程式中的特定activity或service。要建立顯式意圖,請定義Intent物件的元件名稱 以及意圖可選的其他屬性。

例如,如果您在應用程式中構建了一個名為DownloadService的服務,旨在從Web下載檔案,則可以使用以下程式碼啟動它:

// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);

Intent(Context,Class)建構函式為應用程式Context和元件提供Class物件。因此,此意圖顯式啟動應用程式中的DownloadService類。

有關構建和啟動服務的詳細資訊,請參閱“Services指南”。

隱式意圖舉例

隱式intent指定可以呼叫裝置上能夠執行本次操作的任何應用程式。當您的應用無法執行此操作時,但其他應用可能可以,使用隱式意圖很有用,您希望讓使用者來選擇要使用的執行此操作的應用。

例如,如果您希望使用者與其他人分享某些內容,可以使用ACTION_SEND Action建立意圖,並新增指定要分享內容的附加內容。當您使用該意圖呼叫startActivity()時,使用者可以選擇一個應用程式去分享這些內容。

注意:使用者可能沒有安裝可以處理您傳送到startActivity()的隱式意圖的應用程式。如果發生這種情況,呼叫將失敗,您的應用將崩潰。要驗證是否有activity接收intent,請在Intent物件上呼叫resolveActivity()。如果結果為非null,則至少有一個應用程式可以處理意圖,並且可以安全地呼叫startActivity()。如果結果為null,則不應使用此intent,如果可能,應禁用發出此intent的功能。

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");

// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(sendIntent);
}

 注意:In this case, a URI is not used, but the intent's data type is declared to specify the content carried by the extras

當呼叫startActivity()時,系統會檢查所有已安裝的應用程式,以確定哪些應用程式可以處理此類意圖(使用ACTION_SEND操作並帶有“text / plain”資料的意圖)。如果只有一個應用程式可以處理它,那麼該應用程式會立即開啟並傳遞該意圖。如果多個活動接受意圖,系統將顯示一個對話方塊,以便使用者可以選擇要使用哪一個應用程式接收該意圖。

App 選擇器

當有多個應用程式響應您的隱式意圖時,使用者可以選擇要使用的應用程式,並使該應用程式成為該Action的預設選擇。這在執行使用者可能希望以後使用相同應用程式開啟該Action時非常有用,例如在開啟網頁時(使用者通常只喜歡一個Web瀏覽器)。

但是,如果多個應用程式可以響應意圖,並且使用者可能希望每次都使用其他應用程式,則應明確顯示選擇器對話方塊。選擇器對話方塊要求使用者每次選擇要用於操作的應用程式(使用者無法為action選擇預設應用程式)。例如,當您的應用使用ACTION_SEND action執行“共享”時,使用者可能希望根據其當前情況使用其他應用進行共享,因此您應始終使用選擇器對話方塊,如圖2所示。

圖2,app選擇器對話方塊。

要顯示選擇器,請使用createChooser()建立一個Intent並將其傳遞給startActivity()。例如:

Intent sendIntent = new Intent(Intent.ACTION_SEND);
...

// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show the chooser dialog
Intent chooser = Intent.createChooser(sendIntent, title);

// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

這將顯示一個對話方塊,其中包含響應傳遞給createChooser()方法的意圖的應用程式列表,並使用提供的文字作為對話方塊標題。

接受隱式意圖

要通知系統您的app可以接收哪些隱式意圖,請在清單檔案中使用<intent-filter>標籤為每個應用元件宣告一個或多個意圖過濾器。每個intent過濾器根據intent的操作,資料和類別指定它接受的意圖型別。僅當意圖可以通過您的一個意圖過濾器時,系統才會向您的應用程式元件提供隱式意圖。

注意:無論元件宣告什麼意圖過濾器,顯式意圖總是會傳遞給其目標。

應用程式元件應為其可以執行的每個單一操作宣告單獨的過濾器。例如,圖片庫應用中的一個activity可能有兩個過濾器:一個用於檢視影象的過濾器,另一個用於編輯影象的過濾器。當activity啟動時,它會檢查Intent並根據Intent中的資訊決定如何操作(例如是否顯示編輯器控制元件)。

每個意圖過濾器在應用程式清單檔案中由<intent-filte>標籤定義,巢狀在相應的應用程式元件中(<activity>元素)。在<intent-filter>內,您可以使用以下三個元素中的一個或多個來指定要接受的意圖型別:

在name屬性中宣告接受的intent操作。值必須是操作的文字字串值,而不是類常量。

宣告接受的資料型別,使用指定資料URI(方案,主機,埠,路徑等)和MIME型別的各個方面的一個或多個屬性宣告。

在name屬性中宣告接受的intent類別。值必須是操作的文字字串值,而不是類常量。

注意:要接收隱式意圖,必須在intent過濾器中包含CATEGORY_DEFAULT類別。方法startActivity()和startActivityForResult()將所有意圖視為已宣告CATEGORY_DEFAULT類別。如果您未在意圖過濾器中宣告此類別,則不會將隱式意圖傳達到您的活動。

例如,這是一個帶有intent過濾器的活動宣告,用於在資料型別為text時接收ACTION_SEND意圖:

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

可以建立一個包含多個<action>,<data>或<category>例項的過濾器。如果這樣做,您只需要確定該元件可以處理這些過濾器元素的任何和所有組合。

如果要處理多種意圖,但只能處理action,data和category型別的特定組合,則需要建立多個意圖過濾器。

通過將意圖與三個元素中的每一個進行比較,針對過濾器去比對隱式意圖。要傳遞給元件,意圖必須通過所有三個比對。如果它不能匹配其中一個,Android系統將不會將意圖傳遞給元件。但是,由於元件可能具有多個intent過濾器,因此不通過元件某個過濾器的intent可能會在另一個過濾器上通過。有關如何解析意圖的更多資訊,請參閱以下有關Intent Resolution的部分。

警告:為避免無意中執行其他應用程式的服務,請始終使用顯式意圖來啟動您自己的service,並且不要為您的service宣告意圖過濾器。

注意:對於所有activity,您必須在清單檔案中宣告您的intent過濾器。但是對於廣播接收器,可以通過呼叫registerReceiver()動態註冊廣播接收器的過濾器。然後,您可以使用unregisterReceiver()取消註冊接收器。這樣做可以讓您的應用在應用執行時僅在指定的時間段內收聽特定的廣播。

過濾器舉例

要更好地瞭解某些意圖過濾器行為,請檢視社交共享應用程式清單檔案中的以下程式碼段。

<activity android:name="MainActivity">
    <!-- This activity is the main entry, should appear in app launcher -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name="ShareActivity">
    <!-- This activity handles "SEND" actions with text data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <action android:name="android.intent.action.SEND_MULTIPLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.google.panorama360+jpg"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="video/*"/>
    </intent-filter>
</activity>

第一個活動MainActivity是應用程式的主要入口點 - 當用戶最初使用啟動器圖示啟動應用程式時開啟的活動:

  • ACTION_MAIN操作表明這是主入口點,並且不期望任何意圖資料。
  • CATEGORY_LAUNCHER類別表示此活動的圖示應放在系統的應用啟動器中。如果<activity> 元素未指定icon圖示,系統使用<application>元素中的icon作為圖示。

這兩個必須配對在一起才能使activity出現在應用啟動器中。

第二個activity,ShareActivity用於共享文字和媒體內容。使用者可以通過從MainActivity導航到此activity,也可以直接從另一個應用程式進入ShareActivity,只需該應用程式發出與兩個意圖過濾器其中一個匹配的隱式意圖。

注意:MIME型別application / vnd.google.panorama360 + jpg是一種特殊資料型別,用於指定全景照片,您可以使用Google全景圖API處理這些照片。

使用掛起意圖

PendingIntent物件是Intent物件的包裝器。 PendingIntent的主要目的是授予外部應用程式使用包含的Intent的許可權,就像它是從應用程式自己的程序執行一樣。

掛起意圖的主要用例包括:

  • 聲明當使用者使用您的通知執行操作時執行的意圖(Android系統的NotificationManager執行Intent)。
  • 聲明當使用者使用您的App Widget執行操作時執行的意圖(主螢幕應用程式執行Intent)。
  • 宣告將來在指定時間執行的意圖(Android系統的AlarmManager執行Intent)。

因為每個Intent物件由特定型別的app元件(Activity,Service或BroadcastReceiver)處理,所以PendingIntent也必須以相同的考慮因素建立。使用掛起意圖時,您的應用程式將不會通過諸如startActivity()之類的呼叫來執行意圖。在通過呼叫相應的建立者方法建立PendingIntent時,您必須宣告預期的元件型別:

  • PendingIntent.getActivity()用於啟動Activity的Intent。
  • PendingIntent.getService()用於啟動Service的Intent。
  • PendingIntent.getBroadcast()用於啟動BroadcastReceiver的Intent。

除非您的app接收另一個app的掛起意圖,否則以上是建立掛起意圖做常用的方法。

每個方法都傳入當前的應用程式Context,要封裝的Intent,以及一個或多個指定如何使用intent的標誌(例如intent是否可以多次使用)。

有關使用掛起意圖的更多資訊,請參閱每個相應用例的文件,例如Notifications and App Widgets API指南。

意圖解析

當系統收到啟動活動的隱式意圖時,它會根據以下三個方面通過比較意圖與意圖過濾器來搜尋意圖最匹配的activity:

  • The intent action
  • The intent data (both URI and data type)
  • The intent category

以下部分描述瞭如何根據在應用程式的清單檔案中宣告的intent過濾器,將Intent與相應的元件進行匹配。

Action比對

為了指定接受的意圖action,意圖過濾器可以宣告零或更多<action>元素。例如:

<intent-filter>
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.VIEW" />
    ...
</intent-filter>

要通過此過濾器,Intent中指定的操作必須與過濾器中列出的操作之一匹配。

如果過濾器未列出任何action,則沒有任何意圖匹配,因此所有意圖都無法通過測試。但是,如果Intent未指定action,則它將通過比對(只要過濾器包含至少一個action)。

Category 比對

為了指定接受的意圖類別,意圖過濾器可以宣告零或更多< category>元素。例如:

<intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    ...
</intent-filter>

對於通過類別比對的意圖,Intent中的每個類別都必須與過濾器中的類別匹配。反過來不是必需的 - 意圖過濾器可以宣告比Intent中指定的類別更多的類別,Intent還是可以通過比對。

因此,無論過濾器中聲明瞭哪些類別,沒有類別的intent都應該始終通過此比對。

注意:Android會自動將CATEGORY_DEFAULT類別應用於傳遞給startActivity()和startActivityForResult()的所有隱式意圖。因此,如果您希望活動接收隱式意圖,則必須在其意圖過濾器中包含“android.intent.category.DEFAULT”的類別(如前面的<intent-filter>示例所示)。

Data 比對

為了指定接受的意圖資料,意圖過濾器可以宣告零個或多個<data>元素。例如:

<intent-filter>
    <data android:mimeType="video/mpeg" android:scheme="http" ... />
    <data android:mimeType="audio/mpeg" android:scheme="http" ... />
    ...
</intent-filter>

每個<data> 元素可以指定URI結構和資料型別(MIME媒體型別)。 URI的每個部分都有單獨的屬性 - 方案,主機,埠和路徑:

<scheme>://<host>:<port>/<path>

例如:

content://com.example.project:200/folder/subfolder/etc

在此URI中,方案是content,主機是com.example.project,埠是200,路徑是資料夾/子資料夾/ etc。

這些屬性中的每一個在< data>中都是可選的。但有依賴關係:

  • 如果未指定方案,則忽略主機。
  • 如果未指定主機,則端忽略埠。
  • 如果方案和主機都為指定,則忽略路徑。

當intent中的URI與過濾器中的URI規範進行比較時,它僅與過濾器中包含的URI部分進行比較。例如:

  • 如果過濾器僅指定方案,則具有該方案的所有URI都與過濾器匹配。
  • 如果過濾器指定方案和許可權但沒有路徑,則具有相同方案和許可權的所有URI都將通過過濾器,而不管其路徑如何。
  • 如果過濾器指定方案,許可權和路徑,則只有具有相同方案,許可權和路徑的URI才會通過過濾器。

注意:路徑規範可以使用萬用字元星號(*),只需要路徑名的部分匹配。

資料比對將intent中的URI和MIME型別與過濾器中指定的URI和MIME型別進行比較。規則如下:

  1. 僅當過濾器未指定任何URI或MIME型別時,不包含URI或MIME型別的intent才會通過測試。
  2. 包含URI但沒有MIME型別的意圖(既不顯式也不能從URI中提取)只有在其URI與過濾器的URI格式匹配且過濾器同樣未指定MIME型別時才會通過測試。
  3. 僅當過濾器列出相同的MIME型別且未指定URI格式時,包含MIME型別但不包含URI的intent才會通過測試。
  4. An intent that contains both a URI and a MIME type (either explicit or inferable from the URI) passes the MIME type part of the test only if that type matches a type listed in the filter. It passes the URI part of the test either if its URI matches a URI in the filter or if it has a content: or file: URI and the filter does not specify a URI. In other words, a component is presumed to support content: and file: data if its filter lists only a MIME type.

最後一條規則(4)反映了元件能夠從檔案或content provider中獲取本地資料的能力。因此,他們的過濾器只需列出資料型別,而不需要明確指定content:和file:的schemes。這裡有一個典型案例。以下<data>元素告訴Android該元件可以從內容提供者獲取影象資料並顯示它:

<intent-filter>
    <data android:mimeType="image/*" />
    ...
</intent-filter>

由於大多數可用資料由內容提供者分發,因此指定資料型別但不指定URI的過濾器可能是最常見的。

另一種常見配置是具有方案和資料型別的過濾器。例如,像下面這樣的<data>元素告訴Android該元件可以從網路中檢索視訊資料以執行操作:

<intent-filter>
    <data android:scheme="http" android:type="video/*" />
    ...
</intent-filter>

意圖匹配

Intent與intent過濾器匹配,不僅可以發現要啟用的目標元件,還可以發現有關裝置上元件集的資訊。例如,Home應用程式通過使用指定ACTION_MAIN操作和CATEGORY_LAUNCHER類別的intent過濾器查詢所有活動來填充應用程式啟動器。

您的應用程式可以以類似的方式使用意圖匹配。PackageManager有一組查詢...()方法,它們返回所有可以接受特定意圖的元件,以及一系列類似的resolve ...()方法,用於確定響應意圖的最佳元件。例如,queryIntentActivities()返回可以執行作為引數傳遞的intent的所有活動的列表,queryIntentServices()返回類似的服務列表。這兩種方法都沒有啟用元件;他們只列出可以響應的那些元件。對於廣播接收器,有一種類似的方法queryBroadcastReceivers()。