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

当点击的链接或程序化请求调用网页 URI intent 时,Android 系统会 按顺序尝试以下每项操作,直到请求成功:

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

请按以下步骤创建并测试指向您的内容的链接。您还可以使用 Android Studio 中的 App Links Assistant 中,添加 Android App Links。

注意 :从 Android 12(API 级别 31)开始, 仅当您的应用获准 该网络意图中包含的特定域。如果您的应用未获准用于 该域,网络 intent 将解析为用户的默认浏览器应用 。

为传入链接添加 intent 过滤器

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

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

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

<category>
包含BROWSABLE 类别。必须设置该 intent 过滤器,才能从网络访问 intent 过滤器 。否则,在浏览器中点击链接便无法解析为您的应用。

此外,还要包含 DEFAULT 类别。 这样您的应用才可以响应隐式 intent。如果没有此属性,activity 可能会启动 仅当该 intent 指定您的应用组件名称时。

以下 XML 代码段展示了如何指定 intent 过滤器 添加到深层链接的清单中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>

请注意,这两个 intent 过滤器仅在 <data> 元素上存在差异。 虽然可以在一个过滤器中包含多个 <data> 元素, 如果您想声明唯一过滤器 网址(例如 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 包含解析为相同的 intent 过滤器 则无法保证具体是针对 会处理该链接。

向应用添加包含 activity 内容 URI 的 intent 过滤器后 清单,Android 能够将任何 Intent 在运行时包含与您的应用匹配的 URI。

如需详细了解如何定义 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 Debug 与 activity 管理器 (am) 工具桥接,以测试 intent 过滤器 您为深层链接指定的 URI 会解析为正确的应用 activity。您 可以针对设备或模拟器运行 adb 命令。

使用 adb 测试 intent 过滤器 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

您在上面设置的清单声明和 intent 处理程序定义您的应用之间的连接 以及如何处理传入链接。不过,在 为了让系统将您的应用视为一组 URI 的默认处理程序, 也会要求系统验证此连接。 下一课将介绍如何执行以下操作: 实施此验证。

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