当点击的链接或编程请求调用 web URI intent 时,Android 系统会按顺序尝试以下每个操作,直到请求成功为止
- 打开用户首选的可以处理 URI 的应用(如果已指定)。
- 打开唯一可以处理 URI 的可用应用。
- 允许用户从对话框中选择一个应用。
请按照以下步骤创建和测试指向您内容的链接。您也可以使用 Android Studio 中的应用链接助手来添加 Android 应用链接。
注意: 从 Android 12(API 级别 31)开始,只有当您的应用已获得该 web intent 中包含的特定域的批准时,通用 web intent 才会解析为您的应用中的活动。如果您的应用未获得该域的批准,则 web intent 会解析为用户默认的浏览器应用。
为传入链接添加 intent 过滤器
要创建指向您的应用内容的链接,请在您的清单中添加一个包含以下元素和属性值的 intent 过滤器
<action>
- 指定
ACTION_VIEW
intent 操作,以便可以从 Google 搜索访问 intent 过滤器。 <data>
- 添加一个或多个
<data>
标签,每个标签代表一个解析为该活动的 URI 格式。至少,<data>
标签必须包含android:scheme
属性。您可以添加更多属性来进一步细化活动接受的 URI 类型。例如,您可能有多个活动接受类似的 URI,但只是基于路径名称有所不同。在这种情况下,请使用
android:path
属性或其pathPattern
或pathPrefix
变体来区分系统应为不同的 URI 路径打开哪个活动。 <category>
- 包含
BROWSABLE
类别。这是 intent 过滤器才能从网页浏览器访问所必需的。如果没有它,点击浏览器中的链接将无法解析到您的应用。还要包含
DEFAULT
类别。这允许您的应用响应隐式 intent。如果没有这个,只有当 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>
元素,但是当您的目的是声明唯一的 URL(例如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
。
注意:如果多个活动包含解析到相同已验证 Android 应用链接的 intent 过滤器,则无法保证哪个活动处理该链接。
将带有活动内容 URI 的 intent 过滤器添加到您的应用清单后,Android 就能在运行时将任何具有匹配 URI 的Intent
路由到您的应用。
要了解有关定义 intent 过滤器的更多信息,请参阅允许其他应用启动您的活动。
读取传入 intent 的数据
系统通过 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) 工具一起使用,以测试为深度链接指定的 intent 过滤器 URI 是否解析到正确的应用程序活动。您可以针对设备或模拟器运行 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 和应用链接的更多信息,请参阅以下资源