直接前往內容

最常造訪的網頁

最近瀏覽的網頁

navigation

允許其他應用程式啟動您的應用行為顯示

前兩課著重說明一個方面:從您的應用程式啟動其他應用程式的應用行為顯示。但是,若您的應用程式能執行可能適用於其他應用程式的行為,則應準備回應其他應用程式的行為要求。 例如,若您建置的社交應用程式可用於與使用者的好友分享訊息或相片,則支援 ACTION_SEND 意圖可為您帶來顯著受益,使用者藉此可從其他應用程式啟動「共用」行為,並啟動您的應用程式來執行該行為。

若要允許其他應用程式啟動您的應用行為顯示,需要在您的宣示說明檔案中針對對應的 <activity> 元素新增 <intent-filter> 元素。

若您的應用程式安裝在裝置上,系統會識別您的意圖篩選器,並將資訊新增至安裝的所有應用程式都支援的意圖內部目錄中。在應用程式使用隱含意圖呼叫 startActivity()startActivityForResult() 時,系統會找出能回應意圖的一或多項應用行為顯示。

新增意圖篩選器

若要正確定義您的應用行為顯示可以處理的意圖,您新增的每個意圖篩選器都應儘可能具體地說明應用行為顯示所接受行為與資料的類型。

若應用行為顯示的意圖篩選器執行 Intent 物件的以下條件,系統會將指定的 Intent 傳送至該應用行為顯示:

行為
對要執行的行為進行命名的字串。通常是平台所定義值 (例如 ACTION_SENDACTION_VIEW) 的其中之一。

請在您的意圖篩選器中使用 <action> 元素指定此項目。在此元素中指定的值必須是行為的完整字串名稱,而非 API 常數 (請參閱以下範例)。

資料
對意圖所關聯資料的描述。

請在意圖篩選器中使用 <data> 元素指定此項目。在此元素中使用一或多個屬性,您可以僅指定 MIME 類型、URI 首碼、URI 配置,或指定這些項目的組合,以及表示所接受資料類型的其他項目。

注意:若您不需要宣告 Uri 資料的有關詳情 (例如若您的應用行為顯示處理其他類型的「額外」資料,而非處理 URI),應僅指定 android:mimeType 屬性以宣告應用行為顯示處理的資料類型,例如 text/plainimage/jpeg

類別
提供對處理意圖的應用行為顯示進行特性描述的其他方式,通常與使用者的手勢或應用行為顯示的啟動位置有關。 系統支援多種不同的類別,但大多數類別很少使用。 然而依預設,所有隱含意圖都與 CATEGORY_DEFAULT 一併定義。

請在意圖篩選器中使用 <category> 元素指定此項目。

在意圖篩選器中,您可以宣告每個條件以及 <intent-filter> 元素中巢套的對應 XML 元素,以宣告應用行為顯示所接受的條件。

例如,若資料類型為文字或影像,以下應用行為顯示具備的意圖篩選器可處理 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"/>
        <data android:mimeType="image/*"/>
    </intent-filter>
</activity>

傳入的每項意圖只會指定一項行為與一種資料類型,但是在每個 <intent-filter> 中,可以宣告 <action><category><data> 元素的多個執行個體。

若兩個行為與資料配對在行為方面彼此排斥,您應建立單獨的意圖篩選器,以指定與哪些資料類型配對時可接受哪些行為。

例如,假設您的應用行為顯示可處理 ACTION_SENDACTION_SENDTO 意圖的文字與影像。在此情況下,您必須針對兩個行為定義兩個單獨的意圖篩選器,因為 ACTION_SENDTO 意圖必須使用 Uri 資料指定接收者的地址 (使用 sendsendto URI 配置)。 例如:

<activity android:name="ShareActivity">
    <!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
    <intent-filter>
        <action android:name="android.intent.action.SENDTO"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="sms" />
        <data android:scheme="smsto" />
    </intent-filter>
    <!-- filter for sending text or images; accepts SEND action and text or image data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

注意:若要接收隱含意圖,您必須在意圖篩選器中納入 CATEGORY_DEFAULT 類別。 startActivity()startActivityForResult() 方法對所有意圖進行處理時,就像已宣告 CATEGORY_DEFAULT 類別一樣。 若您在意圖篩選器中未宣告該類別,不會將任何隱含意圖解析為您的應用行為顯示。

如需有關傳送及接收 ACTION_SEND 意圖 (執行社交共用行為) 的詳細資訊,請參閱有關接收其他應用程式的簡單資料的課程。

在應用行為顯示中處理意圖

若要確定您應用行為顯示中將採用的行為,您可以讀取用於啟動該應用行為顯示的 Intent

您的應用行為顯示啟動時,請呼叫 getIntent() 以擷取啟動該應用行為顯示的 Intent。 在應用行為顯示的生命週期期間,您隨時可以執行該作業,但通常應在早期回呼 (例如 onCreate()onStart()) 期間執行。

例如:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    // Get the intent that started this activity
    Intent intent = getIntent();
    Uri data = intent.getData();

    // Figure out what to do based on the intent type
    if (intent.getType().indexOf("image/") != -1) {
        // Handle intents with image data ...
    } else if (intent.getType().equals("text/plain")) {
        // Handle intents with text ...
    }
}

傳回結果

若您希望將結果傳回至呼叫您意圖的應用行為顯示,只需呼叫 setResult() 以指定結果代碼及結果 Intent 即可。在您的操作已完成,且使用者應返回原始的應用行為顯示時,請呼叫 finish() 以關閉 (並終結) 您的應用行為顯示。 例如:

// Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");
setResult(Activity.RESULT_OK, result);
finish();

您必須始終一併指定結果代碼與結果。結果通常是 RESULT_OKRESULT_CANCELED。然後,您可以視需要為其他資料提供 Intent

注意:依預設,會將結果設為 RESULT_CANCELED。因此,若使用者在完成行為之前以及在您設定結果之前按下 [後退] 按鈕,原始應用行為顯示會收到「已取消」結果。

若您只需傳回表示其中一種結果選項的整數,可將結果代碼設為大於 0 的任意值。 若您使用結果代碼以提供整數,且無需納入 Intent,可以呼叫 setResult(),然後僅傳遞結果代碼。 例如:

setResult(RESULT_COLOR_RED);
finish();

在此情況下,可能只會有少數結果,因此結果代碼是本機定義的整數 (大於 0)。 若您將結果傳回至您應用程式內的應用行為顯示,此功能會非常適用,因為接收結果的應用行為顯示可以參考公用常數,以確定結果代碼的值。

注意:無需檢查是否已使用 startActivity()startActivityForResult() 啟動您的應用行為顯示。 若啟動應用行為顯示的意圖希望產生結果,只需呼叫 setResult() 即可。 若原始應用行為已呼叫 startActivityForResult(),則系統將向其傳遞您提供給 setResult() 的結果;否則,結果將被忽略。

本網站使用 Cookie 儲存你在此指定的語言和顯示選項偏好設定。

掌握有關 Android 開發人員的最新消息和實用訣竅,協助你製作最受歡迎的 Google Play 內容。

* 必填欄位

訂閱成功!

在 WeChat 上追蹤 Google Developers

你要以瀏覽這個網站嗎?

你要求以顯示這個網頁,但你為此網站指定的語言偏好設定為

是否要變更語言偏好設定並改用瀏覽網站?稍後如要變更語言偏好設定,請利用位在每個網頁最下方的語言選單來調整設定。

你的 API 層級必須達 以上才能存取這個級別

本說明文件已隱藏,因為你為該文件選取的 API 層級為 。使用左側導覽列上方的選取工具即可變更說明文件的 API 層級。

如需進一步瞭解如何為應用程式指定 API 層級的相關資訊,請參閱 Supporting Different Platform Versions (支援不同的平台版本) (英文)。

Take a short survey?
Help us improve the Android developer experience. (April 2018 — Developer Survey)