Harmony os——Want 概述 & 速记小抄
可以把 Want 理解成: 「在组件之间传话的信封」,里面既可以写要去找谁,也可以写要干什么,还可以塞一些额外数据。
1. Want 是什么?
-
定义:
Want是一个对象,用来在应用组件之间 传递信息 + 描述目标组件。 -
最典型场景:
-
startAbility(want)- UIAbilityA 想启动 UIAbilityB,同时带一些参数,就用
Want当参数。
- UIAbilityA 想启动 UIAbilityB,同时带一些参数,就用
-
要记住两件事:
- Want告诉系统:我要去哪 / 找谁(目标组件信息)
- Want顺便带着:要带什么东西过去(parameters、uri、type 等)
2. Want 的两种类型:显式 & 隐式
2.1 显式 Want(Explicit Want)
定义:
在 Want 里明确写出
bundleName + abilityName的叫显式 Want。
import { Want } from '@kit.AbilityKit';
let wantInfo: Want = {
deviceId: '', // 为空表示本设备
bundleName: 'com.example.myapplication',
abilityName: 'FuncAbility',
}
特点:
-
目标非常明确: → 就拉起这个 App(bundleName)里的这个 Ability(abilityName)。
-
常用于:应用内组件跳转
- 例如:当前应用的 EntryAbility 跳自己模块里的 FuncAbility。
-
API 12 之后的注意点:
❗不再推荐三方应用使用「指定 Ability」的方式拉起其他应用 对于跨应用,推荐用「应用链接(App Link)」而不是显式 Want 指定 abilityName。
2.2 隐式 Want(Implicit Want)
定义:
Want 里不指定 abilityName 的叫隐式 Want。
import { Want } from '@kit.AbilityKit';
let wantInfo: Want = {
// bundleName 可选,如指定只在本 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',
};
核心思路:
-
不关心由谁来处理,只关心我要做什么事:
- action:我要做的动作(搜索 / 浏览 / 查看 等)
- entities:实体特征(可浏览等)
- uri:目标资源(链接、文件路径等)
- type:MIME 类型(如 text/plain、image/png)
-
由系统根据
skills匹配所有能处理该请求的组件(UIAbility / ServiceExtensionAbility)。
隐式 Want 启动时的三种结果:
- 没有匹配到任何能处理的组件 → 启动失败。
- 刚好匹配一个合适的组件 → 直接启动该组件。
- 匹配到多个 UIAbility → 系统弹出选择框,让用户选用哪个应用处理(比如多个浏览器)。
3. 特殊说明:和 ServiceExtensionAbility 的关系
对于启动 ServiceExtensionAbility 的场景,有额外规则:
-
如果 Want 中 带有 abilityName:
- ❌ 不允许通过 隐式 Want 启动 ServiceExtensionAbility (因为已经变成显式了,就不能混用隐式匹配机制)
-
如果 Want 中 只带有 bundleName(不带 abilityName) :
-
✅ 可以用
startServiceExtensionAbility()以「隐式 Want」方式启动 -
系统会在该 bundle 里:
- 找出所有符合条件的 ServiceExtensionAbility
- 选择优先级最高的一个返回
- 若优先级相同,返回第一个
-
4. 显式 vs 隐式 Want 对比表
| 对比项 | 显式 Want | 隐式 Want |
|---|---|---|
| 目标指定方式 | 明确指定 bundleName + abilityName | 不指定 abilityName,只用 action/uri/type 等描述需求 |
| 典型用途 | 应用内组件跳转 | 希望由系统 / 用户选择合适应用处理某种操作 |
| 跨应用调用 | 以前常用,现在三方应用不推荐再显式指定其他应用 Ability(API 12 之后) | 推荐用隐式 + 应用链接的方式 |
| 系统行为 | 直接拉起指定的 Ability | 系统匹配符合 skills 的组件,可能弹出「选择应用」对话框 |
| 和 ServiceExtensionAbility | 带 abilityName 时不能隐式启动 ServiceExtension | 只带 bundleName 时可隐式启动,返回优先级最高的 ServiceExtension |
5. 记忆小口诀(方便你复习)
-
显式 Want: 👉「我清楚要找谁」→ 写死
bundleName + abilityName。 -
隐式 Want: 👉「我只说要干啥」→ 写 action / uri / type,让系统帮我找人。
-
跨应用三方场景(API 12+) : 👉「别硬点名人家 Ability」→ 用应用链接 / 隐式 Want,让系统去匹配。
-
ServiceExtensionAbility 特例:
- 有 abilityName → 不能隐式
- 只有 bundleName → 能隐式,系统按优先级选一个。