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

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

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

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

为传入链接添加 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 过滤器,则必须提供。否则,在浏览器中点击链接便无法解析为您的应用。

此外,还要包含 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>
    

请注意,<data> 元素是这两个 intent 过滤器的唯一区别。虽然同一过滤器可以包含多个 <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>
    

intent 过滤器似乎仅支持 https://www.example.comapp://open.my.app。但实际上,它支持的不仅是这两项,还有以下两项:app://www.example.comhttps://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
    

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

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