深度解析Arkts语言中的Want对象:信息传递利器的全面探讨与匹配规则解析
@[toc]
深入了解Arkts语言中的Want对象
Arkts语言中的Want
是一种用于对象间信息传递的载体,主要用于应用组件之间的信息传递。本文将深入探讨Want
的定义、用途、类型以及参数说明,并介绍显式和隐式Want
的使用场景和匹配规则。
Want的定义与用途
Want
作为对象间信息传递的载体,常用于启动能力(Ability
)时传递相关数据。在启动目标Ability
时,Want
包含了指定的启动目标和启动时需携带的相关数据,如bundleName
和abilityName
字段分别指明目标Ability
所在应用的包名和对应包内的Ability
名称。
例如,在启动UIAbilityA时需要传递数据给UIAbilityB,可以使用Want
作为载体,将数据传递给UIAbilityB。
图1 Want用法示意
Want的类型
显式Want
显式Want在启动Ability
时指定了abilityName
和bundleName
,用于在当前应用开发中启动已知的Ability
。以下是显式Want的示例:
let wantInfo = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.example.myapplication',
abilityName: 'FuncAbility',
}
隐式Want
隐式Want在启动UIAbility
时未指定abilityName
,用于请求处理对象不明确的情况。系统将匹配声明支持该请求的所有应用,用户可以选择其中一个应用进行启动。以下是隐式Want的示例:
let wantInfo = {
// uncomment line below if wish to implicitly query only in the specific bundle.
// bundleName: 'com.example.myapplication',
action: 'ohos.want.action.search',
entities: ['entity.system.browsable'],
uri: 'https://www.test.com:8080/query/student',
type: 'text/plain',
};
隐式Want启动Ability
时可能出现未匹配、匹配到一个、匹配到多个的情况,系统将根据匹配情况决定如何处理。
Want参数说明
下表列出了Want
对象中的各参数及其说明:
参数 | 读写属性 | 类型 | 必填 | 描述 |
---|---|---|---|---|
deviceId | 只读 | string | 否 | 表示目标Ability 所在设备ID。如果未设置该字段,则表明本设备。 |
bundleName | 只读 | string | 否 | 表示目标Ability 所在应用名称。 |
moduleName | 只读 | string | 否 | 表示目标Ability 所属的模块名称。 |
abilityName | 只读 | string | 否 | 表示目标Ability 名称。如果未设置该字段,则该Want 为隐式。如果在Want 中同时指定了bundleName 、moduleName 和abilityName ,则Want 可以直接匹配到指定的Ability 。 |
uri | 只读 | string | 否 | 表示携带的数据,一般配合type 使用,指明待处理的数据类型。如果在Want 中指定了uri ,则Want 将匹配指定的Uri信息,包括scheme、schemeSpecificPart、authority和path信息。 |
type | 只读 | string | 否 | 表示携带数据类型,使用MIME类型规范。例如:“text/plain”、"image/*"等。 |
action | 只读 | string | 否 | 表示要执行的通用操作,如查看、分享、应用详情。在隐式Want 中,可定义该字段,配合uri 或parameters 来表示对数据要执行的操作。例如,当uri 为一段网址,action 为ohos.want.action.viewData 则表示匹配可查看该网址的Ability 。 |
entities | 只读 | Array<string> | 否 | 表示目标Ability 额外的类别信息,如浏览器、视频播放器,在隐式Want 中是对action 的补充。在隐式Want 中,可定义该字段,来过滤匹配UIAbility 类别,如必须是浏览器。 |
flags | 只读 | number | 否 | 表示处理Want 的方式。例如通过wantConstant.Flags.FLAG_ABILITY_CONTINUATION 表示是否以设备间迁移方式启动Ability 。 |
parameters | 只读 | {[key: string]: any} | 否 | 用于传递自定义数据,通过用户自定义的键值对进行数据填充。具体支持的数据类型可参考Want API。 |
显式Want与隐式Want匹配规则
在启动目标Ability
时,会通过显式Want
和隐式Want
进行目标Ability
的匹配。以下是显式Want
和隐式Want
的匹配规则:
名称
- deviceId
- bundleName
- moduleName
- abilityName
- uri
- type
- action
- entities
- flags
- parameters
类型
- string
- string
- string
- string
- string
- string
- string
- Array<string>
- number
- {[key: string]: any}
匹配项
- 是
- 是
- 否
- 是
- 否
- 否
- 否
- 否
- 否
- 否
规则
deviceId
:留空将仅匹配本设备。bundleName
:如果指定abilityName
,而不指定bundleName
,则匹配失败。moduleName
:留空时,当同一个应用内存在多个模块且模块间存在重名Ability
,将默认匹配第一个。abilityName
:该字段必须设置表示显式匹配。uri
:系统匹配时将忽略该参数,但仍可作为参数传递给目标Ability
。type
:系统匹配时将忽略该参数,但仍可作为参数传递给目标Ability
。action
:系统匹配时将忽略该参数,但仍可作为参数传递给目标Ability
。entities
:系统匹配时将忽略该参数,但仍可作为参数传递给目标Ability
。flags
:不参与匹配,直接传递给系统处理,一般用来设置运行态信息,例如URI数据授权等。parameters
:不参与匹配,应用自定义数据将直接传递给目标Ability
。
隐式Want匹配原理
名称
- deviceId
- abilityName
- bundleName
- moduleName
- uri
- type
- action
- entities
- flags
- parameters
类型
- string
- string
- string
- string
- string
- string
- string
- Array<string>
- number
- {[key: string]: any}
匹配项
- 是
- 否
- 是
- 否
- 是
- 是
- 是
- 是
- 否
- 否
规则
deviceId
:跨设备目前不支持隐式调用。
说明: 当前版本暂不支持跨设备能力。
abilityName
:该字段必须留空表示隐式匹配。bundleName
:- 声明
bundleName
时,隐式搜索将仅限于对应应用包内。 - 声明
bundleName
与moduleName
时,隐式搜索将仅限于对应应用的对应Module内。 - 单独声明
moduleName
时,该字段无效。 - 同时声明
bundleName
与moduleName
时,隐式搜索将仅限于对应应用包内的对应模块内。
- 声明
moduleName
:-uri
:-type
:-action
:-entities
:-flags
:不参与匹配,直接传递给系统处理,一般用来设置运行态信息,例如URI数据授权等。parameters
:不参与匹配,应用自定义数据将直接传递给目标Ability
。
隐式Want匹配原理详解
从隐式Want
的定义可知:
- 调用方传入的
want
参数,表明调用方需要执行的操作,并提供相关数据以及其他应用类型限制。 - 待匹配
Ability
的skills
配置,声明其具备的能力(module.json5
配置文件中的skills
标签参数)。 - 系统将调用方传入的
want
参数(包含action
、entities
、uri
和type
属性)与已安装待匹配的应用Ability
的skills
配置(包含actions
、entities
、uris
和type
属性)依次进行匹配。当四个属性匹配均通过,则此应用才会被应用选择器展示给用户进行选择。
want
参数的action
匹配规则
将调用方传入的want
参数的action
与待匹配Ability
的skills
配置中的actions
进行匹配。
- 调用方传入的
want
参数的action
为空,待匹配Ability
的skills
配置中的actions
为空,则action
匹配失败。 - 调用方传入的
want
参数的action
不为空,待匹配Ability
的skills
配置中的actions
为空,则action
匹配失败。 - 调用方传入的
want
参数的action
为空,待匹配Ability
的skills
配置中的actions
不为空,则action
匹配成功。 - 调用方传入的
want
参数的action
不为空,待匹配Ability
的skills
配置中的actions
不为空且包含调用方传入的want
参数的action
,则action
匹配成功。 - 调用方传入的
want
参数的action
不为空,待匹配Ability
的skills
配置中的actions
不为空且不包含调用方传入的want
参数的action
,则action
匹配失败。
总结:
本文深入介绍了Arkts语言中的Want
对象,该对象是一种在应用组件之间进行信息传递的载体。主要讨论了Want
的定义、用途、类型以及参数说明,并详细介绍了显式和隐式Want
的使用场景和匹配规则。
在Want
的定义与用途部分,文中阐述了Want
作为对象间信息传递的重要载体,特别是在启动能力时传递相关数据的应用。示例图展示了Want
在启动UIAbilityA时传递数据给UIAbilityB的实际用法。
Want
的类型部分详细介绍了显式和隐式Want
。显式Want
在启动Ability
时明确指定abilityName
和bundleName
,而隐式Want
则用于请求处理对象不明确的情况,系统将匹配声明支持该请求的所有应用。
随后,文中列出了Want
对象中的各参数及其说明,包括deviceId
、bundleName
、moduleName
、abilityName
等参数,以及它们的类型和是否必填。对于Want
的显式和隐式匹配规则进行了详细解释,包括各参数的匹配项和规则,以及隐式匹配原理的详细说明。
总体而言,本文全面深入地探讨了Arkts语言中的Want
对象,为开发者提供了清晰的指导和理解。
- 点赞
- 收藏
- 关注作者
评论(0)