创建指向应用内容的深层链接

当单击的链接或程序请求调用 Web URI 意图时,Android 系统会按顺序尝试以下每个操作,直到请求成功。

  1. 打开用户首选的可以处理 URI 的应用(如果已指定)。
  2. 打开唯一可用的可以处理 URI 的应用。
  3. 允许用户从对话框中选择一个应用。

请按照以下步骤创建和测试指向您内容的链接。您还可以使用 Android Studio 中的 应用链接助手 添加 Android 应用链接。

注意: 从 Android 12(API 级别 31)开始,通用 Web 意图仅在您的应用获准使用该 Web 意图中包含的特定域名时才会解析为应用中的活动。如果您的应用未获准使用该域名,则 Web 意图将解析为用户默认的浏览器应用。

添加用于传入链接的意图过滤器

要创建指向应用内容的链接,请在清单中添加一个包含以下元素和属性值的意图过滤器

<action>
指定 ACTION_VIEW 意图操作,以便可以通过 Google 搜索访问意图过滤器。
<data>
添加一个或多个 <data> 标记,每个标记代表一个解析为活动的 URI 格式。至少,<data> 标记必须包含 android:scheme 属性。

您可以添加更多属性以进一步细化活动接受的 URI 类型。例如,您可能有多个活动接受类似的 URI,但它们仅仅基于路径名称而有所不同。在这种情况下,使用 android:path 属性或其 pathPatternpathPrefix 变体来区分系统应为不同的 URI 路径打开哪个活动。

<category>
包含 BROWSABLE 类别。这是为了使意图过滤器能够从 Web 浏览器访问而必需的。如果没有它,点击浏览器中的链接将无法解析为您的应用。

还要包含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> 元素,但重要的是,当您的意图是声明唯一 URL(例如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 调试桥与活动管理器 (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 的默认处理程序,您还必须请求系统验证此连接。下一课 解释了如何实现此验证。

要详细了解意图和应用链接,请参阅以下资源