hiappevent-guidelines.md 6.4 KB
Newer Older
L
lyj_love_code 已提交
1
# 应用事件打点开发指导
Z
zengyawen 已提交
2 3 4 5 6 7 8 9 10

## 场景介绍

应用事件打点的主要工作是在应用运行过程中,帮助应用记录在运行过程中发生的各种信息。

## 接口说明

应用事件JS打点接口由hiAppEvent模块提供。

L
lyj_love_code 已提交
11
以下仅提供简单的接口介绍,API接口的具体使用说明(参数使用限制、具体取值范围等)请参考[应用事件打点API文档](../reference/apis/js-apis-hiviewdfx-hiappevent.md)
12

Z
zengyawen 已提交
13 14
**打点接口功能介绍:**

15 16 17 18
| 接口名                                                       | 描述                                                 |
| ------------------------------------------------------------ | ---------------------------------------------------- |
| write(AppEventInfo info, AsyncCallback\<void> callback): void | 应用事件异步打点方法,使用callback方式作为异步回调。 |
| write(AppEventInfo info): Promise\<void>                     | 应用事件异步打点方法,使用Promise方式作为异步回调。  |
Z
zengyawen 已提交
19 20 21

**打点配置接口功能介绍:**

L
lyj_love_code 已提交
22 23 24
| 接口名                               | 描述                                                 |
| ------------------------------------ | ---------------------------------------------------- |
| configure(ConfigOption config): void | 应用事件打点配置方法,可以对打点功能进行自定义配置。 |
L
lyj_love_code 已提交
25 26 27 28 29

**订阅接口功能介绍:**

| 接口名                                             | 描述                 |
| -------------------------------------------------- | -------------------- |
30
| addWatcher(Watcher watcher): AppEventPackageHolder | 添加应用事件订阅者。 |
L
lyj_love_code 已提交
31
| removeWatcher(Watcher watcher): void               | 移除应用事件订阅者。 |
Z
zengyawen 已提交
32

L
lyj_love_code 已提交
33 34 35 36 37
**清理接口功能介绍:**

| 接口名            | 描述                 |
| ----------------- | -------------------- |
| clearData(): void | 清除本地的打点数据。 |
38

Z
zengyawen 已提交
39 40
## 开发步骤

L
lyj_love_code 已提交
41
以一次应用事件打点订阅流程为例,说明开发步骤。
Z
zengyawen 已提交
42

43
1. 新建一个ets应用工程,编辑工程中的“entry > src > main > ets  > pages > index.ets” 文件,依次添加三个按钮,以对应用事件打点订阅流程进行模拟。其中,按钮1模拟了应用事件打点的调用,按钮2模拟了添加自动触发回调的事件订阅者的调用,按钮3模拟了移除事件订阅者的调用,完整示例代码如下:
Z
zengyawen 已提交
44

L
lyj_love_code 已提交
45
   ```ts
L
lyj_love_code 已提交
46
   import hiAppEvent from '@ohos.hiviewdfx.hiAppEvent';
Z
zengyawen 已提交
47
   
L
lyj_love_code 已提交
48 49 50 51
   @Entry
   @Component
   struct Index {
     @State message: string = 'Hello World'
Z
zengyawen 已提交
52
   
L
lyj_love_code 已提交
53 54 55 56 57 58
     build() {
       Row() {
         Column() {
           Text(this.message)
             .fontSize(50)
             .fontWeight(FontWeight.Bold)
Z
zengyawen 已提交
59
   
L
lyj_love_code 已提交
60
           Button("1 writeTest").onClick(()=>{
61
             // 根据传入的事件参数执行一次应用事件打点
L
lyj_love_code 已提交
62 63 64 65 66 67 68 69
             hiAppEvent.write({
               domain: "test_domain",
               name: "test_event",
               eventType: hiAppEvent.EventType.FAULT,
               params: {
                 int_data: 100,
                 str_data: "strValue"
               }
L
lyj_love_code 已提交
70 71
             }).then(() => {
               console.log(`HiAppEvent success to write event`);
L
lyj_love_code 已提交
72
             }).catch((err) => {
L
lyj_love_code 已提交
73
               console.error(`code: ${err.code}, message: ${err.message}`);
L
lyj_love_code 已提交
74 75
             });
           })
Z
zengyawen 已提交
76
   
L
lyj_love_code 已提交
77
           Button("2 addWatcherTest").onClick(()=>{
78
             // 根据传入的订阅参数添加一个应用事件订阅者
L
lyj_love_code 已提交
79 80 81 82 83 84 85 86 87
             hiAppEvent.addWatcher({
               name: "watcher1",
               appEventFilters: [{ domain: "test_domain" }],
               triggerCondition: {
                 row: 2,
                 size: 1000,
                 timeOut: 2
               },
               onTrigger: function (curRow, curSize, holder) {
88
                 // 返回的holder对象为null表示订阅过程发生异常,因此在记录错误日志后直接返回
L
lyj_love_code 已提交
89 90 91 92
                 if (holder == null) {
                   console.error("HiAppEvent holder is null");
                   return;
                 }
93 94
                 // 设置每次获取的订阅事件包大小阈值为1000字节
                 holder.setSize(1000);
L
lyj_love_code 已提交
95
                 let eventPkg = null;
96
                 // 根据设置阈值大小去获取订阅事件包(返回的事件包对象为null,表示当前订阅数据被全部取出)
L
lyj_love_code 已提交
97
                 while ((eventPkg = holder.takeNext()) != null) {
98
                   // 对获取的订阅事件包进行解析,并将解析结果打印在Log界面
L
lyj_love_code 已提交
99 100 101
                   console.info(`HiAppEvent eventPkg.packageId=${eventPkg.packageId}`);
                   console.info(`HiAppEvent eventPkg.row=${eventPkg.row}`);
                   console.info(`HiAppEvent eventPkg.size=${eventPkg.size}`);
102
                   // 对订阅事件包中的事件字符串数组进行遍历解析
L
lyj_love_code 已提交
103
                   for (const eventInfo of eventPkg.data) {
L
lyj_love_code 已提交
104
                     console.info(`HiAppEvent eventPkg.data=${eventInfo}`);
L
lyj_love_code 已提交
105 106 107 108 109
                   }
                 }
               }
             });
           })
Z
zengyawen 已提交
110
   
L
lyj_love_code 已提交
111
           Button("3 removeWatcherTest").onClick(()=>{
112
             // 移除指定名称的应用事件订阅者
L
lyj_love_code 已提交
113 114 115 116 117 118
             hiAppEvent.removeWatcher({
               name: "watcher1"
             })
           })
         }
         .width('100%')
Z
zengyawen 已提交
119
       }
L
lyj_love_code 已提交
120 121
       .height('100%')
     }
Z
zengyawen 已提交
122 123 124
   }
   ```

L
lyj_love_code 已提交
125 126 127 128 129 130 131 132
2. 点击IDE界面中的运行按钮,运行应用工程。

3. 在应用界面点击按钮1进行一次事件打点,可以在Log窗口看到打点成功的日志:

   ```
   success to write event: 0
   ```

133
4. 在应用界面点击按钮2进行添加事件订阅者,再多次点击按钮1进行多次打点。在满足回调任一触发条件(事件数量、事件数据大小、定时时长)后,可以在Log窗口看到回调函数触发后获取到的订阅事件包的日志:
L
lyj_love_code 已提交
134 135 136 137 138 139 140 141 142

   ```
   HiAppEvent eventPkg.packageId=0
   HiAppEvent eventPkg.row=2
   HiAppEvent eventPkg.size=308
   HiAppEvent eventPkg.data={"domain_":"test_domain","name_":"test_event","type_":1,"time_":1502096107556,"tz_":"+0000","pid_":4204,"tid_":4223,"int_data":100,"str_data":"strValue"}
   ```

5. 在应用界面点击按钮3进行移除事件订阅者,再多次点击按钮1进行多次打点,此时在Log窗口不再能看到订阅触发的日志。
Z
zengyawen 已提交
143 144

## 相关实例
145 146 147

针对应用事件开发,有以下相关实例可供参考:

148
- [`JsDotTest`:测试打点(JS)(API8)](https://gitee.com/openharmony/applications_app_samples/tree/master/DFX/JsDotTest)