鸿蒙中Ability如何传递参数
·
在HarmonyOS中,Ability间参数传递主要通过以下几种方式实现,结合具体场景选择最佳方案:
一、显式传参(通过Want对象)
核心方法:使用startAbility时在want.parameters中携带参数
// 发送方(AbilityA)
import { common } from '@kit.AbilityKit';
const context = getContext(this) as common.UIAbilityContext;
context.startAbility({
bundleName: 'com.example.app',
abilityName: 'TargetAbility',
parameters: {
userId: '12345',
userName: '张三'
}
});
// 接收方(TargetAbility)
import { Ability } from '@kit.AbilityKit';
export default class TargetAbility extends Ability {
onCreate(want) {
const userId = want.parameters?.userId; // 建议判空处理
const userName = want.parameters?.userName;
}
}
特点:适用于明确指定目标Ability的场景,参数通过键值对传递,支持基础类型和简单对象。
二、隐式传参(通过Action匹配)实现步骤:
- 在
module.json5中声明目标Ability的skills:
{
"abilities": [{
"name": "TargetAbility",
"skills": [{
"actions": ["action.detail.VIEW"],
"entities": ["entity.system.browser"]
}]
}]
}
- 发送方通过action匹配:
context.startAbility({
action: 'action.detail.VIEW',
entities: ['entity.system.browser'],
parameters: { url: 'https://example.com' }
});
三、带返回值的参数传递使用场景:需要获取目标Ability处理结果的场景(如支付结果)
// 发送方(AbilityA)
context.startAbilityForResult({
bundleName: 'com.example.app',
abilityName: 'PaymentAbility',
parameters: { amount: 99.9 }
}).then((result) => {
const paymentStatus = result.want?.parameters?.status;
});
// 接收方(PaymentAbility)
import { common } from '@kit.AbilityKit';
const context = getContext(this) as common.UIAbilityContext;
context.terminateSelfWithResult({
resultCode: 0,
want: {
parameters: { status: 'SUCCESS', transactionId: 'TX20231106' }
}
});
四、页面路由传参(同Ability内)使用场景:同一Ability内部页面跳转
// 页面A跳转传参
import router from '@ohos.router';
router.pushUrl({
url: 'pages/SecondPage',
params: { itemId: 1001 }
});
// 页面B接收参数
const params = router.getParams();
const itemId = params['itemId'];
五、跨进程参数传递使用ChildProcessArgs:启动子进程时传递句柄和参数
// 主进程
import { ChildProcessArgs, childProcessManager } from '@kit.AbilityKit';
let args: ChildProcessArgs = {
entryParams: JSON.stringify({ taskId: 2023 }),
fds: { "dataFile": file.fd }
};
childProcessManager.startArkChildProcess("entry/.../ChildProcess.ets", args);
// 子进程
export default class ChildProcess extends Ability {
onStart(args) {
const taskData = JSON.parse(args.entryParams);
const fileHandle = args.fds?.dataFile;
}
}
六、通信方式对比
| 方式 | 适用场景 | 数据限制 | 延迟(1KB) |
|---|---|---|---|
| Want | 简单参数传递 | <1MB | 0.2ms |
| DataShare | 大数据共享 | 无限制 | 2ms |
| EventBus | 组件间事件通知 | <10KB | 0.5ms |
最佳实践建议:
- 简单参数优先使用Want对象
- 大数据传输使用DataShare或文件共享
- 高频事件通知采用EventBus
- 页面内跳转使用路由传参
- 注意
want.parameters参数获取时的空值防御处理
更多推荐


所有评论(0)