• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# UIServiceExtension(仅对系统应用开放)
2
3## 概述
4
5[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)是UIService类型的[ExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-extensionAbility.md)浮窗类组件,提供UI界面(例如预览界面)和后台服务能力。组件内部持有了一个[UIServiceExtensionContext](../reference/apis-ability-kit/js-apis-inner-application-uiserviceExtensionContext-sys.md),通过[UIServiceExtensionContext](../reference/apis-ability-kit/js-apis-inner-application-uiserviceExtensionContext-sys.md)提供了丰富的接口供外部使用。
6
7本文描述中称被启动的[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)为服务端,称启动[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)的组件为客户端。
8
9应用可以通过启动和连接两种形式使用[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)。
10- 通过[UIAbilityContext](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md)、[UIExtensionContext](../reference/apis-ability-kit/js-apis-inner-application-uiExtensionContext.md)、[ServiceExtensionContext](../reference/apis-ability-kit/js-apis-inner-application-serviceExtensionContext-sys.md)调用[startUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#startuiserviceextensionability14)方法启动[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)。
11- 通过[UIAbilityContext](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md)、[UIExtensionContext](../reference/apis-ability-kit/js-apis-inner-application-uiExtensionContext.md)调用[connectUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#connectuiserviceextensionability14)方法连接[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)。
12
13此处有如下细节需要注意:
14
15- [UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)可以通过[startUIServiceExtensionAbility](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#startuiserviceextensionability14)方式拉起或者可以通过[connectUIServiceExtensionAbility](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#connectuiserviceextensionability14)拉起,窗口只会创建一次。
16- [UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)窗口创建失败或销毁时,[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)会自动销毁。
17- 只能在主线程线程中执行start/connect/disconnect操作,不要在Worker、TaskPool等子线程中执行start/connect/disconnect操作。
18- 应用需要在前台获焦的情况下才能启动、连接系统提供的[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)。
19
20## 生命周期
21
22[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)提供了[onCreate()](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md#oncreate)、[onWindowWillCreate()](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md#onwindowwillcreate)、[onWindowDidCreate()](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md#onwindowdidcreate)、[onRequest()](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md#onrequest)、[onConnect()](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md#onconnect)、[onDisconnect()](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md#ondisconnect)、[onData()](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md#ondata)和[onDestroy()](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md#ondestroy)生命周期接口函数,根据需要重写对应的回调方法。下图展示了[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)的生命周期。
23
24**图1** [UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)生命周期
25
26![UIServiceExtensionAbility-lifecycle](figures/UIServiceExtension-lifecycle.png)
27
28
29
30- **onCreate**
31
32  [UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)被首次创建时触发该回调,开发者可以在此进行一些初始化的操作,例如注册公共事件监听等。
33
34  > **说明:**
35  > 如果[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)已创建,再次启动该[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)不会触发onCreate()回调。
36
37- **onRequest**
38
39  当另一个组件调用[startUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#startuiserviceextensionability14)方法启动该[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)时,触发该回调。执行此方法后,[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)会启动并前端运行。每调用一次[startUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#startuiserviceextensionability14)方法均会触发该回调。
40
41- **onWindowWillCreate**
42
43  创建窗口之前回调,开发者传递窗口参数给系统。设置config.windowAttribute属性值为window.ExtensionWindowAttribute.SUB_WINDOW,此时创建的是子窗; 设置config.windowAttribute属性值为window.ExtensionWindowAttribute.SYSTEM_WINDOW,此时创建的是系统窗;
44  目前[UIAbilityContext](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md)和[UIExtensionContext](../reference/apis-ability-kit/js-apis-inner-application-uiExtensionContext.md)拉起[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)创建的窗口支持子窗和系统窗,其他context([ServiceExtensionContext](../reference/apis-ability-kit/js-apis-inner-application-serviceExtensionContext-sys.md))拉起[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)创建的窗口只支持系统窗。一个UIServiceExtension只能创建一个窗口。
45
46- **onWindowDidCreate**
47
48  创建窗口回调接口,开发者通过[Window](../reference/apis-arkui/arkts-apis-window-Window.md)对象操作窗口。通过[window.on('windowVisibilityChange')](../reference/apis-arkui/arkts-apis-window-Window.md#onwindowvisibilitychange11)方法绑定窗口事件,处理各种窗口事件,如窗口显示、窗口隐藏、窗口销毁等。
49
50- **onConnect**
51
52  当另一个组件调用[connectUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#connectuiserviceextensionability14)方法与该服务连接时,触发该回调。此方法中,接收一个调用方远端代理对象([UIServiceHostProxy](../reference/apis-ability-kit/js-apis-inner-application-uiservicehostproxy-sys.md)),服务端拿到这个对象后可以通过这个对象与客户端进行通信。同一个客户端,want里面的(DeviceId, BundleName,ModuleName,AbilityName)以及callback对象相同情况下去连接,只会在第一次收到[onConnect()](../reference/apis-ability-kit/js-apis-app-ability-serviceExtensionAbility-sys.md#onconnect),其他情况每次连接都会收到[onConnect()](../reference/apis-ability-kit/js-apis-app-ability-serviceExtensionAbility-sys.md#onconnect)。
53
54- **onData**
55
56  数据接收回调。接收调用方通过[UIServiceProxy](../reference/apis-ability-kit/js-apis-inner-application-uiserviceproxy.md)发送的数据。
57
58- **onDisconnect**
59
60  当连接断开时,将触发该回调。客户端死亡或者调用[disconnectServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#disconnectuiserviceextensionability14)方法可以使连接断开。
61
62- **onDestroy**
63
64  当不再使用服务且准备将其销毁该实例时,触发该回调。开发者可以在该回调中清理资源,如注销监听等。
65
66## 实现一种UIService类型Extension基类
67
68### 开发准备
69
70只有系统应用才允许实现[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md),因此开发者在开发之前需做如下准备:
71
72- **替换Full SDK**:[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)相关接口都被标记为System-API,默认对开发者隐藏,因此需要手动从镜像站点获取Full SDK,并在DevEco Studio中替换,具体操作可参考[替换指南](../faqs/full-sdk-switch-guide.md)。
73
74- **申请AllowAppUsePrivilegeExtension特权**:只有具有AllowAppUsePrivilegeExtension特权的应用才允许开发[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md),具体申请方式可参考[应用特权配置指南](../../device-dev/subsystems/subsys-app-privilege-config-guide.md)。
75
76
77
78### 创建UIServiceExtension
79
80在DevEco Studio工程中手动新建一个[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md),具体步骤如下:
81
821. 在工程Module对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)。
83
842. 在UIServiceExt目录,右键选择“New > ArkTS File”,新建一个文件并命名为UIServiceExt.ets85
86    ```
87    ├── ets
88    │ ├── UIServiceExt
89    │ │   ├── UIServiceExt.ets
90    ```
91
923. UIServiceExt.ets文件中,增加导入[UIServiceExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)的依赖包,自定义类继承[UIServiceExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)并实现生命周期回调。
93
94    ```ts
95    import { common, UIServiceExtensionAbility, Want } from '@kit.AbilityKit';
96    import { hilog } from '@kit.PerformanceAnalysisKit';
97    import { window } from '@kit.ArkUI';
98
99    export default class UIServiceExtAbility extends UIServiceExtensionAbility {
100      // 创建UIServiceExtensionAbility
101      onCreate(want: Want) {
102        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
103      }
104
105      // 请求处理
106      onRequest(want: Want, startId: number) {
107        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onRequest');
108      }
109
110      // 连接
111      onConnect(want: Want, proxy: common.UIServiceHostProxy) {
112        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onConnect');
113      }
114
115      // 断开连接
116      onDisconnect(want: Want, proxy: common.UIServiceHostProxy) {
117        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDisconnect');
118      }
119
120      // 窗口即将创建
121      onWindowWillCreate(config: window.ExtensionWindowConfig): void {
122        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowWillCreate');
123        let rect: window.Rect = {
124          left: 100,
125          top: 100,
126          width: 500,
127          height: 500
128        };
129        // 创建子窗
130        config.windowName = 'sub_window'
131        config.windowAttribute = window.ExtensionWindowAttribute.SUB_WINDOW;
132        config.windowRect = rect;
133        config.subWindowOptions = {
134          title: 'sub_window_title',
135          decorEnabled: true,
136          // 是否模态窗口
137          isModal: false
138        };
139        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowWillCreate end');
140      }
141
142      // 窗口创建完成
143      onWindowDidCreate(window: window.Window) {
144        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowDidCreate');
145        window.setUIContent('uiservice/page/WindowPage');
146        window.showWindow();
147      }
148
149      // 接收数据
150      onData(proxy: common.UIServiceHostProxy, data: Record<string, Object>) {
151        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onData');
152      }
153
154      // 销毁
155      onDestroy() {
156        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
157      }
158    }
159    ```
160
1614. 在工程Module对应的[module.json5配置文件](../quick-start/module-configuration-file.md)中注册UIServiceExtensionAbility,type标签需要设置为“uiService”,srcEntry标签表示当前ExtensionAbility组件所对应的代码路径。
162
163    ```json
164    {
165      "module": {
166        // ...
167        "extensionAbilities": [
168          {
169            "name": "UIServiceExtAbility",
170            "icon": "$media:icon",
171            "description": "uiService",
172            "type": "uiService",
173            "exported": true,
174            "srcEntry": "./ets/UIServiceExtAbility/UIServiceExtAbility.ets"
175          }
176        ]
177      }
178    }
179    ```
180
181### 启动UIServiceExtension
182
183应用通过[startUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#startuiserviceextensionability14)方法启动一个[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md),组件的[onRequest()](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md#onrequest)回调就会被调用,并在该回调方法中接收到调用者传递过来的want对象。[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)启动后,其生命周期独立于客户端,即使客户端已经销毁,该后台服务仍可继续运行,窗口创建失败或销毁后该服务会被销毁。因此,后台服务需要在其工作完成时通过调用[UIServiceExtensionContext](../reference/apis-ability-kit/js-apis-inner-application-uiserviceExtensionContext-sys.md)的[terminateSelf()](../reference/apis-ability-kit/js-apis-inner-application-uiserviceExtensionContext-sys.md#uiserviceextensioncontextterminateself)来自行停止。
184
185  在应用中启动一个新的[UIServiceExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)。示例中的context的获取方式请参见[获取UIAbility的上下文信息](uiability-usage.md#获取uiability的上下文信息)。
186
187
188```ts
189import { common, Want } from '@kit.AbilityKit';
190import { BusinessError } from '@kit.BasicServicesKit';
191
192@Entry
193@Component
194struct Index {
195  build() {
196    Column() {
197      Row() {
198        // 创建启动按钮
199        Button('start ability')
200          .enabled(true)
201          .onClick(() => {
202            let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
203            let startWant: Want = {
204              bundleName: 'com.acts.uiserviceextensionability',
205              abilityName: 'UiServiceExtAbility',
206            };
207            try {
208              // 启动UIServiceExtensionAbility
209              context.startUIServiceExtensionAbility(startWant).then(() => {
210                console.info(`startUIServiceExtensionAbility success.`);
211              }).catch((error: BusinessError) => {
212                console.error(`startUIServiceExtensionAbility failed, err code: ${error.code}, err msg: ${error.message}.`);
213              })
214            } catch (err) {
215              let code = (err as BusinessError).code;
216              let msg = (err as BusinessError).message;
217              console.error(`startUIServiceExtensionAbility failed, err code: ${code}, err msg: ${msg}.`);
218            }
219          })
220      }
221    }
222  }
223}
224```
225
226### 连接UIServiceExtension
227
228应用可以通过[connectUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#connectuiserviceextensionability14)连接一个服务(在[Want](../reference/apis-ability-kit/js-apis-app-ability-want.md)对象中指定启动的目标服务),服务的[onConnect()](../reference/apis-ability-kit/js-apis-app-ability-serviceExtensionAbility-sys.md#onconnect)就会被调用,并在该回调方法中接收到调用者传递过来的[Want](../reference/apis-ability-kit/js-apis-app-ability-want.md)对象,从而建立连接。
229
230客户端调用[connectUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#connectuiserviceextensionability14)连接服务端时,会接收并保存服务端返回的[UIServiceProxy](../reference/apis-ability-kit/js-apis-inner-application-uiserviceproxy.md)对象,该proxy对象可以用于向服务端发送数据。客户端需要通过保存的[UIServiceProxy](../reference/apis-ability-kit/js-apis-inner-application-uiserviceproxy.md)对象来调用[disconnectServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#disconnectuiserviceextensionability14)断开与服务端的连接。
231
232- 使用[connectUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#connectuiserviceextensionability14)建立与[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)的连接。示例中的context的获取方式请参见[获取UIAbility的上下文信息](uiability-usage.md#获取uiability的上下文信息)。
233    ```ts
234    import { common, Want } from '@kit.AbilityKit';
235    import { BusinessError } from '@kit.BasicServicesKit';
236
237    @Entry
238    @Component
239    struct Page_UIServiceExtensionAbility {
240      @State uiServiceProxy: common.UIServiceProxy | null = null;
241
242      build() {
243        Column() {
244          //...
245          Row() {
246            //...
247          }.onClick(() => {
248            const context = this.getUIContext().getHostContext() as common.UIAbilityContext;
249            const want: Want = {
250              deviceId: '',
251              bundleName: 'com.example.myapplication',
252              abilityName: ''
253            };
254            // 定义回调
255            const callback: common.UIServiceExtensionConnectCallback = {
256              onData: (data: Record<string, Object>): void => {
257                console.info(`onData, data: ${JSON.stringify(data)}.`);
258              },
259              onDisconnect: (): void => {
260                console.info(`onDisconnect.`);
261              }
262            };
263            // 连接UIServiceExtensionAbility
264            context.connectUIServiceExtensionAbility(want, callback).then((uiServiceProxy: common.UIServiceProxy) => {
265              this.uiServiceProxy = uiServiceProxy;
266              console.info(`connectUIServiceExtensionAbility success.`);
267            }).catch((error: BusinessError) => {
268              console.error(`connectUIServiceExtensionAbility failed, err code:${error.code}, err msg: ${error.message}.`);
269            });
270          })
271        }
272      }
273    }
274    ```
275
276- 使用[disconnectUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#disconnectuiserviceextensionability14)断开与[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)的连接。
277    ```ts
278    import { common } from '@kit.AbilityKit';
279    import { BusinessError } from '@kit.BasicServicesKit';
280
281    @Entry
282    @Component
283    struct Page_UIServiceExtensionAbility {
284      @State uiServiceProxy: common.UIServiceProxy | null = null;
285
286      build() {
287        Column() {
288          //...
289          Row() {
290            //...
291          }.onClick(() => {
292            const context = this.getUIContext().getHostContext() as common.UIAbilityContext;
293            // this.uiServiceProxy是连接时保存的proxy对象
294            context.disconnectUIServiceExtensionAbility(this.uiServiceProxy).then(() => {
295              console.info(`disconnectUIServiceExtensionAbility success.`);
296            }).catch((error: BusinessError) => {
297              console.error(`disconnectUIServiceExtensionAbility failed, err code: ${error.code}, err msg: ${error.message}.`);
298            });
299          })
300        }
301      }
302    }
303    ```
304
305
306
307## 客户端与服务端双向通信
308
309[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)启动时,有如下操作:
310
3111. 客户端通过调用[connectUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiExtensionContext.md#connectuiserviceextensionability14), 返回[UIServiceProxy](../reference/apis-ability-kit/js-apis-inner-application-uiserviceproxy.md)对象。使用该proxy对象往[UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)服务端发送数据。
3122. [UIServiceExtension](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md)通过[onConnect()](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md#onconnect)回调,获得[UIServiceHostProxy](../reference/apis-ability-kit/js-apis-inner-application-uiservicehostproxy-sys.md)对象。通过这个proxy往客户端发送数据。
313
314![UIServiceExtensionAbility-bidirectionalcommunication](figures/UIServiceExtension-bidirectionalcommunication.png)
315
316
317### 客户端与服务端通信
318- 客户端收发数据
319
320  客户端通过[connectUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiExtensionContext.md#connectuiserviceextensionability14)连接服务端,获得[UIServiceProxy](../reference/apis-ability-kit/js-apis-inner-application-uiserviceproxy.md)对象。通过它的[sendData()](../reference/apis-ability-kit/js-apis-inner-application-uiserviceproxy.md#uiserviceproxysenddata)方法发送数据给服务端。服务端通过[onData()](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md#ondata)回调接收数据。
321    ```ts
322    import { common, Want } from '@kit.AbilityKit';
323    import { BusinessError } from '@kit.BasicServicesKit';
324
325    @Entry
326    @Component
327    struct Index {
328      comProxy: common.UIServiceProxy | null = null;
329      connectCallback: common.UIServiceExtensionConnectCallback = {
330        onData: (data: Record<string, Object>) => {
331          console.info(`onData, data: ${JSON.stringify(data)}.`);
332        },
333        onDisconnect: () => {
334          console.info(`onDisconnect.`);
335        }
336      }
337
338      build() {
339        Column() {
340          Row() {
341            // 创建连接按钮
342            Button('connect ability')
343              .enabled(true)
344              .onClick(() => {
345                let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
346                let startWant: Want = {
347                  bundleName: 'com.acts.uiserviceextensionability',
348                  abilityName: 'UiServiceExtAbility',
349                };
350                try {
351                  // 连接UIServiceExtensionAbility
352                  context.connectUIServiceExtensionAbility(startWant, this.connectCallback)
353                    .then((proxy: common.UIServiceProxy) => {
354                      this.comProxy = proxy;
355                      let formData: Record<string, string> = {
356                        'test': 'test'
357                      };
358                      try {
359                        this.comProxy.sendData(formData);
360                      } catch (err) {
361                        let code = (err as BusinessError).code;
362                        let msg = (err as BusinessError).message;
363                        console.error(`sendData failed, err code: ${code}, err msg: ${msg}.`);
364                      }
365                    })
366                    .catch((err: BusinessError) => {
367                      console.error(`connectUIServiceExtensionAbility failed, err code: ${err.code}, err msg: ${err.message}.`);
368                    });
369                } catch (err) {
370                  let code = (err as BusinessError).code;
371                  let msg = (err as BusinessError).message;
372                  console.error(`connectUIServiceExtensionAbility failed, err code: ${code}, err msg: ${msg}.`);
373                }
374              })
375          }
376        }
377      }
378    }
379    ```
380
381- 服务端收发数据
382
383  服务端通过[onData()](../reference/apis-ability-kit/js-apis-app-ability-uiServiceExtensionAbility-sys.md#ondata)接收客户端传递的数据,使用保存的客户端连接服务端时传递过来的[UIServiceHostProxy](../reference/apis-ability-kit/js-apis-inner-application-uiservicehostproxy-sys.md)对象,调用[sendData()](../reference/apis-ability-kit/js-apis-inner-application-uiservicehostproxy-sys.md#senddata)将服务端数据发送给客户端。
384    ```ts
385    import { common, Want, UIServiceExtensionAbility } from '@kit.AbilityKit';
386    import { window } from '@kit.ArkUI';
387    import { BusinessError } from '@kit.BasicServicesKit';
388
389    export default class MyServiceExtAbility extends UIServiceExtensionAbility {
390      comProxy: common.UIServiceHostProxy | null = null;
391
392      // 创建
393      onCreate(want: Want) {
394        console.info('UIServiceExtensionAbility onCreate');
395      }
396
397      // 请求处理
398      onRequest(want: Want, startId: number) {
399        console.info('UIServiceExtensionAbility onRequest');
400      }
401
402      // 连接
403      onConnect(want: Want, proxy: common.UIServiceHostProxy) {
404        console.info('UIServiceExtensionAbility onConnect');
405        this.comProxy = proxy;
406      }
407
408      // 断开连接
409      onDisconnect(want: Want, proxy: common.UIServiceHostProxy) {
410        console.info('UIServiceExtensionAbility onDisconnect');
411        this.comProxy = null;
412      }
413
414      // 接收数据
415      onData(proxy: common.UIServiceHostProxy, data: Record<string, Object>) {
416        console.info('UIServiceExtensionAbility onData');
417        try {
418          let formData: Record<string, string> = {
419            'Data': 'reply message'
420          };
421          proxy.sendData(formData);
422        } catch (err) {
423          let code = (err as BusinessError).code;
424          let msg = (err as BusinessError).message;
425          console.error(`sendData failed, err code: ${code}, err msg: ${msg}.`);
426        }
427      }
428
429      onWindowWillCreate(extensionWindowConfig: window.ExtensionWindowConfig) {
430        console.info('UIServiceExtensionAbility onWindowWillCreate');
431      }
432
433      onWindowDidCreate(window: window.Window) {
434        console.info('UIServiceExtensionAbility onWindowDidCreate');
435      }
436
437      onDestroy() {
438        console.info('UIServiceExtensionAbility onDestroy');
439      }
440    }
441    ```