建立應用程式內容的深層連結

當點選的連結或程式輔助要求叫用網頁 URI 意圖時,Android 系統會依序嘗試下列各項動作,直到要求成功為止:

  1. 開啟使用者偏好的應用程式 (如果有指定的話),該應用程式可處理 URI。
  2. 開啟唯一可處理 URI 的應用程式。
  3. 允許使用者從對話方塊中選取應用程式。

請按照下列步驟建立及測試內容連結。您也可以使用 Android Studio 中的 應用程式連結小幫手,新增 Android 應用程式連結。

注意: 自 Android 12 (API 級別 31) 起,只有在應用程式獲准使用網頁意圖中包含的特定網域時,一般網頁意圖才能解析為應用程式中的活動。如果您的應用程式未獲網域核准,網頁意圖就會改為解析至使用者的預設瀏覽器應用程式。

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

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

<action>
指定 ACTION_VIEW 意圖動作,讓意圖篩選器可透過 Google 搜尋觸及。
<data>
加入一或多個 <data> 標記,每個標記都代表可解析為活動的 URI 格式。<data> 標記至少必須包含 android:scheme 屬性。

您可以新增更多屬性,進一步指定活動接受的 URI 類型。舉例來說,您可能有好幾個活動接受類似的 URI,但這些活動只因路徑名稱而有所不同。在這種情況下,請使用 android:path 屬性或其 pathPatternpathPrefix 變化版本,區分系統應針對不同 URI 路徑開啟哪個活動。

<category>
請加入 BROWSABLE 類別。這項屬性是必要的,才能透過網路瀏覽器存取意圖篩選器。如果沒有這個值,使用者在瀏覽器中點選連結時,系統就無法將連結解析為您的應用程式。

並納入 DEFAULT 類別。這可讓應用程式回應隱含意圖。否則,只有在意圖指定應用程式元件名稱時,才能啟動活動。

以下 XML 程式碼片段示範如何在資訊清單中指定意圖篩選器,以便進行深層連結。“example://gizmos”“http://www.example.com/gizmos” 這兩個 URI 都會解析為這個活動。

<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> 元素,但如果您想宣告不重複的網址 (例如 schemehost 的特定組合),請務必建立個別的篩選器,因為同一個意圖篩選器中的多個 <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.comapp://open.my.app。但實際上,它支援這兩種格式,以及以下格式:app://www.example.comhttps://open.my.app

注意:如果多個活動包含意圖篩選器,且這些意圖篩選器會解析至相同的已驗證 Android 應用程式連結,則無法保證哪個活動會處理連結。

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

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

讀取傳入意圖的資料

系統透過意圖篩選器啟動活動後,您可以使用 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

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

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