当点击的链接或程序化请求调用 Web URI intent 时,Android 系统会按顺序尝试执行以下每项操作,直到请求成功为止:
- 打开用户可处理该 URI 的首选应用(如果已指定)。
- 打开唯一可以处理该 URI 的应用。
- 允许用户从对话框中选择应用。
请按以下步骤创建并测试指向您的内容的链接。您还可以使用 Android Studio 中的 App Links Assistant 添加 Android App Links。
注意 :从 Android 12(API 级别 31)开始,仅当您的应用获准使用某个通用网络 intent 中包含的特定网域时,该网络 intent 才会解析为应用中的 activity。如果您的应用未获准用于该网域,Web intent 会改为解析为用户的默认浏览器应用。
为传入链接添加 intent 过滤器
如需创建指向应用内容的链接,请在清单中添加一个包含以下元素和属性值的 intent 过滤器:
<action>
- 指定
ACTION_VIEW
intent 操作,以便能够从 Google 搜索中访问该 intent 过滤器。 <data>
- 添加一个或多个
<data>
标记,每个标记代表一个解析为 activity 的 URI 格式。<data>
标记必须至少包含android:scheme
属性。您可以添加更多属性,以进一步细化 Activity 接受的 URI 类型。例如,您可能有多个接受类似 URI,但只是路径名称有所不同的 activity。在这种情况下,请使用
android:path
属性或其pathPattern
或pathPrefix
变体来区分系统应针对不同 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>
元素,但如果要声明唯一网址(例如 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
之外,它还实际支持这两种方式。
注意:如果多个 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 和应用链接,请参阅以下资源: