• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# FenceExtensionAbility
2
3## 概述
4[FenceExtensionAbility](../../reference/apis-location-kit/js-apis-app-ability-FenceExtensionAbility.md)是一个地理围栏类型的ExtensionAbility,开发者可以使用该Ability来快速便捷的实现地理围栏拓展能力,协助用户完成快捷交互,提升用户体验。
5
6## 使用场景
7
81. 通过位置服务的[geoLocationManager.on('gnssFenceStatusChange')](../../reference/apis-location-kit/js-apis-geoLocationManager.md#geolocationmanagerongnssfencestatuschange)接口进行地理围栏的注册和事件订阅,并在want参数中传入实现的FenceExtensionAbility相关参数信息;
92. 系统会在注册的地理围栏触发后,通过onFenceStatusChange接口上报围栏事件和数据,APP可以在接收到事件后进行相应的业务处理,例如发送一个通知。
10
11## 接口介绍
12接口详情参见[FenceExtensionAbility](../../reference/apis-location-kit/js-apis-app-ability-FenceExtensionAbility.md)。
13| 接口 | 描述 |
14| ---- | ---- |
15| [onFenceStatusChange(transition: geoLocationManager.GeofenceTransition, additions: Record<string, string>): void](../../reference/apis-location-kit/js-apis-app-ability-FenceExtensionAbility.md#onfencestatuschange)  | 接收系统通知的地理围栏事件,根据围栏事件类型和数据进行相应处理。 |
16| [onDestroy(): void](../../reference/apis-location-kit/js-apis-app-ability-FenceExtensionAbility.md#ondestroy) | 接收FenceExtensionAbility的销毁事件并处理,会在FenceExtensionAbility销毁前回调。 |
17
18## 开发步骤
19
20### 实现一个地理围栏扩展服务
21
22首先需要实现[FenceExtensionAbility](../../reference/apis-location-kit/js-apis-app-ability-FenceExtensionAbility.md)提供方的能力。
23
24需要在DevEco Studio工程中手动新建一个FenceExtensionAbility,具体步骤如下。
25
261. 在工程Module对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为fenceextensionability。
272. 在fenceextensionability目录,右键选择“New > File”,新建一个.ets文件并命名为MyFenceExtensionAbility.ets283. 打开MyFenceExtensionAbility.ets,导入FenceExtensionAbility的依赖包,自定义类继承FenceExtensionAbility并实现onFenceStatusChange和onDestroy接口。
29
30示例代码如下:
31
32```ts
33import { FenceExtensionAbility, geoLocationManager } from '@kit.LocationKit';
34import { notificationManager } from '@kit.NotificationKit';
35import { Want, wantAgent } from '@kit.AbilityKit';
36
37export class MyFenceExtensionAbility extends FenceExtensionAbility {
38  onFenceStatusChange(transition: geoLocationManager.GeofenceTransition, additions: Record<string, string>): void {
39    // 接受围栏状态变化事件,处理业务逻辑
40    console.info(`on geofence transition,id:${transition.geofenceId},event:${transition.transitionEvent},additions:${JSON.stringify(additions)}`);
41
42    // 可以发送围栏业务通知
43    let wantAgentInfo: wantAgent.WantAgentInfo = {
44      wants: [
45        {
46          bundleName: 'com.example.myapplication',
47          abilityName: 'EntryAbility',
48          parameters:
49          {
50            "geofenceId": transition?.geofenceId,
51            "transitionEvent": transition?.transitionEvent,
52          }
53        } as Want
54      ],
55      actionType: wantAgent.OperationType.START_ABILITY,
56      requestCode: 100
57    };
58    wantAgent.getWantAgent(wantAgentInfo).then((wantAgentMy) => {
59      let notificationRequest: notificationManager.NotificationRequest = {
60        id: 1,
61        content: {
62          notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
63          normal: {
64            title: `围栏通知`,
65            text: `on geofence transition,id:${transition.geofenceId},event:${transition.transitionEvent},additions:${JSON.stringify(additions)}`,
66          }
67        },
68        notificationSlotType: notificationManager.SlotType.SOCIAL_COMMUNICATION,
69        wantAgent: wantAgentMy
70      };
71      notificationManager.publish(notificationRequest);
72    });
73  }
74}
75```
76
774. 在工程Module对应的[module.json5配置文件](../../quick-start/module-configuration-file.md)中注册FenceExtensionAbility,type标签需要设置为fence,srcEntry标签表示当前FenceExtensionAbility组件所对应的代码路径。
78
79```json
80{
81  "module": {
82    "extensionAbilities": [
83      {
84        "name": "MyFenceExtensionAbility",
85        "srcEntry": "./ets/fenceExtensionability/MyFenceExtensionAbility.ets",
86        "description": "MyFenceExtensionAbility",
87        "type": "fence",
88        "exported": true
89      },
90    ]
91  }
92}
93```