鸿蒙want对象:信息传递的载体(非常详细)
want 是一种对象,用于在应用组件之间传递信息,一种常见的使用场景是作为 startAbility() 方法的参数。
例如,当 UIAbilityA 需要启动 UIAbilityB 并向 UIAbilityB 传递一些数据时,可以使用 want 作为一个载体,将数据传递给 UIAbilityB。
下图展示的是 want 的用法示例:

图 1 want的用法示例
使用显式 want 启动目标应用组件时,调用方传入的 want 参数中指定了 abilityName 和 bundleName,通常用于在当前应用中启动已知的目标应用组件。
使用隐式 want 启动目标应用组件时,调用方传入的 want 参数中未指定 abilityName,用于在当前应用中使用其他应用提供的某个能力,由系统匹配声明支持该请求的应用来处理请求。
注意,因为系统中待匹配应用组件的匹配情况不同,使用隐式 want 启动应用组件时会出现以下 3 种情况:
从隐式 want 的定义可知,传入的 want 参数表明调用方需要执行的操作,并提供相关数据以及其他应用类型限制。
待匹配应用组件的 skills 配置,声明其具备的能力(module.json5 配置文件中的 skills 标签参数)。
系统将调用方传入的 want 参数(包含 action、entities、uri 和 type 属性)与已安装待匹配应用组件的 skills 配置(包含 actions、entities、uri 和 type 属性)依次进行匹配:

图 2 want参数的action与skills配置中的actions进行匹配

图 3 want参数的entities与skills配置中的entities进行匹配
例如,当 UIAbilityA 需要启动 UIAbilityB 并向 UIAbilityB 传递一些数据时,可以使用 want 作为一个载体,将数据传递给 UIAbilityB。
下图展示的是 want 的用法示例:

图 1 want的用法示例
want的类型
want 的类型分为显式 want 和隐式 want。使用显式 want 启动目标应用组件时,调用方传入的 want 参数中指定了 abilityName 和 bundleName,通常用于在当前应用中启动已知的目标应用组件。
使用隐式 want 启动目标应用组件时,调用方传入的 want 参数中未指定 abilityName,用于在当前应用中使用其他应用提供的某个能力,由系统匹配声明支持该请求的应用来处理请求。
注意,因为系统中待匹配应用组件的匹配情况不同,使用隐式 want 启动应用组件时会出现以下 3 种情况:
- 未匹配到满足条件的应用组件:启动失败;
- 匹配到一个满足条件的应用组件:直接启动该应用组件;
- 匹配到多个满足条件的应用组件:弹出选择框让用户选择。
显式want与隐式want的匹配规则
在启动目标应用组件时,会通过显式 want 或者隐式 want 进行目标应用组件的匹配,这里说的匹配规则就是调用方传入的 want 参数中设置的参数如何与目标应用组件声明的配置文件进行匹配。1) 显示want匹配规则
显示 want 匹配规则如下表所示:名称 | 类型 | 匹配项 | 必选项 | 选则 |
---|---|---|---|---|
deviceId | string | 是 | 否 | 若留空,则将仅匹配本设备内的应用组件 |
bundleName | string | 是 | 是 | 如果指定 abilityName,而不指定 bundleName,则匹配失败 |
moduleName | string | 是 | 否 | 若留空,则当同一个应用内存在多个模块且模块间存在重名应用组件时,将默认匹配第一个 |
abilityName | string | 是 | 是 | 该字段必须设置,表示显式匹配 |
uri | string | 否 | 否 | 系统匹配时将忽略该参数,但仍可作为参数传递给目标应用组件 |
type | string | 否 | 否 | 系统匹配时将忽略该参数,但仍可作为参数传递给目标应用组件 |
action | string | 否 | 否 | 系统匹配时将忽略该参数,但仍可作为参数传递给目标应用组件 |
entities | Array | 否 | 否 | 系统匹配时将忽略该参数,但仍可作为参数传递给目标应用组件 |
flags | number | 否 | 否 | 不参与匹配,直接传递给系统处理,一般用来设置运行态信息,例如URI数据授权等 |
parameters | [key: string]: Object | 否 | 否 | 不参与匹配,应用自定义数据将直接传递给目标应用组件 |
2) 隐式want匹配规则
隐式 want 匹配规则如下表所示:名称 | 类型 | 匹配项 | 必选项 | 选则 |
---|---|---|---|---|
deviceId | string | 是 | 否 | 跨设备目前不支持隐式调用 |
abilityName | string | 是 | 否 | 该字段必须留空,表示隐式匹配 |
bundleName | string | 是 | 否 | 匹配对应应用包内的目标应用组件 |
moduleName | string | 是 | 否 | 匹配对应 Module 内的目标应用组件 |
uri | string | 是 | 否 | 参见 want 参数的 uri 和 type 匹配规则 |
type | string | 是 | 否 | 参见 want 参数的 uri 和 type 匹配规则 |
action | string | 是 | 否 | 参见 want 参数的 action 匹配规则 |
entities | Array | 是 | 否 | 参见 want 参数的 entities 匹配规则 |
flags | number | 否 | 否 | 不参与匹配,直接传递给系统处理,一般用来设置运行态信息,例如URI数据授权等 |
parameters | [key: string]: Object | 否 | 否 | 不参与匹配,应用自定义数据将直接传递给目标应用组件 |
从隐式 want 的定义可知,传入的 want 参数表明调用方需要执行的操作,并提供相关数据以及其他应用类型限制。
待匹配应用组件的 skills 配置,声明其具备的能力(module.json5 配置文件中的 skills 标签参数)。
系统将调用方传入的 want 参数(包含 action、entities、uri 和 type 属性)与已安装待匹配应用组件的 skills 配置(包含 actions、entities、uri 和 type 属性)依次进行匹配:
- 如果 4 个属性匹配均未配置,则隐式匹配失败;
- 如果 4 个属性匹配均通过,则此应用才会被应用选择器展示给用户进行选择。
3) want参数的action匹配规则
将调用方传入的 want 参数的 action 属性与待匹配应用组件的 skills 配置中的 actions 属性进行匹配,如下图所示:
图 2 want参数的action与skills配置中的actions进行匹配
- 如果调用方的 want 参数中的 action 为空,且待匹配应用组件的skills中的actions也为空,则 action 匹配失败。
- 如果调用方的 want 参数中的 action 非空,但待匹配应用组件的skills中的 actions 为空,则 action 匹配失败。
- 如果调用方的 want 参数中的 action为空,而待匹配应用组件的 skills 中的actions非空,则 action 匹配成功。
- 如果调用方的 want 参数中的 action 非空,且待匹配应用组件的 skills 中的 actions 非空并包含调用方的 want 参数中的 action,则 action 匹配成功。
- 如果调用方的 want 参数中的 action 非空,但待匹配应用组件的 skills 中的 actions 非空却不包含调用方的 want 参数中的 action,则 action 匹配失败。
4) want参数的entities匹配规则
将调用方传入的 want 参数的 entities 与待匹配应用组件的 skills 配置中的 entities 进行匹配,如下图所示:
图 3 want参数的entities与skills配置中的entities进行匹配
- 如果调用方传入的 want 参数的 entities 为空,待匹配应用组件的 skills 配置中的 entities 不为空,则 entities 匹配成功。
- 如果调用方传入的 want 参数的 entities 为空,待匹配应用组件的 skills 配置中的 entities 为空,则 entities 匹配成功。
- 如果调用方传入的 want 参数的 entities 不为空,待匹配应用组件的 skills 配置中的 entities 为空,则 entities 匹配失败。
- 如果调用方传入的 want 参数的 entities 不为空,待匹配应用组件的 skills 配置中的 entities 不为空且包含调用方传入的 want 参数的 entities ,则 entities 匹配成功。
- 如果调用方传入的 want 参数的 entities 不为空,待匹配应用组件的 skills 配置中的 entities 不为空且不完全包含调用方传入的 want 参数的 entities ,则 entities 匹配失败。