device-usage-statistics-dev-guide.md 22.3 KB
Newer Older
1
# 设备使用信息统计
W
wyuanchao 已提交
2

W
wyuanchao 已提交
3
## 场景介绍
W
wyuanchao 已提交
4

W
wyuanchao 已提交
5 6 7 8 9 10
设备使用信息统计,包括app usage/notification usage/system usage等使用统计。例如应用使用信息统计,用于保存和查询应用使用详情(app usage)、事件日志数据(event log)、应用分组(bundle group)情况。
部件缓存的应用记录(使用历史统计和使用事件记录)会在事件上报后30分钟内刷新到数据库持久化保存。

## 接口说明
注册相关接口包导入:
```js
W
wyuanchao 已提交
11
import stats from '@ohos.bundleState';
W
wyuanchao 已提交
12
```
W
wyuanchao 已提交
13 14 15 16 17

**表1** 设备使用信息统计主要接口

| 接口名 | 描述 |
| -------- | -------- |
W
wyuanchao 已提交
18 19 20 21
| function queryBundleActiveStates(begin: number, end: number, callback: AsyncCallback<Array<BundleActiveState>>): void | 通过指定起始和结束时间查询所有应用的事件集合。 |
| function queryBundleStateInfos(begin: number, end: number, callback: AsyncCallback<BundleActiveInfoResponse>): void | 通过指定起始和结束时间查询应用使用时长统计信息。 |
| function queryCurrentBundleActiveStates(begin: number, end: number, callback: AsyncCallback<Array<BundleActiveState>>): void | 通过指定起始和结束时间查询当前应用的事件集合。 |
| function queryBundleStateInfoByInterval(byInterval: IntervalType, begin: number, end: number, callback: AsyncCallback<Array<BundleStateInfo>>): void | 通过指定时间段间隔(天、周、月、年)查询应用使用时长统计信息。 |
Y
yupeng74@huawei.com 已提交
22 23
| function queryAppUsagePriorityGroup(callback: AsyncCallback<number>): void | 查询当前应用的使用优先级群组。callback形式。 |
| function queryAppUsagePriorityGroup(): Promise<number>; | 查询当前应用的使用优先级群组。promise形式。 |
W
wyuanchao 已提交
24
| function isIdleState(bundleName: string, callback: AsyncCallback<boolean>): void | 判断指定Bundle Name的应用当前是否是空闲状态。 |
25
| function getRecentlyUsedModules(maxNum? : number, callback: AsyncCallback<BundleActiveModuleInfo>): void | 根据maxNum,查询FA使用记录,返回不超过maxNum条FA使用记录,若不填写maxNum参数,则默认maxNum值为1000。 |
W
wyuanchao 已提交
26 27
| function queryAppNotificationNumber(begin: number, end: number, callback: AsyncCallback<Array<BundleActiveEventState>>): void | 通过指定起始和结束时间查询所有应用的通知次数。 |
| function queryBundleActiveEventStates(begin: number, end: number, callback: AsyncCallback<Array<BundleActiveEventState>>): void | 通过指定起始和结束时间查询系统事件(休眠、唤醒、解锁、锁屏)统计信息。 |
Y
yupeng74@huawei.com 已提交
28 29 30 31 32 33 34 35
| function queryAppUsagePriorityGroup(bundleName? : string, callback: AsyncCallback<number>): void | 查询当前调用者应用或者指定应用的使用优先级群组。callback形式。 |
| function queryAppUsagePriorityGroup(bundleName? : string): Promise<number>; | 查询当前调用者应用或者指定应用的使用优先级群组。promise形式。 |
| function setBundleGroup(bundleName : string, newGroup: GroupType, callback: AsyncCallback>boolean>): void | 给应用名是bundleName的应用分组设置成newGroup,返回设置结果是否成功,以callback形式返回。 |
| function setBundleGroup(bundleName : string, newGroup : GroupType): Promise>boolean>; | 给应用名是bundleName的应用分组设置成newGroup,返回设置结果是否成功,以promise形式返回。 |
| function registerGroupCallBack(callback: Callback>BundleActiveGroupCallbackInfo>, callback: AsyncCallback>boolean>): void | 注册应用分组变化监听回调,返回注册是否成功,当应用分组发生变化时,会给所有已注册的监听者返回回调信息,以callback形式返回。 |
| function registerGroupCallBack(callback: Callback>BundleActiveGroupCallbackInfo>): Promise>boolean>; | 注册应用分组变化监听回调,返回注册是否成功,当应用分组发生变化时,会给所有已注册的监听者返回回调信息,以promise形式返回。 |
| function unRegisterGroupCallBack(callback: AsyncCallback>boolean>): void | 解除应用分组监听回调,以callback形式返回。 |
| function unRegisterGroupCallBack(): Promise>boolean>; | 解除应用分组监听回调,以promise形式返回。 |
W
wyuanchao 已提交
36 37 38

## 开发步骤

W
wyuanchao 已提交
39
1. 在config.json文件中配置设备使用信息统计权限。
W
wyuanchao 已提交
40 41 42 43 44 45 46

    ```json
    "module": {
        "package": "com.example.deviceUsageStatistics",
        ...,
        "reqPermissions": [
            {
47
                "name": "ohos.permission.BUNDLE_ACTIVE_INFO"
W
wyuanchao 已提交
48 49 50 51 52
            }
        ]
    }
    ```

W
wyuanchao 已提交
53
2. 通过指定起始和结束时间查询所有应用的事件集合,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。
W
wyuanchao 已提交
54 55

    ```js
W
wyuanchao 已提交
56
    import stats from '@ohos.bundleState'
W
wyuanchao 已提交
57 58

    // 异步方法promise方式
59
    stats.queryBundleActiveStates(0, 20000000000000).then(res => {
W
wyuanchao 已提交
60
        console.log('BUNDLE_ACTIVE queryBundleActiveStates promise success.');
W
wyuanchao 已提交
61
        for (let i = 0; i < res.length; i++) {
W
wyuanchao 已提交
62 63
            console.log('BUNDLE_ACTIVE queryBundleActiveStates promise number : ' + (i + 1));
            console.log('BUNDLE_ACTIVE queryBundleActiveStates promise result ' + JSON.stringify(res[i]));
W
wyuanchao 已提交
64
        }
65
    }).catch(err => {
W
wyuanchao 已提交
66
        console.log('BUNDLE_ACTIVE queryBundleActiveStates promise failed, because: ' + err.code);
W
wyuanchao 已提交
67 68 69
    });

    // 异步方法callback方式
W
wyuanchao 已提交
70
    stats.queryBundleActiveStates(0, 20000000000000, (err, res) => {
W
wyuanchao 已提交
71 72 73
        if (err) {
            console.log('BUNDLE_ACTIVE queryBundleActiveStates callback failed, because: ' + err.code);
        } else {
W
wyuanchao 已提交
74 75 76 77
            console.log('BUNDLE_ACTIVE queryBundleActiveStates callback success.');
            for (let i = 0; i < res.length; i++) {
                console.log('BUNDLE_ACTIVE queryBundleActiveStates callback number : ' + (i + 1));
                console.log('BUNDLE_ACTIVE queryBundleActiveStates callback result ' + JSON.stringify(res[i]));
W
wyuanchao 已提交
78
            }
W
wyuanchao 已提交
79 80
        }
    });
W
wyuanchao 已提交
81 82
    ```

W
wyuanchao 已提交
83
3. 通过指定起始和结束时间查询应用使用时长统计信息,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。
W
wyuanchao 已提交
84 85

    ```js
W
wyuanchao 已提交
86
    import stats from '@ohos.bundleState'
W
wyuanchao 已提交
87 88

    // 异步方法promise方式
89
    stats.queryBundleStateInfos(0, 20000000000000).then(res => {
W
wyuanchao 已提交
90 91
        console.log('BUNDLE_ACTIVE queryBundleStateInfos promise success.');
        let i = 1;
W
wyuanchao 已提交
92
        for (let key in res){
W
wyuanchao 已提交
93 94 95
            console.log('BUNDLE_ACTIVE queryBundleStateInfos promise number : ' + i);
            console.log('BUNDLE_ACTIVE queryBundleStateInfos promise result ' + JSON.stringify(res[key]));
            i++;
W
wyuanchao 已提交
96
        }
97
    }).catch(err => {
W
wyuanchao 已提交
98
        console.log('BUNDLE_ACTIVE queryBundleStateInfos promise failed, because: ' + err.code);
W
wyuanchao 已提交
99 100 101
    });

    // 异步方法callback方式
W
wyuanchao 已提交
102
    stats.queryBundleStateInfos(0, 20000000000000, (err, res) => {
W
wyuanchao 已提交
103 104 105
        if (err) {
            console.log('BUNDLE_ACTIVE queryBundleStateInfos callback failed, because: ' + err.code);
        } else {
W
wyuanchao 已提交
106 107 108 109 110 111
            console.log('BUNDLE_ACTIVE queryBundleStateInfos callback success.');
            let i = 1;
            for(let key in res){
                console.log('BUNDLE_ACTIVE queryBundleStateInfos callback number : ' + i);
                console.log('BUNDLE_ACTIVE queryBundleStateInfos callback result ' + JSON.stringify(res[key]));
                i++;
W
wyuanchao 已提交
112
            }
W
wyuanchao 已提交
113 114
        }
    });
W
wyuanchao 已提交
115 116
    ```

W
wyuanchao 已提交
117
4. 通过指定起始和结束时间查询当前应用的事件集合,config.json中不需要配置权限。
W
wyuanchao 已提交
118 119

    ```js
W
wyuanchao 已提交
120
    import stats from '@ohos.bundleState'
W
wyuanchao 已提交
121 122

    // 异步方法promise方式
123
    stats.queryCurrentBundleActiveStates(0, 20000000000000).then(res => {
W
wyuanchao 已提交
124
        console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise success.');
W
wyuanchao 已提交
125
        for (let i = 0; i < res.length; i++) {
W
wyuanchao 已提交
126 127
            console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise number : ' + (i + 1));
            console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise result ' + JSON.stringify(res[i]));
W
wyuanchao 已提交
128
        }
129
    }).catch(err => {
W
wyuanchao 已提交
130
        console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates promise failed, because: ' + err.code);
W
wyuanchao 已提交
131 132 133
    });

    // 异步方法callback方式
W
wyuanchao 已提交
134
    stats.queryCurrentBundleActiveStates(0, 20000000000000, (err, res) => {
W
wyuanchao 已提交
135 136 137
        if (err) {
            console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback failed, because: ' + err.code);
        } else {
W
wyuanchao 已提交
138 139 140 141
            console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback success.');
            for (let i = 0; i < res.length; i++) {
                console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback number : ' + (i + 1));
                console.log('BUNDLE_ACTIVE queryCurrentBundleActiveStates callback result ' + JSON.stringify(res[i]));
W
wyuanchao 已提交
142
            }
W
wyuanchao 已提交
143 144
        }
    });
W
wyuanchao 已提交
145 146
    ```

W
wyuanchao 已提交
147
5. 通过指定时间段间隔(天、周、月、年)查询应用使用时长统计信息,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。
W
wyuanchao 已提交
148 149

    ```js
W
wyuanchao 已提交
150
    import stats from '@ohos.bundleState'
W
wyuanchao 已提交
151 152

    // 异步方法promise方式
153
    stats.queryBundleStateInfoByInterval(0, 0, 20000000000000).then(res => {
W
wyuanchao 已提交
154
        console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise success.');
W
wyuanchao 已提交
155
        for (let i = 0; i < res.length; i++) {
W
wyuanchao 已提交
156 157
            console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise number : ' + (i + 1));
            console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise result ' + JSON.stringify(res[i]));
W
wyuanchao 已提交
158
        }
159
    }).catch(err => {
W
wyuanchao 已提交
160
        console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval promise failed, because: ' + err.code);
W
wyuanchao 已提交
161 162 163
    });

    // 异步方法callback方式
W
wyuanchao 已提交
164
    stats.queryBundleStateInfoByInterval(0, 0, 20000000000000, (err, res) => {
W
wyuanchao 已提交
165 166 167
        if (err) {
            console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback failed, because: ' + err.code);
        } else {
W
wyuanchao 已提交
168 169 170 171
            console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback success.');
            for (let i = 0; i < res.length; i++) {
                console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback number : ' + (i + 1));
                console.log('BUNDLE_ACTIVE queryBundleStateInfoByInterval callback result ' + JSON.stringify(res[i]));
W
wyuanchao 已提交
172
            }
W
wyuanchao 已提交
173 174
        }
    });
W
wyuanchao 已提交
175 176
    ```

Y
yupeng74@huawei.com 已提交
177
6. 查询(无参)当前调用者应用的使用优先级群组,config.json中不需要配置权限。
W
wyuanchao 已提交
178 179

    ```js
W
wyuanchao 已提交
180
    import stats from '@ohos.bundleState'
181

Y
yupeng74@huawei.com 已提交
182
    // promise方式
183
    stats.queryAppUsagePriorityGroup().then(res => {
W
wyuanchao 已提交
184
        console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup promise succeeded. result: ' + JSON.stringify(res));
185
    }).catch(err => {
W
wyuanchao 已提交
186
        console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup promise failed. because: ' + err.code);
W
wyuanchao 已提交
187
    });
188

Y
yupeng74@huawei.com 已提交
189
    // callback方式
W
wyuanchao 已提交
190
    stats.queryAppUsagePriorityGroup((err, res) => {
W
wyuanchao 已提交
191
        if (err) {
W
wyuanchao 已提交
192
            console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup callback failed. because: ' + err.code);
W
wyuanchao 已提交
193 194
        } else {
            console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup callback succeeded. result: ' + JSON.stringify(res));
W
wyuanchao 已提交
195 196
        }
    });
W
wyuanchao 已提交
197
    ```
198

W
wyuanchao 已提交
199
7. 判断指定Bundle Name的应用当前是否是空闲状态,config.json中不需要配置权限,三方应用只能查询自身的空闲状态。
W
wyuanchao 已提交
200 201

    ```js
W
wyuanchao 已提交
202
    import stats from '@ohos.bundleState'
W
wyuanchao 已提交
203 204

    // 异步方法promise方式
205
    stats.isIdleState("com.ohos.camera").then(res => {
W
wyuanchao 已提交
206
        console.log('BUNDLE_ACTIVE isIdleState promise succeeded, result: ' + JSON.stringify(res));
207
    }).catch(err => {
W
wyuanchao 已提交
208
        console.log('BUNDLE_ACTIVE isIdleState promise failed, because: ' + err.code);
W
wyuanchao 已提交
209 210 211
    });

    // 异步方法callback方式
W
wyuanchao 已提交
212
    stats.isIdleState("com.ohos.camera", (err, res) => {
W
wyuanchao 已提交
213
        if (err) {
W
wyuanchao 已提交
214
            console.log('BUNDLE_ACTIVE isIdleState callback failed, because: ' + err.code);
W
wyuanchao 已提交
215 216
        } else {
            console.log('BUNDLE_ACTIVE isIdleState callback succeeded, result: ' + JSON.stringify(res));
W
wyuanchao 已提交
217 218
        }
    });
H
houdisheng 已提交
219 220
    ```

H
houdisheng 已提交
221
8. 查询FA使用记录。返回数量最大不超过maxNum设置的值,若不传入maxNum参数,则默认maxNum为1000。config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。
H
houdisheng 已提交
222 223 224 225 226

    ```js
    import stats from '@ohos.bundleState'

    // 异步方法promise方式
227
    stats.getRecentlyUsedModules(1000).then(res => {
H
houdisheng 已提交
228
        console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise succeeded');
H
houdisheng 已提交
229
        for (let i = 0; i < res.length; i++) {
H
houdisheng 已提交
230 231
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise number : ' + (i + 1));
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise result ' + JSON.stringify(res[i]));
H
houdisheng 已提交
232
        }
233
    }).catch(err=> {
H
houdisheng 已提交
234
        console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise failed, because: ' + err.code);
H
houdisheng 已提交
235 236
    });

H
houdisheng 已提交
237
    // 无maNum参数异步方法promise方式
238
    stats.getRecentlyUsedModules().then(res => {
H
houdisheng 已提交
239 240 241 242 243 244 245 246 247
        console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise succeeded');
        for (let i = 0; i < res.length; i++) {
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise number : ' + (i + 1));
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise result ' + JSON.stringify(res[i]));
        }
    }).catch( err=> {
        console.log('BUNDLE_ACTIVE getRecentlyUsedModules promise failed, because: ' + err.code);
    });

H
houdisheng 已提交
248
    // 异步方法callback方式
249
    stats.getRecentlyUsedModules(1000, (err, res) => {
H
houdisheng 已提交
250
        if(err) {
H
houdisheng 已提交
251
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback failed, because: ' + err.code);
H
houdisheng 已提交
252
        } else {
H
houdisheng 已提交
253
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback succeeded.');
H
houdisheng 已提交
254
                for (let i = 0; i < res.length; i++) {
H
houdisheng 已提交
255 256
                    console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback number : ' + (i + 1));
                    console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback result ' + JSON.stringify(res[i]));
H
houdisheng 已提交
257 258 259
                }
            }
    });
H
houdisheng 已提交
260

H
houdisheng 已提交
261
    // 无maNum参数异步方法callback方式
H
houdisheng 已提交
262
    stats.getRecentlyUsedModules((err, res) => {
263
        if (err) {
H
houdisheng 已提交
264 265 266 267 268 269 270 271 272
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback failed, because: ' + err.code);
        } else {
            console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback succeeded.');
                for (let i = 0; i < res.length; i++) {
                    console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback number : ' + (i + 1));
                    console.log('BUNDLE_ACTIVE getRecentlyUsedModules callback result ' + JSON.stringify(res[i]));
                }
            }
    });
H
houdisheng 已提交
273 274
    ```

W
wyuanchao 已提交
275 276 277 278 279 280
9. 通过指定起始和结束时间查询所有应用的通知次数,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。

    ```js
    import stats from '@ohos.bundleState'

    // 异步方法promise方式
281
    stats.queryAppNotificationNumber(0, 20000000000000).then(res => {
W
wyuanchao 已提交
282 283
        console.log('BUNDLE_ACTIVE queryAppNotificationNumber promise success.');
        console.log('BUNDLE_ACTIVE queryAppNotificationNumber promise result ' + JSON.stringify(res));
284
    }).catch(err => {
W
wyuanchao 已提交
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
        console.log('BUNDLE_ACTIVE queryAppNotificationNumber promise failed, because: ' + err.code);
    });

    // 异步方法callback方式
    stats.queryAppNotificationNumber(0, 20000000000000, (err, res) => {
        if (err) {
            console.log('BUNDLE_ACTIVE queryAppNotificationNumber callback failed, because: ' + err.code);
        } else {
            console.log('BUNDLE_ACTIVE queryAppNotificationNumber callback success.');
            console.log('BUNDLE_ACTIVE queryAppNotificationNumber callback result ' + JSON.stringify(res));
        }
    });
    ```

10. 通过指定起始和结束时间查询系统事件(休眠、唤醒、解锁、锁屏)统计信息,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。

    ```js
    import stats from '@ohos.bundleState'
303

W
wyuanchao 已提交
304
    // 异步方法promise方式
305
    stats.queryBundleActiveEventStates(0, 20000000000000).then(res => {
W
wyuanchao 已提交
306 307
        console.log('BUNDLE_ACTIVE queryBundleActiveEventStates promise success.');
        console.log('BUNDLE_ACTIVE queryBundleActiveEventStates promise result ' + JSON.stringify(res));
308
    }).catch(err => {
W
wyuanchao 已提交
309 310
        console.log('BUNDLE_ACTIVE queryBundleActiveEventStates promise failed, because: ' + err.code);
    });
311

W
wyuanchao 已提交
312 313 314 315 316 317 318 319 320
    // 异步方法callback方式
    stats.queryBundleActiveEventStates(0, 20000000000000, (err, res) => {
        if (err) {
            console.log('BUNDLE_ACTIVE queryBundleActiveEventStates callback failed, because: ' + err.code);
        } else {
            console.log('BUNDLE_ACTIVE queryBundleActiveEventStates callback success.');
            console.log('BUNDLE_ACTIVE queryBundleActiveEventStates callback result ' + JSON.stringify(res));
        }
    });
Y
yupeng74@huawei.com 已提交
321 322
    ```

Y
yupeng74@huawei.com 已提交
323 324 325 326
11. 查询(无参)当前调用者应用的使用优先级群组,config.json中不需要配置权限。查询(有参)指定应用的使用优先级群组,config.json中需要配置权限:ohos.permission.BUNDLE_ACTIVE_INFO。

     ```js
     import stats from '@ohos.bundleState'
327

Y
yupeng74@huawei.com 已提交
328
     // 无参异步方法promise方式
329
     stats.queryAppUsagePriorityGroup().then(res => {
Y
yupeng74@huawei.com 已提交
330
         console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup promise succeeded. result: ' + JSON.stringify(res));
331
     }).catch(err => {
Y
yupeng74@huawei.com 已提交
332 333
         console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup promise failed. because: ' + err.code);
     });
334

Y
yupeng74@huawei.com 已提交
335 336 337 338 339 340 341 342
     // 无参异步方法callback方式
     stats.queryAppUsagePriorityGroup((err, res) => {
         if (err) {
             console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup callback failed. because: ' + err.code);
         } else {
             console.log('BUNDLE_ACTIVE queryAppUsagePriorityGroup callback succeeded. result: ' + JSON.stringify(res));
         }
     });
343

Y
yupeng74@huawei.com 已提交
344
     //有参异步promise方式
345
     stats.queryAppUsagePriorityGroup(this.bundleName).then(res => {
Y
yupeng74@huawei.com 已提交
346
         console.log('BUNDLE_ACTIVE QueryPackageGroup promise succeeded. result: ' + JSON.stringify(res));
347
     }).catch(err => {
Y
yupeng74@huawei.com 已提交
348 349
         console.log('BUNDLE_ACTIVE QueryPackageGroup promise failed. because: ' + err.code);
     });
350

Y
yupeng74@huawei.com 已提交
351 352
     //有参异步方法callback方式
     stats.queryAppUsagePriorityGroup(this.bundleName, (err, res) => {
353
         if (err) {
Y
yupeng74@huawei.com 已提交
354 355 356 357 358 359 360
             console.log('BUNDLE_ACTIVE QueryPackageGroup callback failed. because: ' + err.code);
         } else {
             console.log('BUNDLE_ACTIVE QueryPackageGroup callback succeeded. result: ' + JSON.stringify(res));
         }
     });
     ```

Y
yupeng74@huawei.com 已提交
361 362 363 364
11. 给应用名是bundleName的应用分组设置成newGroup,返回设置结果是否成功

    ```javascript
    import stats from '@ohos.bundleState'
365

Y
yupeng74@huawei.com 已提交
366
    //异步方法promise
367
    stats.setBundleGroup(this.bundleName, this.newGroup).then(() => {
Y
yupeng74@huawei.com 已提交
368
        console.log('BUNDLE_ACTIVE SetBundleGroup promise succeeded.');
Y
yupeng74@huawei.com 已提交
369 370 371 372
    }).catch( err => {
        console.log('BUNDLE_ACTIVE SetBundleGroup promise failed. because: ' + err.code);
    });
    //异步方法callback
Y
yupeng74@huawei.com 已提交
373
    stats.setBundleGroup(this.bundleName, this.newGroup, (err) => {
374
        if (err) {
Y
yupeng74@huawei.com 已提交
375 376
            console.log('BUNDLE_ACTIVE SetBundleGroup callback failed. because: ' + err.code);
        } else {
Y
yupeng74@huawei.com 已提交
377
            console.log('BUNDLE_ACTIVE SetBundleGroup callback succeeded.');
Y
yupeng74@huawei.com 已提交
378 379 380 381 382 383 384 385
        }
    });
    ```

12. 注册应用分组变化监听回调,返回注册是否成功,当应用分组发生变化时,会给所有已注册的监听者返回回调信息

    ```javascript
    import stats from '@ohos.bundleState'
386

Y
yupeng74@huawei.com 已提交
387
    //异步方法promise形式
388
    let onBundleGroupChanged = (err,res) => {
Y
yupeng74@huawei.com 已提交
389 390 391 392 393 394 395
        console.log('BUNDLE_ACTIVE onBundleGroupChanged RegisterGroupCallBack callback success.');
        console.log('BUNDLE_ACTIVE onBundleGroupChanged RegisterGroupCallBack result oldGroup is : ' + res.oldGroup);
        console.log('BUNDLE_ACTIVE onBundleGroupChanged RegisterGroupCallBack result newGroup is : ' + res.newGroup);
        console.log('BUNDLE_ACTIVE onBundleGroupChanged RegisterGroupCallBack result changeReason is : ' + res.newGroup);
        console.log('BUNDLE_ACTIVE onBundleGroupChanged RegisterGroupCallBack result userId is : ' + res.userId);
        console.log('BUNDLE_ACTIVE onBundleGroupChanged RegisterGroupCallBack result bundleName is : ' + res.bundleName);
    };
396
    stats.registerGroupCallBack(onBundleGroupChanged).then(() => {
Y
yupeng74@huawei.com 已提交
397
        console.log('BUNDLE_ACTIVE RegisterGroupCallBack promise succeeded.');
398
    }).catch(err => {
Y
yupeng74@huawei.com 已提交
399 400 401
        console.log('BUNDLE_ACTIVE RegisterGroupCallBack promise failed. because: ' + err.code);
    });
    //异步方法callback形式
402
    let onBundleGroupChanged = (err,res) => {
Y
yupeng74@huawei.com 已提交
403 404 405 406 407 408 409
        console.log('BUNDLE_ACTIVE onBundleGroupChanged RegisterGroupCallBack callback success.');
        console.log('BUNDLE_ACTIVE onBundleGroupChanged RegisterGroupCallBack result‘s oldGroup is : ' + res.oldGroup);
        console.log('BUNDLE_ACTIVE onBundleGroupChanged RegisterGroupCallBack result‘s newGroup is : ' + res.newGroup);
        console.log('BUNDLE_ACTIVE onBundleGroupChanged RegisterGroupCallBack result‘s changeReason is : ' + res.newGroup);
        console.log('BUNDLE_ACTIVE onBundleGroupChanged RegisterGroupCallBack result‘s userId is : ' + res.userId);
        console.log('BUNDLE_ACTIVE onBundleGroupChanged RegisterGroupCallBack result‘s bundleName is : ' + res.bundleName);
    };
410 411
    stats.registerGroupCallBack(onBundleGroupChanged, (err) => {
        if (err) {
Y
yupeng74@huawei.com 已提交
412 413 414 415 416 417
            console.log('BUNDLE_ACTIVE RegisterGroupCallBack callback failed, because: ' + err.code);
        } else {
            console.log('BUNDLE_ACTIVE RegisterGroupCallBack callback success.');
        }
    });
    ```
418

Y
yupeng74@huawei.com 已提交
419 420 421 422
13. 解除应用分组监听回调

    ```javascript
    import stats from '@ohos.bundleState'
423

Y
yupeng74@huawei.com 已提交
424
    //promise
425
    stats.unRegisterGroupCallBack().then(() => {
Y
yupeng74@huawei.com 已提交
426
        console.log('BUNDLE_ACTIVE UnRegisterGroupCallBack promise succeeded.');
427
    }).catch(err => {
Y
yupeng74@huawei.com 已提交
428 429 430
        console.log('BUNDLE_ACTIVE UnRegisterGroupCallBack promise failed. because: ' + err.code);
    });
    //callback
431 432
    stats.unRegisterGroupCallBack((err) => {
        if (err) {
Y
yupeng74@huawei.com 已提交
433 434 435 436 437 438
            console.log('BUNDLE_ACTIVE UnRegisterGroupCallBack callback failed, because: ' + err.code);
        } else {
            console.log('BUNDLE_ACTIVE UnRegisterGroupCallBack callback success.');
        }
    });
    ```
439 440 441
## 相关实例
针对设备使用信息统计,有以下相关实例可供参考:
- [`DeviceUsageStatistics`:设备使用信息统计(eTS)(API8)](https://gitee.com/openharmony/app_samples/tree/master/device/DeviceUsageStatistics)
Y
yupeng74@huawei.com 已提交
442