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.ets。 283. 打开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```