建立深層連結

深層連結可讓您將使用者從網路瀏覽器、通知、社群媒體、廣告和其他來源直接帶入應用程式。深層連結可直接在應用程式之間或從網頁轉換至應用程式,有助於透過情境式指定內容提高參與度。

本指南說明深層連結的運作方式,以及如何建立及測試內容的深層連結。

如果深層連結參照的是您自己的網站或網域,建議使用應用程式連結,為使用者提供流暢、可靠的體驗。

深層連結的運作方式

深層連結是 Android 的一般系統功能,所有版本和裝置都支援。這項功能會利用 Android 的意圖系統,將深層連結轉送至相關應用程式。如果應用程式想處理特定深層連結 URI,則會在應用程式資訊清單檔案中宣告相符的意圖篩選器。

在執行階段,當使用者輕觸連結時,Android 會觸發意圖,並嘗試將其轉送至應用程式。由於多個應用程式可以宣告與指定 URI 相符的意圖篩選器,因此 Android 會依序採取下列動作來轉送意圖:

  1. 開啟使用者的預設應用程式,以便處理 URI (如有指定)。
  2. 開啟唯一可處理 URI 的應用程式。
  3. 允許使用者從消歧對話方塊中選取應用程式。

這表示即使意圖篩選器與特定 URI 相符,系統也不一定會將深層連結意圖轉送至您的應用程式。使用者在管理哪個應用程式處理意圖方面扮演重要角色,這可讓他們掌控並提供選擇。如要進一步控管連往自家網站和網域的深層連結,請嘗試使用應用程式連結。

Android 的消歧對話方塊可讓使用者查看所有已註冊處理深層連結意圖的安裝版應用程式。使用者也可以選取一個應用程式,做為這類連結的預設應用程式。使用者設定預設值後,系統就不會再顯示該特定意圖的對話方塊,並會自動開啟所選應用程式。

Android 系統消歧對話方塊,顯示連結的應用程式選項。
圖 1. 消歧對話方塊

消除歧義對話方塊的行為會隨著 Android 版本而有所不同。舉例來說,在 Android 12 以上版本中,未經驗證的應用程式連結網頁連結,預設通常會在網路瀏覽器中開啟,但在舊版中,如果應用程式可以處理網頁連結,則可能會顯示消歧對話方塊。

深層連結類型

Android 支援三種深層連結:

  • 自訂深層連結:這類深層連結使用自訂 URI 配置 (例如 example://products/123),可將使用者直接導向應用程式中的特定內容。這類連結適合用於內部導覽或您控制的來源連結,但並非標準網頁連結,且如果其他應用程式註冊相同的自訂配置,仍可能觸發消除歧義對話方塊。
  • 網頁連結:使用標準 http 和 https 配置的深層連結。由於是標準網址,因此用途更廣泛,但在 Android 12 以上版本中,幾乎一律會觸發消除歧義對話方塊,這表示預設情況下,系統可能會由使用者的網路瀏覽器處理,而不是轉送至您的應用程式。
  • 應用程式連結:自 Android 6.0 (API 級別 23) 起提供,是經過驗證的網頁連結。您可以透過網站關聯程序,向 Android 系統證明您擁有該網域。驗證完成後,系統會自動將該網域的連結直接轉送至應用程式,完全略過消歧對話方塊。為使用者提供值得信賴且流暢的體驗。

新增連入連結的意圖篩選器

如要建立應用程式內容連結,請在資訊清單中加入意圖篩選器,其中包含下列元素和屬性值:

<action>

指定 ACTION_VIEW 意圖動作,以便從 Google 搜尋連到意圖篩選器。

<data>

新增一或多個 <data> 標記,每個標記代表一個解析為活動的 URI 格式。<data> 標記至少必須包含 android:scheme 屬性。

您可以新增更多屬性,進一步精確定義活動接受的 URI 類型。舉例來說,您可能有多個接受類似 URI 的活動,但這些活動會因路徑而異。在這種情況下,請使用 android:path 屬性或其 pathPattern 或 pathPrefix 變體,區分系統應為不同 URI 路徑開啟的活動。

<category>

請使用 BROWSABLE 類別,必須設定這個屬性,才能透過網路瀏覽器存取意圖篩選器。如果沒有這項設定,在瀏覽器中點選連結就無法解析至應用程式。

也請加入 DEFAULT 類別。這樣一來,應用程式就能回應隱含意圖。如果沒有這個屬性,只有在意圖指定應用程式元件名稱時,才能啟動活動。

下列 XML 程式碼片段示範如何在資訊清單中指定深層連結的意圖篩選器。URI "example://gizmos" 和 "http://www.example.com/gizmos" 都會解析為這個活動。

<activity
    android:name="com.example.android.GizmosActivity"
    android:label="@string/title_gizmos" >
    <intent-filter android:label="@string/filter_view_http_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "http://www.example.com/gizmos" -->
        <data android:scheme="http"
              android:host="www.example.com"
              android:pathPrefix="/gizmos" />
        <!-- note that the leading "/" is required for pathPrefix-->
    </intent-filter>
    <intent-filter android:label="@string/filter_view_example_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "example://gizmos" -->
        <data android:scheme="example"
              android:host="gizmos" />
    </intent-filter>
</activity>

請注意,這兩個意圖篩選器只有 <data> 元素不同。雖然您可以在同一個篩選器中加入多個 <data> 元素,但如果您想宣告不重複的網址 (例如 scheme 和 host 的特定組合),請務必建立個別篩選器,因為同一個意圖篩選器中的多個 <data> 元素實際上會合併在一起,以反映其組合屬性的所有變化版本。例如,請考慮以下幾點:

<intent-filter>
  ...
  <data android:scheme="https" android:host="www.example.com" />
  <data android:scheme="app" android:host="open.my.app" />
</intent-filter>

這看起來可能只支援 https://www.example.com 和 app://open.my.app。不過,它實際上支援這兩種,以及 app://www.example.com 和 https://open.my.app。

在應用程式資訊清單中,為活動內容新增含有 URI 的意圖篩選器後,Android 就能在執行階段,將含有相符 URI 的任何 Intent 轉送至應用程式。

如要進一步瞭解如何定義意圖篩選器,請參閱「允許其他應用程式啟動您的 Activity」。

讀取傳入意圖的資料

系統透過意圖篩選器啟動活動後,您可以使用 Intent 提供的資料,判斷需要算繪的內容。呼叫 getData() 和 getAction() 方法,擷取與傳入 Intent 相關聯的資料和動作。您可以在活動生命週期的任何時間點呼叫這些方法,但一般做法是在回呼早期 (例如 onCreate() 或 onStart) 進行這項操作。

以下程式碼片段說明如何從 Intent 擷取資料:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val action: String? = intent?.action
    val data: Uri? = intent?.data
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();
}

請遵循下列最佳做法,提升使用者體驗:

  • 深層連結應直接導向內容,讓使用者略過提示訊息、插頁和登入程序。請確認使用者即使未曾開啟應用程式,也能查看應用程式內容。不過,當使用者進行後續互動,或從啟動器中開啟應用程式時,你就可以發送提示訊息。
  • 請按照「使用返回和向上按鈕進行導覽」一文所述的設計指南操作,確保使用者透過深層連結進入應用程式後,應用程式能符合使用者對返回導覽的預期。

測試深層連結

您可以使用 Android Debug Bridge 搭配活動管理工具 (am) 工具,測試您為深層連結指定的意圖篩選器 URI 是否解析為正確的應用程式活動。您可以對裝置或模擬器執行 ADB 指令。

使用 ADB 測試意圖篩選器 URI 的一般語法如下:

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d <URI> <PACKAGE>

舉例來說,下列指令會嘗試查看與指定 URI 相關聯的目標應用程式活動。

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d "example://gizmos" com.example.android

從 Android 17 開始,您也可以搭配 am start 使用 --debug-link 旗標,診斷系統如何解析網址,並檢查相符的意圖篩選器或動態應用程式連結規則。詳情請參閱「使用 debug-link 旗標診斷連結解析」。

您設定的資訊清單宣告和意圖處理常式,會定義應用程式與網站之間的連結,以及如何處理傳入連結。不過,如要讓系統將應用程式視為一組 URI 的預設處理常式,您也必須要求系統驗證這項連線。驗證應用程式連結說明如何實作這項驗證。

如要進一步瞭解意圖和應用程式連結,請參閱下列資源: