在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匹配)实现步骤

  1. module.json5中声明目标Ability的skills:
{
  "abilities": [{
    "name": "TargetAbility",
    "skills": [{
      "actions": ["action.detail.VIEW"],
      "entities": ["entity.system.browser"]
    }]
  }]
}
  1. 发送方通过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简单参数传递<1MB0.2ms
DataShare大数据共享无限制2ms
EventBus组件间事件通知<10KB0.5ms

最佳实践建议

  1. 简单参数优先使用Want对象
  2. 大数据传输使用DataShare或文件共享
  3. 高频事件通知采用EventBus
  4. 页面内跳转使用路由传参
  5. 注意want.parameters参数获取时的空值防御处理
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐