鸿蒙中 显式Want与隐式Want匹配规则
《HarmonyOS Want匹配机制详解》摘要: HarmonyOS的Want匹配分为显式和隐式两种:显式Want必须精确指定bundleName和abilityName,系统直接定位目标组件;隐式Want通过action、uri、type等参数与组件的skills配置进行匹配。隐式匹配需满足action、entities、uri、type四项规则,其中uri和type支持多级匹配,还包含lin
本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、Want 匹配规则
Want 是 HarmonyOS 中用于启动应用组件(如 Ability)的核心对象,分为两种类型:
-
显式 Want:明确指定目标组件(bundleName + abilityName)
-
隐式 Want:通过描述意图(action、uri、type 等)由系统匹配符合条件的组件
二、显式 Want 匹配规则
显式 Want 必须指定 bundleName 和 abilityName,系统直接定位目标组件。
| 字段 | 类型 | 是否参与匹配 | 规则说明 |
|---|---|---|---|
deviceId |
string | ✅ | 留空则仅匹配本设备组件 |
bundleName |
string | ✅ 必选 | 必须设置,否则匹配失败 |
moduleName |
string | ✅ | 留空时,若应用内多模块有重名组件,默认匹配第一个 |
abilityName |
string | ✅ 必选 | 必须设置,表示显式匹配 |
uri / type / action / entities |
- | ❌ | 系统匹配时忽略,但会传递给目标组件 |
flags |
number | ❌ | 不参与匹配,用于设置运行时行为(如 URI 授权) |
parameters |
Object | ❌ | 自定义数据,直接传递给目标组件 |
备注:显式匹配成功条件:bundleName + abilityName 正确且存在。
三、隐式 Want 匹配规则
隐式 Want 不指定 abilityName,系统根据以下字段匹配 skills 配置:
| 字段 | 是否参与匹配 | 规则说明 |
|---|---|---|
deviceId |
✅ | 跨设备暂不支持隐式调用 |
abilityName |
❌ | 必须留空,否则视为显式 |
bundleName / moduleName |
✅ | 可选,用于限定应用或模块范围 |
uri / type / action / entities |
✅ | 必须与目标组件的 skills 配置匹配 |
parameters |
✅ | 支持 linkFeature 优先匹配机制 |
备注: 隐式匹配流程:系统遍历所有已安装组件的 skills,与 Want 参数进行匹配。
四、隐式 Want 各属性匹配规则
1. action 匹配规则
| Want 中 action | Skills 中 actions | 结果 |
|---|---|---|
| 空 | 空 | 失败 |
| 非空 | 空 | 失败 |
| 空 | 非空 | 成功 |
| 非空 | 包含该 action | 成功 |
| 非空 | 不包含该 action | 失败 |
2. entities 匹配规则
| Want 中 entities | Skills 中 entities | 结果 |
|---|---|---|
| 空 | 非空 | 成功 |
| 空 | 空 | 成功 |
| 非空 | 空 | 失败 |
| 非空 | 包含所有 entities | 成功 |
| 非空 | 不包含所有 entities | 失败 |
3. uri 和 type 匹配规则
情况一:两者都为空
-
Skills 中
uris为空 → 成功 -
Skills 中某
uri的scheme和type为空 → 成功 -
否则 → 失败
情况二:uri 非空,type 为空
-
Skills 中
uris为空 → 失败 -
存在
uri匹配且type为空 → 成功 -
若
uri为文件路径,根据后缀推断 MIME 类型匹配 → 成功
情况三:uri 为空,type 非空
-
Skills 中
uris为空 → 失败 -
存在
uri的scheme为空且type匹配 → 成功
情况四:两者都非空
-
Skills 中
uris为空 → 失败 -
存在
uri和type均匹配 → 成功
4. uri 详细匹配规则(逐级匹配)
| s_uri 配置 | 匹配条件 |
|---|---|
scheme 为空 |
w_uri 必须为空 |
host 为空 |
w_uri 的 scheme 必须相同 |
port 为空 |
w_uri 的 scheme + host 必须相同 |
path/pathStartWith/pathRegex 为空 |
w_uri 的 scheme + host + port 必须相同 |
path 非空 |
全路径必须完全一致 |
pathStartWith 非空 |
w_uri 必须包含此前缀 |
pathRegex 非空 |
w_uri 必须满足正则表达式 |
备注:w_是指want中的参数
5. type 匹配规则
| s_type | w_type | 结果 |
|---|---|---|
| 空 | 任意 | 失败 |
*/* 或 w_type = */* |
任意 | 成功 |
prefixType/* |
包含 prefixType/ |
成功 |
| 任意 | prefixType/* |
s_type 包含 prefixType/ 则成功 |
备注:w_是指want中的参数,s_是指skills配置中的参数
6. linkFeature 匹配规则(优先匹配)
仅在 parameters 中包含 linkFeature 键且非空时生效。
-
Want 中
uri和type均为空:-
只匹配
linkFeature,相等则成功
-
-
Want 中
uri或type非空:-
依次匹配
linkFeature→uri→type,全部成功才成功
-
五、总结:隐式匹配成功条件
普通匹配(无 linkFeature):
必须同时满足:
-
action匹配成功 -
entities匹配成功 -
uri匹配成功 -
type匹配成功
带 linkFeature 的匹配:
-
优先匹配
linkFeature -
若
linkFeature匹配成功,再根据是否设置uri/type决定是否继续匹配
注意事项
-
显式 Want 必须指定
bundleName和abilityName -
隐式 Want 中
abilityName必须留空 -
linkFeature为高级匹配机制,优先于普通属性匹配 -
系统应用 URI 的 scheme 以
ohos开头,三方应用不得重复使用 -
跨设备场景下不支持隐式 Want 调用
更多推荐




所有评论(0)