华为鸿蒙 Want:应用组件之间信息传递的桥梁 原创
本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。
在华为鸿蒙系统中,应用组件之间的信息传递是通过 Want 对象实现的。Want 对象可以携带各种信息,例如目标组件的名称、参数、数据等,从而实现应用组件之间的通信和协作。
一、Want 的定义和作用
Want 是一个对象,用于在应用组件之间传递信息。它可以携带各种信息,例如目标组件的名称、参数、数据等,从而实现应用组件之间的通信和协作。
以下是一个 Want 对象的示例:
let want: Want = {
deviceId: '', // 目标设备的 ID,如果为空,则表示本设备
bundleName: 'com.example.myapplication', // 目标组件的包名
moduleName: 'entry', // 目标组件所在的模块名,如果为空,则表示默认模块
abilityName: 'FuncAbility', // 目标组件的名称
uri: 'https://www.test.com:8080/query/student', // 目标组件的 URI
type: 'text/plain', // 目标组件的 MIME 类型
action: 'ohos.want.action.search', // 目标组件的动作
entities: ['entity.system.browsable'], // 目标组件的实体
parameters: {
// 目标组件的参数
info: '这是一些自定义信息',
},
};
开发者可以根据应用需求使用不同的 Want 参数属性,实现应用组件之间的信息传递和通信。
二、显式 Want 与隐式 Want 的区别
显式 Want 和 隐式 Want 是两种不同的 Want 对象,它们的主要区别在于目标组件的指定方式。
- 显式 Want:在启动组件时,显式 Want 对象会指定目标组件的名称和包名,例如
wantInfo = { deviceId: '', bundleName: 'com.example.myapplication', abilityName: 'FuncAbility' }
。 - 隐式 Want:在启动组件时,隐式 Want 对象不会指定目标组件的名称,而是通过 action、entities、uri、type 等信息进行匹配,例如
wantInfo = { action: 'ohos.want.action.search', entities: ['entity.system.browsable'], uri: 'https://www.test.com:8080/query/student', type: 'text/plain' }
。
显式 Want 和隐式 Want 的选择取决于应用的需求。如果知道目标组件的名称和包名,则使用显式 Want;如果目标组件不明确,则需要使用隐式 Want。
三、显式 Want 的匹配规则
显式 Want 的匹配规则是根据 Want 对象中的信息与目标组件的配置进行匹配,只有匹配成功的组件才会被启动。
以下是一个显式 Want 匹配的示例:
import { common, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
let wantInfo: Want = {
deviceId: '', // 目标设备的 ID,如果为空,则表示本设备
bundleName: 'com.example.myapplication', // 目标组件的包名
moduleName: 'entry', // 目标组件所在的模块名,如果为空,则表示默认模块
abilityName: 'FuncAbility', // 目标组件的名称
};
// 启动目标组件
common.startAbility(wantInfo).then(() => {
hilog.info(0x0000, 'testTag', 'Succeeded in starting ability.');
}).catch((err: BusinessError) => {
hilog.error(0x0000, 'testTag', `Failed to start ability. Code is ${err.code}, message is ${err.message}`);
});
显式 Want 的匹配规则:
- bundleName 匹配:首先匹配 Want 对象中的 bundleName 与目标组件配置中的 bundleName 是否一致。
- abilityName 匹配:如果 bundleName 匹配成功,则匹配 Want 对象中的 abilityName 与目标组件配置中的 abilityName 是否一致。
- parameters 匹配:如果 abilityName 匹配成功,则匹配 Want 对象中的 parameters 与目标组件配置中的 parameters 是否一致。
只有当所有匹配规则都满足时,显式 Want 才会匹配成功,并启动目标组件。
四、隐式 Want 的匹配规则
隐式 Want 的匹配规则是通过 action、entities、uri、type 等信息进行匹配,匹配成功的组件数量决定了隐式 Want 的处理方式。
以下是一个隐式 Want 匹配的示例:
import { common, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
let wantInfo: Want = {
action: 'ohos.want.action.search', // 目标组件的动作
entities: ['entity.system.browsable'], // 目标组件的实体
uri: 'https://www.test.com:8080/query/student', // 目标组件的 URI
type: 'text/plain', // 目标组件的 MIME 类型
};
// 启动目标组件
common.startAbility(wantInfo).then(() => {
hilog.info(0x0000, 'testTag', 'Succeeded in starting ability.');
}).catch((err: BusinessError) => {
hilog.error(0x0000, 'testTag', `Failed to start ability. Code is ${err.code}, message is ${err.message}`);
});
隐式 Want 的匹配规则:
- linkFeature 匹配:首先匹配 Want 对象中的 linkFeature 与目标组件配置中的 linkFeature 是否一致。
- uri 和 type 匹配:如果 linkFeature 匹配成功,则匹配 Want 对象中的 uri 和 type 与目标组件配置中的 uris 数组中的 uri 和 type 是否一致。
- action 和 entities 匹配:如果 uri 和 type 匹配成功,则匹配 Want 对象中的 action 和 entities 与目标组件配置中的 actions 和 entities 是否一致。
隐式 Want 的匹配结果有以下几种情况:
- 匹配失败:如果所有匹配规则都失败,则隐式 Want 匹配失败,无法启动目标组件。
- 匹配成功,单个组件:如果匹配成功,并且只有一个目标组件满足条件,则直接启动该目标组件。
- 匹配成功,多个组件:如果匹配成功,并且有多个目标组件满足条件,则弹出选择框让用户选择要启动的组件。
隐式 Want 的匹配规则相对复杂,开发者需要根据应用的需求选择合适的匹配规则,并确保配置文件中的信息准确无误。
五、Want 参数的属性说明
Want 对象包含多个属性,每个属性都用于传递不同的信息。以下是一些常用的 Want 参数属性:
- deviceId:目标设备的 ID,如果为空,则表示本设备。
- bundleName:目标组件的包名。
- moduleName:目标组件所在的模块名,如果为空,则表示默认模块。
- abilityName:目标组件的名称。
- uri:目标组件的 URI,用于匹配具有特定 URI 的组件。
- type:目标组件的 MIME 类型,用于匹配具有特定 MIME 类型的组件。
- action:目标组件的动作,用于匹配具有特定动作的组件。
- entities:目标组件的实体,用于匹配具有特定实体的组件。
- parameters:目标组件的参数,用于传递自定义信息。
咱们可以根据应用需求使用不同的 Want 参数属性,实现应用组件之间的信息传递和通信。
本篇博客介绍了华为鸿蒙 Want 的定义、作用、显式 Want 和隐式 Want 的区别、匹配规则以及 Want 参数的属性说明。后续文章将深入讲解 Want 对象的具体使用方法和开发技巧。
请注意,由于鸿蒙系统版本更新较快,部分功能可能存在变动,请以最新版本官方文档为准。