當點選的連結或程式輔助要求叫用網路 URI 意圖時,Android 系統會依序嘗試執行以下每個動作,直到要求成功為止:
- 開啟使用者偏好的應用程式,可處理 URI (如果已指定的話)。
- 開啟唯一可處理 URI 的應用程式。
- 允許使用者從對話方塊選取應用程式。
請按照下列步驟建立並測試連至內容的連結。您也可以使用 Android Studio 中的應用程式連結小幫手新增 Android 應用程式連結。
注意: 自 Android 12 (API 級別 31) 起,只有當應用程式獲準存取網路意圖的特定網域時,一般網路意圖才會解析為應用程式中的活動。如果您的應用程式未獲準用於網域,網路意圖會改為解析使用者的預設瀏覽器應用程式。
為連入連結新增意圖篩選器
如要建立應用程式內容的連結,請在資訊清單中新增包含這些元素和屬性值的意圖篩選器:
<action>
- 指定
ACTION_VIEW
意圖動作,以便使用者透過 Google 搜尋存取意圖篩選器。 <data>
- 新增一或多個
<data>
標記,每個標記代表可解析為活動的 URI 格式。<data>
標記至少必須包含android:scheme
屬性。您可以新增更多屬性,進一步縮小活動接受的 URI 類型範圍。例如,您可能有多個接受類似 URI 的活動,但這些活動僅根據路徑名稱而有所差異。在這種情況下,請使用
android:path
屬性或其pathPattern
或pathPrefix
變數,區分系統應針對不同的 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>
元素,但當您意圖宣告不重複網址 (例如 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
。
注意:如果多個活動包含的意圖篩選器解析至同一個已驗證的 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 的預設處理常式,也必須要求系統驗證這個連線。下一個課程將說明如何實作這項驗證程序。
如要進一步瞭解意圖和應用程式連結,請參閱下列資源: