1# UIServiceExtension
2
3## 概述
4
5UIServiceExtension是UIService类型的[ExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-extensionAbility.md)浮窗类组件,提供UI界面(例如预览界面)和后台服务能力。组件内部持有了一个UIServiceExtensionContext,通过UIServiceExtensionContext提供了丰富的接口供外部使用。
6
7本文描述中称被启动的UIServiceExtension为服务端,称启动UIServiceExtension的组件为客户端。
8
9应用可以通过启动和连接两种形式使用UIServiceExtension:
10- 通过[UIExtensionContext](../reference/apis-ability-kit/js-apis-inner-application-uiExtensionContext.md)调用[startUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartuiserviceextensionability14)方法启动UIServiceExtension。
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#uiabilitycontextconnectuiserviceextensionability14)方法连接UIServiceExtension。
12
13
14> **说明:**
15>
16> 1. 三方应用可以使用UIServiceExtension,不支持实现UIServiceExtension(需要系统权限)。
17>
18> 2. 三方应用需要在前台获焦的情况下才能连接系统提供的UIServiceExtension。
19>
20> 3. UIServiceExtension的生命周期与绑定的窗口强关联,窗口销毁后UIServiceExtension也一起销毁。
21
22
23## 启动UIServiceExtension
24
25应用通过[startUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartuiserviceextensionability14)方法启动一个UIServiceExtension。UIServiceExtension启动后,其生命周期独立于客户端,即使客户端已经销毁,该后台服务仍可继续运行,窗口创建失败或销毁后该服务会被销毁。
26
27
28示例中的context的获取方式请参见[获取UIAbility的上下文信息](uiability-usage.md#获取uiability的上下文信息)。
29
30```ts
31import { common, Want } from '@kit.AbilityKit';
32import { BusinessError } from '@kit.BasicServicesKit';
33
34@Entry
35@Component
36struct Index {
37  build() {
38    Column() {
39      Row() {
40        // 创建启动按钮
41        Button('start ability')
42          .enabled(true)
43          .onClick(() => {
44            let context = getContext(this) as common.UIAbilityContext;
45            let startWant: Want = {
46              bundleName: 'com.acts.uiserviceextensionability',
47              abilityName: 'UiServiceExtAbility',
48            };
49            try {
50              // 启动UIServiceExtensionAbility
51              context.startUIServiceExtensionAbility(startWant).then(() => {
52                console.log('startUIServiceExtensionAbility success');
53              }).catch((error: BusinessError) => {
54                console.log('startUIServiceExtensionAbility error', JSON.stringify(error));
55              })
56            } catch (err) {
57              console.log('startUIServiceExtensionAbility failed', JSON.stringify(err));
58            }
59          })
60      }
61    }
62  }
63}
64```
65
66## 客户端连接服务端
67
68  客户端通过[connectUIServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextconnectuiserviceextensionability14)连接服务端,获取并保存[UIServiceProxy](../reference/apis-ability-kit/js-apis-inner-application-uiserviceproxy.md)对象。通过该proxy对象的[sendData()](../reference/apis-ability-kit/js-apis-inner-application-uiserviceproxy.md#uiserviceproxysenddata)方法发送数据给服务端。服务端通过UIServiceExtensionAbility类onData()(系统接口)方法接收客户端数据。
69
70
71```ts
72import { common, Want } from '@kit.AbilityKit';
73import { BusinessError } from '@kit.BasicServicesKit';
74
75@Entry
76@Component
77struct Index {
78  comProxy: common.UIServiceProxy | null = null;
79  connectCallback : common.UIServiceExtensionConnectCallback = {
80    onData:(data: Record<string, Object>) => {
81      console.log("received data", JSON.stringify(data));
82    },
83    onDisconnect:() => {
84      console.log("onDisconnect ");
85    }
86  }
87
88  build() {
89    Column() {
90      Row() {
91        // 创建连接按钮
92        Button("connect ability")
93          .enabled(true)
94          .onClick(() => {
95            let context = getContext(this) as common.UIAbilityContext;
96            let startWant:Want = {
97              bundleName: 'com.acts.uiserviceextensionability',
98              abilityName: 'UiServiceExtAbility',
99            };
100            try {
101            // 连接UIServiceExtensionAbility
102            context.connectUIServiceExtensionAbility(startWant, this.connectCallback).then((proxy: common.UIServiceProxy) => {
103                this.comProxy = proxy;
104                let formData: Record<string, string> = {
105                  'test': 'test'
106                };
107                try {
108                  this.comProxy.sendData(formData);
109                } catch (err) {
110                  console.log('sendData failed', JSON.stringify(err));
111                };
112              }).catch((err: BusinessError) => {
113                console.log("connectUIServiceExtensionAbility failed", JSON.stringify(err));
114              });
115            } catch(err) {
116              console.log("connectUIServiceExtensionAbility failed", JSON.stringify(err));
117            };
118      })
119      }
120  }
121}
122}
123```