# 订阅应用事件(ArkTS) HiAppEventæä¾›äº†äº‹ä»¶è®¢é˜…接å£ï¼Œç”¨äºŽæœ¬åœ°èŽ·å–应用事件。 ## 接å£è¯´æ˜Ž API接å£çš„å…·ä½“ä½¿ç”¨è¯´æ˜Žï¼ˆå‚æ•°ä½¿ç”¨é™åˆ¶ã€å…·ä½“å–值范围ç‰ï¼‰è¯·å‚考[应用事件打点API文档](../reference/apis-performance-analysis-kit/js-apis-hiviewdfx-hiappevent.md)。 **打点接å£åŠŸèƒ½ä»‹ç»ï¼š** | 接å£å | æè¿° | | --------------------------------------------------- | -------------------------------------------- | | write(info: AppEventInfo, callback: AsyncCallback\<void>): void | åº”ç”¨äº‹ä»¶å¼‚æ¥æ‰“点方法,使用callbackæ–¹å¼ä½œä¸ºå¼‚æ¥å›žè°ƒã€‚ | | write(info: AppEventInfo): Promise\<void> | åº”ç”¨äº‹ä»¶å¼‚æ¥æ‰“点方法,使用Promiseæ–¹å¼ä½œä¸ºå¼‚æ¥å›žè°ƒã€‚ | **订阅接å£åŠŸèƒ½ä»‹ç»ï¼š** | 接å£å | æè¿° | | --------------------------------------------------- | -------------------------------------------- | | addWatcher(watcher: Watcher): AppEventPackageHolder | æ·»åŠ åº”ç”¨äº‹ä»¶è§‚å¯Ÿè€…ï¼Œä»¥æ·»åŠ å¯¹åº”ç”¨äº‹ä»¶çš„è®¢é˜…ã€‚ | | removeWatcher(watcher: Watcher): void | 移除应用事件观察者,以移除对应用事件的订阅。 | ## 开呿¥éª¤ 以实现对用户点击按钮行为的事件打点åŠè®¢é˜…ä¸ºä¾‹ï¼Œè¯´æ˜Žå¼€å‘æ¥éª¤ã€‚ 1. 新建一个ArkTS应用工程,编辑工程ä¸çš„“entry > src > main > ets > entryability > EntryAbility.etsâ€æ–‡ä»¶ï¼Œå¯¼å…¥ä¾èµ–模å—: ```ts import { hiAppEvent, hilog } from '@kit.PerformanceAnalysisKit'; ``` 2. 编辑工程ä¸çš„“entry > src > main > ets > entryability > EntryAbility.ets†文件,在onCreateå‡½æ•°ä¸æ·»åŠ å¯¹ç”¨æˆ·ç‚¹å‡»æŒ‰é’®äº‹ä»¶çš„è®¢é˜…ï¼Œç¤ºä¾‹ä»£ç 如下: ```ts hiAppEvent.addWatcher({ // å¼€å‘者å¯ä»¥è‡ªå®šä¹‰è§‚察者å称,系统会使用åç§°æ¥æ ‡è¯†ä¸åŒçš„观察者 name: "watcher1", // å¼€å‘者å¯ä»¥è®¢é˜…感兴趣的应用事件,æ¤å¤„是订阅了按钮事件 appEventFilters: [{ domain: "button" }], // å¼€å‘者å¯ä»¥è®¾ç½®è®¢é˜…回调触å‘çš„æ¡ä»¶ï¼Œæ¤å¤„æ˜¯è®¾ç½®ä¸ºäº‹ä»¶æ‰“ç‚¹æ•°é‡æ»¡è¶³1个 triggerCondition: { row: 1 }, // å¼€å‘者å¯ä»¥è‡ªè¡Œå®žçŽ°è®¢é˜…å›žè°ƒå‡½æ•°ï¼Œä»¥ä¾¿å¯¹è®¢é˜…èŽ·å–到的事件打点数æ®è¿›è¡Œè‡ªå®šä¹‰å¤„ç† onTrigger: (curRow: number, curSize: number, holder: hiAppEvent.AppEventPackageHolder) => { // 返回的holder对象为null,表示订阅过程å‘ç”Ÿå¼‚å¸¸ï¼Œå› æ¤åœ¨è®°å½•错误日志åŽç›´æŽ¥è¿”回 if (holder == null) { hilog.error(0x0000, 'testTag', "HiAppEvent holder is null"); return; } hilog.info(0x0000, 'testTag', `HiAppEvent onTrigger: curRow=%{public}d, curSize=%{public}d`, curRow, curSize); let eventPkg: hiAppEvent.AppEventPackage | null = null; // æ ¹æ®è®¾ç½®é˜ˆå€¼å¤§å°ï¼ˆé»˜è®¤ä¸º512KB)去获å–订阅事件包,直到将订阅数æ®å…¨éƒ¨å–出 // 返回的事件包对象为null,表示当å‰è®¢é˜…æ•°æ®å·²è¢«å…¨éƒ¨å–å‡ºï¼Œæ¤æ¬¡è®¢é˜…回调触å‘ç»“æŸ while ((eventPkg = holder.takeNext()) != null) { // å¼€å‘者å¯ä»¥å¯¹äº‹ä»¶åŒ…ä¸çš„事件打点数æ®è¿›è¡Œè‡ªå®šä¹‰å¤„ç†ï¼Œæ¤å¤„æ˜¯å°†äº‹ä»¶æ‰“ç‚¹æ•°æ®æ‰“å°åœ¨æ—¥å¿—ä¸ hilog.info(0x0000, 'testTag', `HiAppEvent eventPkg.packageId=%{public}d`, eventPkg.packageId); hilog.info(0x0000, 'testTag', `HiAppEvent eventPkg.row=%{public}d`, eventPkg.row); hilog.info(0x0000, 'testTag', `HiAppEvent eventPkg.size=%{public}d`, eventPkg.size); for (const eventInfo of eventPkg.data) { hilog.info(0x0000, 'testTag', `HiAppEvent eventPkg.info=%{public}s`, eventInfo); } } } }); 3. 编辑工程ä¸çš„“entry > src > main > ets > pages > Index.ets†文件,导入ä¾èµ–模å—: ```ts import { BusinessError } from '@kit.BasicServicesKit'; import { hiAppEvent, hilog } from '@kit.PerformanceAnalysisKit'; ``` 4. 编辑工程ä¸çš„“entry > src > main > ets > pages > Index.etsâ€ æ–‡ä»¶ï¼Œæ·»åŠ ä¸€ä¸ªæŒ‰é’®å¹¶åœ¨å…¶onClick函数ä¸è¿›è¡Œäº‹ä»¶æ‰“点,以记录按钮点击事件,示例代ç 如下: ```ts Button("writeTest").onClick(()=>{ // 在按钮点击函数ä¸è¿›è¡Œäº‹ä»¶æ‰“点,以记录按钮点击事件 let eventParams: Record<string, number> = { 'click_time': 100 }; let eventInfo: hiAppEvent.AppEventInfo = { // 事件领域定义 domain: "button", // 事件å称定义 name: "click", // 事件类型定义 eventType: hiAppEvent.EventType.BEHAVIOR, // äº‹ä»¶å‚æ•°å®šä¹‰ params: eventParams, }; hiAppEvent.write(eventInfo).then(() => { hilog.info(0x0000, 'testTag', `HiAppEvent success to write event`) }).catch((err: BusinessError) => { hilog.error(0x0000, 'testTag', `HiAppEvent err.code: ${err.code}, err.message: ${err.message}`) }); }) ``` 5. 点击DevEco Studio界é¢ä¸çš„è¿è¡ŒæŒ‰é’®ï¼Œè¿è¡Œåº”用工程,然åŽåœ¨åº”用界é¢ä¸ç‚¹å‡»æŒ‰é’®â€œwriteTestâ€ï¼Œè§¦å‘一次按钮点击事件打点。 6. å¯ä»¥åœ¨Log窗å£çœ‹åˆ°æŒ‰é’®ç‚¹å‡»äº‹ä»¶æ‰“点æˆåŠŸçš„æ—¥å¿—ï¼Œä»¥åŠè§¦å‘订阅回调åŽå¯¹æ‰“点事件数æ®çš„å¤„ç†æ—¥å¿—: ```text HiAppEvent success to write event HiAppEvent eventPkg.packageId=0 HiAppEvent eventPkg.row=1 HiAppEvent eventPkg.size=124 HiAppEvent eventPkg.info={"domain_":"button","name_":"click","type_":4,"time_":1670268234523,"tz_":"+0800","pid_":3295,"tid_":3309,"click_time":100} ```