借助深层链接,您可以将用户从网络浏览器、通知、社交媒体、广告和其他来源直接引导至您的应用。深层链接可提供直接的应用到应用和网站到应用过渡,有助于您通过情境化、有针对性的内容提高互动度。
本指南介绍了深层链接的工作原理,以及如何创建和测试指向您内容的深层链接。
对于引用您自己的网站或网域的深层链接,我们建议您使用应用链接,以便为用户提供顺畅、可信的体验。
深层链接的运作方式
深层链接是 Android 的一项通用系统功能,在所有设备上的所有版本中均受支持。它利用 Android 的 intent 系统将深层链接路由到感兴趣的应用。想要处理特定深层链接 URI 的应用会在其应用清单文件中声明匹配的 intent 过滤器。
在运行时,当用户点按某个链接时,Android 会触发一个 intent 并尝试将其路由到某个应用。由于多个应用可以声明与给定 URI 匹配的 intent 过滤器,因此 Android 会按以下顺序执行这些操作来路由 intent:
- 打开用户的默认应用,该应用可以处理 URI(如果已指定)。
- 打开唯一可处理该 URI 的可用应用。
- 允许用户从消除歧义对话框中选择应用。
这意味着,即使您的 intent 过滤器与给定 URI 匹配,也无法保证系统会将深层链接 intent 路由到您的应用。用户在管理哪个应用处理 intent 方面发挥着关键作用,这让他们能够掌控并提供选择。如需更好地控制指向您自己的网站和网域的深层链接,请尝试使用 App Links。
Android 的消除歧义对话框可让用户看到已注册处理深层链接 intent 的所有安装式应用。用户还可以选择将某个应用作为此类链接的默认应用。用户设置默认应用后,系统便不会再针对该特定 intent 显示对话框,而是会自动打开所选应用。
消除歧义对话框的行为在各个 Android 版本中有所不同。 例如,在 Android 12 及更高版本中,未经验证的应用链接的网页链接通常会默认在网络浏览器中打开,而在之前的版本中,如果应用可以处理网页链接,则可能会显示消除歧义对话框。
深层链接的类型
您可以在 Android 上支持三种类型的深层链接:
- 自定义深层链接:这些深层链接使用自定义 URI scheme(例如
example://products/123)将用户直接引导至应用内的特定内容。它们非常适合用于内部导航或来自您控制的来源的链接,但它们不是标准网页链接,如果其他应用注册了相同的自定义 scheme,它们仍可能触发消除歧义对话框。 - 网页链接:这些是使用标准
http和https架构的深层链接。它们是标准网址,因此用途更广泛,但在 Android 12 及更高版本上,它们几乎总是会触发消除歧义对话框,这意味着它们很可能会默认由用户的网络浏览器处理,而不是路由到您的应用。 - App Links:自 Android 6.0(API 级别 23)起可用,这些是经过验证的网页链接。通过网站关联流程,您可以向 Android 系统证明您拥有该网域。验证完成后,系统会自动将该网域的链接直接路由到您的应用,完全跳过消除歧义对话框。这可以为用户打造值得信赖的顺畅体验。
为传入链接添加 intent 过滤器
如需创建指向应用内容的链接,请在清单中添加一个包含以下元素和属性值的 intent 过滤器:
指定 ACTION_VIEW intent 操作,以便可以从 Google 搜索访问 intent 过滤器。
添加一个或多个 <data> 标记,每个标记都代表一个解析为 activity 的 URI 格式。<data> 标记必须至少包含 android:scheme 属性。
您可以添加更多属性,以进一步细化 activity 接受的 URI 类型。例如,您可能有多个接受类似 URI 但路径不同的 activity。在这种情况下,请使用 android:path 属性或其 pathPattern 或 pathPrefix 变体来区分系统应针对不同的 URI 路径打开哪个 activity。
添加 BROWSABLE 类别。必须添加此类别,才能从网络浏览器访问 intent 过滤器。如果没有它,点击浏览器中的链接将无法解析到您的应用。
还应包含 DEFAULT 类别。这样,您的应用就可以响应隐式 intent。否则,只有在 intent 指定您的应用组件名称时,才能启动该 activity。
以下 XML 代码段展示了如何在清单中为深层链接指定 intent 过滤器。URI "example://gizmos" 和 "http://www.example.com/gizmos" 都会解析为此 activity。
<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>
请注意,这两个 intent 过滤器仅在 <data> 元素上有所不同。虽然可以在同一过滤器中包含多个 <data> 元素,但如果您打算声明唯一网址(例如 scheme 和 host 的特定组合),请务必创建单独的过滤器,因为同一 intent 过滤器中的多个 <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。
在您向应用清单添加了包含 activity 内容 URI 的 intent 过滤器后,Android 便能够在运行时将具有匹配 URI 的任何 Intent 路由到您的应用。
如需详细了解如何定义 intent 过滤器,请参阅允许其他应用启动您的 activity。
读取传入 intent 中的数据
系统通过 intent 过滤器启动 activity 后,您可以使用 Intent 提供的数据来确定需要呈现的内容。调用 getData() 和 getAction() 方法,检索与传入的 Intent 关联的数据和操作。您可以在 activity 生命周期的任何时间调用这些方法,但通常应在早期回调(例如,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 调试桥与 activity 管理器 (am) 工具搭配使用,以测试您为深层链接指定的 intent 过滤器 URI 是否会解析为正确的应用 activity。您可以针对设备或模拟器运行 adb 命令。
使用 adb 测试 intent 过滤器 URI 的一般语法为:
$ adb shell am start
-W -a android.intent.action.VIEW
-d <URI> <PACKAGE>
例如,以下命令会尝试查看与指定 URI 关联的目标应用 activity。
$ adb shell am start
-W -a android.intent.action.VIEW
-d "example://gizmos" com.example.android
从 Android 17 开始,您还可以将 --debug-link 标志与 am start 搭配使用,以诊断系统如何解析网址,并检查匹配的 intent 过滤器或动态应用链接规则。如需了解详情,请参阅使用 debug-link 标志诊断链接解析。
您设置的清单声明和 intent 处理程序定义了应用与网站之间的连接,以及如何处理传入链接。不过,为了让系统将您的应用视为一组 URI 的默认处理程序,您还必须请求系统验证此连接。验证应用链接介绍了如何实现此验证。
如需详细了解 intent 和应用链接,请参阅以下资源: