鸿蒙Want用法详解(附带实例)
在 Stage 模型中,Want 是对象间信息传递的载体,可以用于应用组件间的信息传递。而在 FA 模型中,Intent 是与之有相同概念的类。
Want 的使用场景之一是作为 startAbility 的参数,其中包含了指定的启动目标,以及启动时需携带的相关数据,如 bundleName 和 abilityName 字段分别指明目标 Ability 所在应用的包名以及对应包内的 Ability 名称。当 AbilityA 启动 AbilityB 并需要传入一些数据给 AbilityB 时,Want 可以作为一个数据载体将数据传送给 AbilityB,如下图所示:

图 1 Want用法示意图
当有明确处理请求的对象时,通过提供目标 Ability 所在应用的 bundleName,并在 Want 内指定 abilityName 便可启动目标 Ability。显式 Want 通常在启动当前应用开发中某个已知 Ability 时被用到,示例如下:
当需要处理的对象不明确时,可以使用隐式 Want,在当前应用中使用其他应用提供的某个能力,而不关心提供该能力的具体应用。隐式 Want 使用 skills 标签来定义需要使用的能力,并由系统匹配声明支持该请求的所有应用来处理请求。
例如,需要打开一个链接的请求时,系统将匹配所有声明支持该请求的应用,然后让用户选择使用哪个应用打开链接:
常见的 action 包括:
entities 表示目标 Ability 的类别信息(如浏览器、视频播放器),在隐式 Want 中是对 action 的补充。在隐式 Want 中,开发者可定义该字段,用来过滤匹配应用的类别,例如必须是浏览器。在 Want 内声明 entities 字段表示希望被调用方应用属于声明的类别。在被调用方应用配置文件 skills 字段内声明 entities 表示该应用所支持的类别。
常用的 entities 包括:
所有 action 和 entities 都定义在 wantConstant 模块中。
打开 DevEco Studio,选择一个 Empty Ability 工程模板,创建一个名为“ArkTSWantStartAbility”的工程为演示示例。
1) 新建Ability内页面。初始化工程之后,在原有的代码基础上,需要新建一个页面。在 src/main/ets/pages 目录下,通过右击“New→Page→Empty Page”来新建一个页面,并命名为 Second。
对 Second.ets 文件中的 message 变量值进行修改,最终文件内容如下:
创建完成之后,会自动在 module.json5 文件中添加该 Ability 的信息:
此时,在 src/main/ets 目录下会初始化一个 secondability 目录,并在 secondability 目录下生成一个 SecondAbility.ts 文件。修改该文件,将 'pages/Index' 改为 'pages/Second',最终文件内容如下:
3) 使用显式 Want 启动 Ability。在 Index.ets 文件中的 Text 组件上,添加单击事件触发执行启动 Ability。Index.ets 代码修改如下:
4) 运行项目后,初始化界面如下图所示:

图 2 初始化界面
在 Index 页面中,单击“Hello World”文本后,此时启动了 SecondAbility,并展示了 Second 页面,界面效果如下图所示。

图 3 Second页面
Want 的使用场景之一是作为 startAbility 的参数,其中包含了指定的启动目标,以及启动时需携带的相关数据,如 bundleName 和 abilityName 字段分别指明目标 Ability 所在应用的包名以及对应包内的 Ability 名称。当 AbilityA 启动 AbilityB 并需要传入一些数据给 AbilityB 时,Want 可以作为一个数据载体将数据传送给 AbilityB,如下图所示:

图 1 Want用法示意图
Want的类型
Want 的类型主要是分为显式和隐式。1) 显式Want
在启动 Ability 时指定了 abilityName 和 bundleName 的 Want 称为显式 Want。当有明确处理请求的对象时,通过提供目标 Ability 所在应用的 bundleName,并在 Want 内指定 abilityName 便可启动目标 Ability。显式 Want 通常在启动当前应用开发中某个已知 Ability 时被用到,示例如下:
import { Want } from '@kit.AbilityKit';
let wantInfo: Want = {
deviceId: '', // deviceId为空,表示本设备
bundleName: 'com.example.myapplication',
abilityName: 'FuncAbility',
}
2) 隐式Want
在启动 Ability 时未指定 abilityName 的 Want 称为隐式 Want。当需要处理的对象不明确时,可以使用隐式 Want,在当前应用中使用其他应用提供的某个能力,而不关心提供该能力的具体应用。隐式 Want 使用 skills 标签来定义需要使用的能力,并由系统匹配声明支持该请求的所有应用来处理请求。
例如,需要打开一个链接的请求时,系统将匹配所有声明支持该请求的应用,然后让用户选择使用哪个应用打开链接:
import { Want } from '@kit.AbilityKit';
let wantInfo: Want = {
action: 'ohos.want.action.search',
entities: [ 'entity.system.browsable'],
uri: 'https://www.test.com:8080/query/student',
type: 'text/plain',
};
其中,action 表示调用方要执行的通用操作(如查看、分享、应用详情)。在隐式 Want 中,可定义该字段,配合 uri 或 parameters 来表示对数据要执行的操作(如打开并查看该 uri 数据)。例如,当 uri 为一段网址时,action 为 ohos.want.action.viewData 则表示匹配可查看该网址的 Ability。在 Want 内声明 action 字段表示希望被调用方应用支持声明的操作。在被调用方应用配置文件 skills 字段内声明 actions 表示该应用支持声明操作。常见的 action 包括:
- ACTION_HOME:启动应用入口组件的动作,需要和 ENTITY_HOME 配合使用;系统桌面应用图标就是应用的入口组件,单击也是启动入口组件;入口组件可以配置多个。
- ACTION_CHOOSE:选择本地资源数据,例如联系人、相册等;系统一般对不同类型的数据有对应的 Picker 应用,例如联系人和图库。
- ACTION_VIEW_DATA:查看数据,当使用网址 uri 时,则表示显示该网址对应的内容。
- ACTION_VIEW_MULTIPLE_DATA:发送多个数据记录的操作。
entities 表示目标 Ability 的类别信息(如浏览器、视频播放器),在隐式 Want 中是对 action 的补充。在隐式 Want 中,开发者可定义该字段,用来过滤匹配应用的类别,例如必须是浏览器。在 Want 内声明 entities 字段表示希望被调用方应用属于声明的类别。在被调用方应用配置文件 skills 字段内声明 entities 表示该应用所支持的类别。
常用的 entities 包括:
- ENTITY_DEFAULT:默认类别无实际意义;
- ENTITY_HOME:主屏幕有图标单击入口类别;
- ENTITY_BROWSABLE:表示浏览器类别。
所有 action 和 entities 都定义在 wantConstant 模块中。
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 数据)。例如,当uri为一段网址,action 为 ohos.want.action.viewData 则表示匹配可查看该网址的Ability |
| entities | 只读 | Array<string> | 否 | 表示目标 Ability 额外的类别信息(如浏览器、视频播放器),在隐式 Want 中是对 action 的补充。在隐式 Want 中可定义该字段,用来过滤匹配 Ability 类别,如必须是浏览器。例如,在 action 字段的举例中,可存在多个应用声明了支持查看网址的操作,其中有应用为普通社交应用,有的为浏览器应用,可通过 entity.system.browsable 过滤掉非浏览器的其他应用 |
| flags | 只读 | number | 否 | 表示处理 Want 的方式。例如通过 wantConstant.Flags.FLAG_ABILITY_CONTINUATION 表示是否以设备间迁移方式启动 Ability |
| parameters | 只读 | {[key: string]: any} | 否 | 此参数用于传递自定义数据,通过用户自定义的值对进行数据填充,具体支持的数据类型如 Want API 所示 |
Want实例
接下来通过显式 Want 启动应用内一个指定的 Ability 组件。打开 DevEco Studio,选择一个 Empty Ability 工程模板,创建一个名为“ArkTSWantStartAbility”的工程为演示示例。
1) 新建Ability内页面。初始化工程之后,在原有的代码基础上,需要新建一个页面。在 src/main/ets/pages 目录下,通过右击“New→Page→Empty Page”来新建一个页面,并命名为 Second。
对 Second.ets 文件中的 message 变量值进行修改,最终文件内容如下:
@Entry
@Component
struct Second {
// 修改变量值为Second
@State message: string = 'Second';
build() {
RelativeContainer() {
Text(this.message)
.id('SecondHelloWorld')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '_container_', align: VerticalAlign.Center },
middle: { anchor: '_container_', align: HorizontalAlign.Center }
})
}
.height('100%')
.width('100%')
}
}
2) 新建Ability
在原有的代码基础上,需要新建一个 Ability。在 src/main/ets 目录下,右击“New→Ability”新建一个名为“SecondAbility”的 Ability。创建完成之后,会自动在 module.json5 文件中添加该 Ability 的信息:
{
"name": "SecondAbility",
"srcEntry": "./ets/secondability/SecondAbility.ets",
"description": "$string:SecondAbility_desc",
"icon": "$media:layered_image",
"label": "$string:SecondAbility_label",
"startWindowIcon": "$media:startIcon",
"startWindowBackground": "$color:start_window_background"
}
此时,在 src/main/ets 目录下会初始化一个 secondability 目录,并在 secondability 目录下生成一个 SecondAbility.ts 文件。修改该文件,将 'pages/Index' 改为 'pages/Second',最终文件内容如下:
onWindowStageCreate(windowStage: window.WindowStage): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
// 加载second页面
windowStage.loadContent('pages/Second', (err) => {
if (err.code) {
hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
return;
}
hilog.info(0x000, 'testTag', 'Succeeded in loading the content.');
});
}
上述修改主要是为了当启动 SecondAbility 时,Second 页面能够展示。3) 使用显式 Want 启动 Ability。在 Index.ets 文件中的 Text 组件上,添加单击事件触发执行启动 Ability。Index.ets 代码修改如下:
// 导入common, Want 从 '@kit.AbilityKit';
import { common, Want } from '@kit.AbilityKit';
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
build() {
RelativeContainer() {
Text(this.message)
.id('HelloWorld')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '_container_', align: VerticalAlign.Center },
middle: { anchor: '_container_', align: HorizontalAlign.Center }
})
.onClick(this.explicitStartAbility) // 设置单击事件,显示启动Ability
}
.height('100%')
.width('100%')
}
// 显示启动Ability
explicitStartAbility() {
try {
// 在启动Ability时指定了abilityName和bundleName
let want: Want = {
deviceId: "",
bundleName: "com.waylau.hmos.arkuwantstartability",
abilityName: "SecondAbility"
};
// 获取UIAbility的上下文信息
let context = getContext(this) as common.UIAbilityContext;
// 启动UIAbility实例
context.startAbility(want);
console.info('explicit start ability succeed');
} catch(error) {
console.info('explicit start ability failed with ${error.code}');
}
}
}
4) 运行项目后,初始化界面如下图所示:

图 2 初始化界面
在 Index 页面中,单击“Hello World”文本后,此时启动了 SecondAbility,并展示了 Second 页面,界面效果如下图所示。

图 3 Second页面
ICP备案:
公安联网备案: