HarmonyOS实战开发:@ohos.app.ability.wantAgent (构建与触发WantAgent)
1. WantAgent模块基础入门在HarmonyOS应用开发中WantAgent是一个非常重要的功能模块。简单来说它就像是一个意图代理可以帮我们把一个操作意图Want打包起来然后在合适的时机触发执行。想象一下你有个快递员WantAgent你先把要送的包裹Want交给他告诉他什么时候送触发条件他就能准时完成任务。这个模块从API 9开始支持替代了之前的ohos.wantAgent模块。我建议新项目都直接用这个新版本因为功能更强大维护也会更好。先来看看基本用法import WantAgent from ohos.app.ability.wantAgent; import Want from ohos.app.ability.Want; // 创建一个Want对象 let want: Want { deviceId: , // 设备ID空表示本机 bundleName: com.example.myapp, abilityName: EntryAbility, action: action1 }; // 配置WantAgent信息 let wantAgentInfo: WantAgent.WantAgentInfo { wants: [want], operationType: WantAgent.OperationType.START_ABILITY, requestCode: 0 };这里有几个关键点需要注意wants数组可以包含一个或多个Want对象表示要执行的操作operationType指定操作类型比如启动Ability、发送通知等requestCode请求码用于标识不同的WantAgent2. 深入WantAgentInfo配置2.1 核心参数详解WantAgentInfo是配置WantAgent的核心它的完整结构是这样的interface WantAgentInfo { wants: ArrayWant; // 要执行的Want数组 operationType: number; // 操作类型 requestCode?: number; // 请求码可选 wantAgentFlags?: Arraynumber; // 标志位可选 extraInfo?: {[key: string]: any}; // 额外信息可选 }operationType支持以下几种类型START_ABILITY启动一个AbilitySTART_ABILITIES启动多个AbilitySTART_SERVICE启动服务SEND_COMMON_EVENT发送公共事件wantAgentFlags常用的有UPDATE_PRESENT_FLAG更新现有WantAgentCONSTANT_FLAG创建不可变的WantAgent2.2 实际应用示例假设我们要创建一个点击通知后打开应用的WantAgentlet want: Want { bundleName: com.example.newsapp, abilityName: MainAbility, parameters: { from: notification } }; let wantAgentInfo: WantAgent.WantAgentInfo { wants: [want], operationType: WantAgent.OperationType.START_ABILITY, requestCode: 1001, wantAgentFlags: [WantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] };这个配置表示当触发时会启动MainAbility并附带一个参数fromnotification。3. 创建WantAgent实例3.1 两种创建方式WantAgent提供了两种创建方式我建议根据场景选择回调方式CallbackWantAgent.getWantAgent(wantAgentInfo, (err, data) { if (err) { console.error(创建失败:, err); return; } console.log(WantAgent创建成功); this.wantAgent data; });Promise方式try { let wantAgent await WantAgent.getWantAgent(wantAgentInfo); console.log(WantAgent创建成功); } catch (err) { console.error(创建失败:, err); }在实际项目中我更喜欢用Promise方式代码更简洁特别是配合async/await使用时。3.2 错误处理要点创建时可能会遇到这些错误16000007服务忙有并发任务16000151无效的WantAgent对象建议在代码中加入错误处理逻辑比如try { let wantAgent await WantAgent.getWantAgent(wantAgentInfo); // 创建成功后的逻辑 } catch (err) { if (err.code 16000007) { console.log(系统繁忙稍后重试); // 可以加入重试逻辑 } else { console.error(不可恢复错误:, err); } }4. WantAgent的触发与执行4.1 trigger方法详解创建好WantAgent后可以通过trigger方法触发它let triggerInfo { code: 200 // 自定义结果码 }; WantAgent.trigger(this.wantAgent, triggerInfo, (err, data) { if (err) { console.error(触发失败:, err); return; } console.log(触发成功返回数据:, data); });triggerInfo中可以传递自定义数据这些数据会在CompleteData中返回。4.2 常见触发场景通知栏点击// 在发布通知时关联WantAgent let notificationRequest { content: { title: 新消息, text: 您有一条未读消息 }, wantAgent: this.wantAgent // 之前创建的WantAgent };定时任务// 设置一个定时器到期后触发WantAgent setTimeout(() { WantAgent.trigger(this.wantAgent, {code: 0}); }, 5000); // 5秒后触发跨应用调用// 应用A创建WantAgent并共享给应用B // 应用B可以在适当时机触发这个WantAgent // 注意需要相应的权限5. 高级功能与最佳实践5.1 WantAgent的多线程支持从API 20开始WantAgent支持多线程触发// 启用多线程支持 WantAgent.setWantAgentMultithreading(true); // 现在可以在多个线程中同时触发WantAgent这个功能在需要高性能触发的场景下非常有用比如批量处理任务时。5.2 性能优化建议根据我的项目经验这里有几点优化建议复用WantAgent实例不要频繁创建和销毁尽量复用合理使用标志位UPDATE_PRESENT_FLAG可以避免重复创建及时取消不再需要的WantAgent应该调用cancel()释放资源// 取消WantAgent WantAgent.cancel(this.wantAgent, (err) { if (!err) { console.log(取消成功); this.wantAgent null; } });5.3 实际案例新闻应用通知假设我们开发一个新闻应用需要在通知栏显示热点新闻点击后直接跳转到详情页// 创建跳转到新闻详情的Want let newsWant: Want { bundleName: com.example.newsapp, abilityName: NewsDetailAbility, parameters: { newsId: 123456, from: notification } }; // 配置WantAgent let wantAgentInfo { wants: [newsWant], operationType: WantAgent.OperationType.START_ABILITY, requestCode: 1002, wantAgentFlags: [WantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] }; // 创建WantAgent this.wantAgent await WantAgent.getWantAgent(wantAgentInfo); // 发布通知 let notificationRequest { id: 1, content: { title: 热点新闻, text: 某地发生重大事件... }, wantAgent: this.wantAgent };这样当用户点击通知时就会直接跳转到新闻详情页并且携带新闻ID参数。