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

当点击的链接或程序化请求调用网络 URI Intent 时,Android 系统会按以下顺序依次尝试执行以下每项操作,直到请求成功为止:

  1. 如果指定了首选应用,则打开可处理该 URI 的用户首选应用。
  2. 打开唯一可处理该 URI 的可用应用。
  3. 允许用户从对话框中选择应用。

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

注意: 从 Android 12(API 级别 31)开始,通用网页 intent 只有在您的应用获得该网页 intent 中包含的特定网域的批准后,才会解析为应用中的 Activity。如果您的应用未获得该网域的批准,则该网页 intent 会解析为用户的默认浏览器应用。

为传入链接添加 intent 过滤器

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

<action>
指定 ACTION_VIEW intent 操作,以便可以从 Google 搜索中访问该 intent 过滤器。
<data>
添加一个或多个 <data> 标签,每个标签都代表一个解析为 Activity 的 URI 格式。 <data> 标签必须至少包含 android:scheme 属性。

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

<category>
包含 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> 元素,但当您打算声明唯一的 URL(例如 schemehost 的特定组合)时,务必创建单独的过滤器,因为同一 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.comapp://open.my.app。但实际上,它除了支持这两个之外,还支持以下这些:app://www.example.comhttps://open.my.app

注意: 如果多个 Activity 包含解析为同一经过验证的 Android 应用链接的 intent 过滤器,则无法保证哪个 Activity 处理该链接。

将包含 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

您在上面设置的清单声明和 intent 处理程序定义了您的应用与网站之间的连接以及如何处理传入链接。但是,要让系统将您的应用视为一组 URI 的默认处理程序,您还必须请求系统验证此连接。下一课介绍了如何实现此验证。

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