• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.uiExtensionHost (系统接口)
2<!--Kit: ArkUI-->
3<!--Subsystem: Window-->
4<!--Owner: @chbchb12-->
5<!--Designer: @stupidb-->
6<!--Tester: @qinliwen0417-->
7<!--Adviser: @ge-yafang-->
8
9仅用于在有进程隔离诉求的UIExtensionComponent组件中为提供方应用提供宿主应用的窗口信息和组件本身的信息。
10
11> **说明**
12>
13> 后续此接口不再新增功能,相关功能在接口[uiExtension](js-apis-arkui-uiExtension.md)中提供。
14>
15> 从API Version 11开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
16>
17> 本模块接口为系统接口。
18
19## 导入模块
20
21```
22import { uiExtensionHost } from '@kit.ArkUI';
23```
24
25## UIExtensionHostWindowProxy
26
27### getWindowAvoidArea
28
29getWindowAvoidArea(type: window.AvoidAreaType): window.AvoidArea
30
31获取宿主应用窗口内容规避的区域;如系统栏区域、刘海屏区域、手势区域、软键盘区域等与宿主窗口内容重叠时,需要宿主窗口内容避让的区域。
32
33**系统能力**:SystemCapability.ArkUI.ArkUI.Full
34
35**系统接口**:此接口为系统接口。
36
37| 参数名 | 类型 | 必填 | 说明 |
38| -------- | -------- | -------- | -------- |
39| type | [window.AvoidAreaType](arkts-apis-window-e.md#avoidareatype7) | 是 | 表示规避区类型。 |
40
41**返回值:**
42
43| 类型 | 说明 |
44| -------- | -------- |
45| [window.AvoidArea](arkts-apis-window-i.md#avoidarea7) | 宿主窗口内容规避区域。 |
46
47**错误码:**
48
49| 错误码ID | 错误信息         |
50| -------- | ---------------- |
51| 401      | Parameter error. |
52
53**示例:**
54
55```ts
56// ExtensionProvider.ts
57
58import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
59import { window } from '@kit.ArkUI';
60
61export default class EntryAbility extends UIExtensionAbility {
62  onSessionCreate(want: Want, session: UIExtensionContentSession) {
63    const extensionHostWindow = session.getUIExtensionHostWindowProxy();
64    // 获取宿主应用窗口的避让信息
65    const avoidArea = extensionHostWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM);
66    console.log(`avoidArea: ${JSON.stringify(avoidArea)}`);
67  }
68}
69```
70
71### on('avoidAreaChange')
72
73on(type: 'avoidAreaChange', callback: Callback<{ type: window.AvoidAreaType, area: window.AvoidArea }>): void
74
75注册系统规避区变化的监听。
76
77**系统能力**:SystemCapability.ArkUI.ArkUI.Full
78
79**系统接口**:此接口为系统接口。
80
81| 参数名   | 类型   | 必填 | 说明                   |
82| -------- | ------ | ---- | ---------------------- |
83| type     | string | 是   | 监听的事件类型,固定为'avoidAreaChange',即系统规避区变化事件。 |
84| callback | [Callback](../apis-basic-services-kit/js-apis-base.md#callback)<{ type: [window.AvoidAreaType](arkts-apis-window-e.md#avoidareatype7), area: [window.AvoidArea](arkts-apis-window-i.md#avoidarea7) }> | 是 | 回调函数:入参用于接收当前规避区的信息,其中,"type"表示窗口规避区类型,"area"表示窗口内容规避区域。 |
85
86**错误码:**
87
88| 错误码ID | 错误信息                                                     |
89| -------- | ------------------------------------------------------------ |
90| 401      | Parameter error. Possible causes: <br/> 1. Mandatory parameters are left unspecified.<br/> 2. Incorrect parameters types.<br/> 3. Parameter verification failed. |
91
92**示例:**
93
94```ts
95// ExtensionProvider.ts
96import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
97
98export default class EntryAbility extends UIExtensionAbility {
99  onSessionCreate(want: Want, session: UIExtensionContentSession) {
100    const extensionHostWindow = session.getUIExtensionHostWindowProxy();
101    // 注册避让区变化的监听
102    extensionHostWindow.on('avoidAreaChange', (info) => {
103      console.info(`The avoid area of the host window is: ${JSON.stringify(info.area)}.`);
104    });
105  }
106}
107```
108
109### off('avoidAreaChange')
110
111off(type: 'avoidAreaChange', callback?: Callback<{ type: window.AvoidAreaType, area: window.AvoidArea }>): void
112
113注销系统规避区变化的监听。
114
115**系统能力**:SystemCapability.ArkUI.ArkUI.Full
116
117**系统接口**:此接口为系统接口。
118
119| 参数名   | 类型   | 必填 | 说明                   |
120| -------- | ------ | ---- | ---------------------- |
121| type     | string | 是   | 注销的事件类型,固定为'avoidAreaChange',即系统规避区变化事件。 |
122| callback | [Callback](../apis-basic-services-kit/js-apis-base.md#callback)<{ type: [window.AvoidAreaType](arkts-apis-window-e.md#avoidareatype7), area: [window.AvoidArea](arkts-apis-window-i.md#avoidarea7) }> | 否 | 回调函数:如果传入该参数,则关闭该监听。如果未传入参数,则关闭所有系统规避区变化的监听。 |
123
124**错误码:**
125
126| 错误码ID | 错误信息                                                     |
127| -------- | ------------------------------------------------------------ |
128| 401      | Parameter error. Possible causes: <br/> 1. Mandatory parameters are left unspecified.<br/> 2. Incorrect parameters types.<br/> 3. Parameter verification failed. |
129
130**示例:**
131
132```ts
133// ExtensionProvider.ts
134import { UIExtensionAbility, UIExtensionContentSession} from '@kit.AbilityKit';
135
136export default class EntryAbility extends UIExtensionAbility {
137  onSessionDestroy(session: UIExtensionContentSession) {
138    const extensionHostWindow = session.getUIExtensionHostWindowProxy();
139    // 注销所有避让区变化的监听
140    extensionHostWindow.off('avoidAreaChange');
141  }
142}
143```
144
145### on('windowSizeChange')
146
147on(type: 'windowSizeChange', callback: Callback<window.Size>): void
148
149注册宿主应用窗口尺寸变化的监听。
150
151**系统能力**:SystemCapability.ArkUI.ArkUI.Full
152
153**系统接口**:此接口为系统接口。
154
155| 参数名   | 类型                  | 必填 | 说明                   |
156| -------- | --------------------- | ---- | ---------------------- |
157| type     | string                | 是   | 监听的事件类型,固定为'windowSizeChange',即窗口尺寸变化事件。 |
158| callback | [Callback](../apis-basic-services-kit/js-apis-base.md#callback)<[window.Size](arkts-apis-window-i.md#size7)> | 是   | 回调函数:入参用于接收当前窗口的尺寸。 |
159
160**错误码:**
161
162| 错误码ID | 错误信息                                                     |
163| -------- | ------------------------------------------------------------ |
164| 401      | Parameter error. Possible causes: <br/> 1. Mandatory parameters are left unspecified.<br/> 2. Incorrect parameters types.<br/> 3. Parameter verification failed. |
165
166**示例:**
167
168```ts
169// ExtensionProvider.ts
170import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
171
172export default class EntryAbility extends UIExtensionAbility {
173  onSessionCreate(want: Want, session: UIExtensionContentSession) {
174    const extensionHostWindow = session.getUIExtensionHostWindowProxy();
175    // 注册宿主应用窗口大小变化的监听
176    extensionHostWindow.on('windowSizeChange', (size) => {
177      console.info(`The avoid area of the host window is: ${JSON.stringify(size)}.`);
178    });
179  }
180}
181```
182
183### off('windowSizeChange')
184
185off(type: 'windowSizeChange', callback?: Callback<window.Size>): void
186
187注销宿主应用窗口尺寸变化的监听。
188
189**系统能力**:SystemCapability.ArkUI.ArkUI.Full
190
191**系统接口**:此接口为系统接口。
192
193| 参数名   | 类型                  | 必填 | 说明                   |
194| -------- | --------------------- | ---- | ---------------------- |
195| type     | string                | 是   | 注销的事件类型,固定值:'windowSizeChange',即窗口尺寸变化事件。 |
196| callback | [Callback](../apis-basic-services-kit/js-apis-base.md#callback)<[window.Size](arkts-apis-window-i.md#size7)> | 否   | 回调函数:如果传入该参数,则关闭该监听。如果未传入参数,则关闭所有系统规避区变化的监听。 |
197
198**错误码:**
199
200| 错误码ID | 错误信息                                                     |
201| -------- | ------------------------------------------------------------ |
202| 401      | Parameter error. Possible causes: <br/> 1. Mandatory parameters are left unspecified.<br/> 2. Incorrect parameters types.<br/> 3. Parameter verification failed. |
203
204**示例:**
205
206```ts
207// ExtensionProvider.ts
208import { UIExtensionAbility, UIExtensionContentSession } from '@kit.AbilityKit';
209
210export default class EntryAbility extends UIExtensionAbility {
211  onSessionDestroy(session: UIExtensionContentSession) {
212    const extensionHostWindow = session.getUIExtensionHostWindowProxy();
213    // 注销宿主应用窗口大小变化的监听
214    extensionHostWindow.off('windowSizeChange');
215  }
216}
217```
218
219### properties
220
221properties: UIExtensionHostWindowProxyProperties
222
223宿主应用窗口和UIExtensionComponent组件的信息。
224
225**系统能力**:SystemCapability.ArkUI.ArkUI.Full
226
227**系统接口**:此接口为系统接口。
228
229| 参数名     | 类型                                 | 说明                             |
230| ---------- | ------------------------------------ | -------------------------------- |
231| properties | [UIExtensionHostWindowProxyProperties](#uiextensionhostwindowproxyproperties) | UIExtensionComponent组件以及宿主窗口的信息。 |
232
233**示例:**
234
235```ts
236// ExtensionProvider.ts
237import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
238
239export default class EntryAbility extends UIExtensionAbility {
240  onSessionCreate(want: Want, session: UIExtensionContentSession) {
241    const extensionHostWindow = session.getUIExtensionHostWindowProxy();
242    // 获取UIExtensionComponent位置和大小信息
243    const rect = extensionHostWindow.properties.uiExtensionHostWindowProxyRect;
244    console.log(`Rect Info: ${JSON.stringify(rect)}`);
245  }
246}
247```
248
249### hideNonSecureWindows
250
251hideNonSecureWindows(shouldHide: boolean): Promise&lt;void&gt;
252
253设置是否隐藏不安全窗口,使用Promise异步回调。
254> **说明:**
255>
256> - 不安全窗口是指可能遮挡[EmbeddedComponent](arkui-ts/ts-container-embedded-component.md)(或[UIExtensionComponent](arkui-ts/ts-container-ui-extension-component-sys.md))组件的窗口,如全局悬浮窗、宿主子窗口和宿主创建的Dialog窗口(不包括系统应用创建的上述类型窗口)。
257> - 当EmbeddedComponent(或UIExtensionComponent)组件被用来显示敏感操作提示内容时,可以选择隐藏不安全窗口,保护敏感操作提示内容不会被遮挡。当EmbeddedComponent(或UIExtensionComponent)组件不显示或销毁时,不安全窗口会重新显示。
258> - 针对PC/2in1设备,当调用hideNonSecureWindows(true)时,不安全窗口中的全局悬浮窗不会被隐藏。
259
260**需要权限**:ohos.permission.ALLOW_SHOW_NON_SECURE_WINDOWS
261
262**系统能力**:SystemCapability.ArkUI.ArkUI.Full
263
264**系统接口**:此接口为系统接口。
265
266**参数:**
267
268| 参数名      | 类型                      | 必填 | 说明       |
269| ----------- | ------------------------- | ---- | ---------- |
270| shouldHide  | boolean                   | 是   | 指示是否隐藏不安全窗口,true表示隐藏,false表示不隐藏。 |
271
272**返回值:**
273
274| 类型                | 说明                      |
275| ------------------- | ------------------------- |
276| Promise&lt;void&gt; | 无返回结果的Promise对象。 |
277
278**错误码:**
279
280| 错误码ID | 错误信息                                                     |
281| -------- | ------------------------------------------------------------ |
282| 202      | Permission verification failed. A non-system application calls a system API. |
283| 401      | Parameter error. Possible causes: <br> 1. Mandatory parameters are left unspecified. <br> 2. Incorrect parameters types. <br> 3. Parameter verification failed. |
284| 1300002  | Abnormal state. Possible causes: <br> 1. Permission denied. Interface caller does not have permission "ohos.permission.ALLOW_SHOW_NON_SECURE_WINDOWS". <br> 2. The UIExtension window proxy is abnormal. |
285| 1300003  | This window manager service works abnormally. |
286
287**示例:**
288
289```ts
290// ExtensionProvider.ts
291
292import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
293import { BusinessError } from '@kit.BasicServicesKit';
294
295export default class EntryAbility extends UIExtensionAbility {
296  onSessionCreate(want: Want, session: UIExtensionContentSession) {
297    const extensionHostWindow = session.getUIExtensionHostWindowProxy();
298    // 隐藏非安全窗口
299    extensionHostWindow.hideNonSecureWindows(true).then(()=> {
300      console.info(`Succeeded in hiding the non-secure windows.`);
301    }).catch((err: BusinessError)=> {
302      console.error(`Failed to hide the non-secure windows. Cause:${JSON.stringify(err)}`);
303    })
304  }
305  onSessionDestroy(session: UIExtensionContentSession) {
306    const extensionHostWindow = session.getUIExtensionHostWindowProxy();
307    // 取消隐藏非安全窗口
308    extensionHostWindow.hideNonSecureWindows(false).then(()=> {
309      console.info(`Succeeded in showing the non-secure windows.`);
310    }).catch((err: BusinessError)=> {
311      console.error(`Failed to show the non-secure windows. Cause:${JSON.stringify(err)}`);
312    })
313  }
314}
315```
316
317### createSubWindowWithOptions<sup>12+</sup>
318
319createSubWindowWithOptions(name: string, subWindowOptions: window.SubWindowOptions): Promise&lt;window.Window&gt;
320
321创建该UIExtensionHostWindowProxy实例下的子窗口,使用Promise异步回调。
322
323**系统能力:** SystemCapability.ArkUI.ArkUI.Full
324
325**系统接口:** 此接口为系统接口。
326
327**模型约束:** StageModelOnly
328
329**参数:**
330
331| 参数名 | 类型   | 必填 | 说明           |
332| ------ | ------ | ---- | -------------- |
333| name   | string | 是   | 子窗口的名字。 |
334| subWindowOptions | [window.SubWindowOptions](arkts-apis-window-i.md#subwindowoptions11) | 是 | 子窗口参数。 |
335
336**返回值:**
337
338| 类型                             | 说明                                             |
339| -------------------------------- | ------------------------------------------------ |
340| Promise&lt;[window.Window](arkts-apis-window-Window.md)&gt; | Promise对象。返回当前UIExtensionHostWindowProxy下创建的子窗口对象。 |
341
342**错误码:**
343
344以下错误码的详细介绍请参见[窗口错误码](errorcode-window.md)。
345
346| 错误码ID | 错误信息 |
347| ------- | ------------------------------ |
348| 401 | Parameter error. Possible causes: <br/> 1. Mandatory parameters are left unspecified.<br/> 2. Incorrect parameters types.<br/> 3. Parameter verification failed. |
349| 801 | Capability not supported. Failed to call the API due to limited device capabilities. |
350| 1300002 | This window state is abnormal. |
351
352**示例:**
353
354```ts
355// ExtensionProvider.ts
356import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
357import { BusinessError } from '@kit.BasicServicesKit';
358import { window } from '@kit.ArkUI';
359
360export default class EntryAbility extends UIExtensionAbility {
361  onSessionCreate(want: Want, session: UIExtensionContentSession) {
362    const extensionHostWindow = session.getUIExtensionHostWindowProxy();
363    const subWindowOpts: window.SubWindowOptions = {
364      title: 'This is a subwindow',
365      decorEnabled: true
366    };
367    // 创建子窗口
368    extensionHostWindow.createSubWindowWithOptions('subWindowForHost', subWindowOpts)
369      .then((subWindow: window.Window) => {
370        subWindow.setUIContent('pages/Index', (err, data) =>{
371          if (err && err.code != 0) {
372            return;
373          }
374          subWindow?.resize(300, 300, (err, data)=>{
375            if (err && err.code != 0) {
376              return;
377            }
378            subWindow?.moveWindowTo(100, 100, (err, data)=>{
379              if (err && err.code != 0) {
380                return;
381              }
382              subWindow?.showWindow((err, data) => {
383                if (err && err.code == 0) {
384                  console.info(`The subwindow has been shown!`);
385                } else {
386                  console.error(`Failed to show the subwindow!`);
387                }
388              });
389            });
390          });
391        });
392      }).catch((error: BusinessError) => {
393        console.error(`Create subwindow failed: ${JSON.stringify(error)}`);
394      })
395  }
396}
397```
398
399### setWaterMarkFlag<sup>12+</sup>
400
401setWaterMarkFlag(enable: boolean): Promise&lt;void&gt;
402
403为当前窗口添加或删除安全水印标志,使用Promise异步回调。
404> **说明:**
405>
406> 添加安全水印标志后,窗口在前台时会将当前全屏幕覆盖水印。全屏、悬浮窗、分屏等场景下只要有添加了安全水印标志的窗口在前台,就会显示全屏水印。
407
408**系统能力**:SystemCapability.ArkUI.ArkUI.Full
409
410**系统接口**:此接口为系统接口。
411
412**参数:**
413
414| 参数名 | 类型     | 必填 | 说明                                            |
415| ------ | ------- | --- | ------------------------------------------------ |
416| enable | boolean | 是   | 是否对窗口添加标志位。true表示添加,false表示删除。 |
417
418**返回值:**
419
420| 类型                | 说明                      |
421| ------------------- | ------------------------- |
422| Promise&lt;void&gt; | 无返回结果的Promise对象。 |
423
424**错误码:**
425
426| 错误码ID | 错误信息 |
427| ------- | ---------------------------------------------- |
428| 1300002 | The UIExtension window proxy is abnormal.      |
429| 1300003 | This window manager service works abnormally.  |
430| 1300008 | The display device is abnormal. |
431
432**示例:**
433
434```ts
435// ExtensionProvider.ts
436import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
437import { BusinessError } from '@kit.BasicServicesKit';
438
439export default class EntryAbility extends UIExtensionAbility {
440  onSessionCreate(want: Want, session: UIExtensionContentSession) {
441    const extensionHostWindow = session.getUIExtensionHostWindowProxy();
442    // 添加安全水印标志
443    extensionHostWindow.setWaterMarkFlag(true).then(() => {
444      console.info(`Succeeded in setting water mark flag of window.`);
445    }).catch((err: BusinessError) => {
446      console.error(`Failed to setting water mark flag of window. Cause:${JSON.stringify(err)}`);
447    })
448  }
449  onSessionDestroy(session: UIExtensionContentSession) {
450    const extensionHostWindow = session.getUIExtensionHostWindowProxy();
451    // 删除安全水印标志
452    extensionHostWindow.setWaterMarkFlag(false).then(() => {
453      console.info(`Succeeded in deleting water mark flag of window.`);
454    }).catch((err: BusinessError) => {
455      console.error(`Failed to deleting water mark flag of window. Cause:${JSON.stringify(err)}`);
456    })
457  }
458}
459```
460### hidePrivacyContentForHost<sup>13+</sup>
461
462hidePrivacyContentForHost(shouldHide: boolean): Promise&lt;void&gt;
463
464设置UIExtension组件在非系统截图时的隐私内容保护开关,使用Promise异步回调。
465> **说明:**
466>
467> 开启截图隐私内容保护后,使用窗口截图[window.snapshot](arkts-apis-window-Window.md#snapshot9)或者组件截图[UIContext.getComponentSnapshot](arkts-apis-uicontext-uicontext.md#getcomponentsnapshot12)
468将无法截取到当前组件的内容(不包括该组件下创建的子窗)。
469
470**系统能力**:SystemCapability.ArkUI.ArkUI.Full
471
472**系统接口**:此接口为系统接口。
473
474**参数:**
475
476| 参数名 | 类型     | 必填 | 说明                                            |
477| ------ | ------- | --- | ------------------------------------------------ |
478| shouldHide | boolean | 是   | 是否开启截图隐私保护。true表示开启,false表示不开启。 |
479
480**返回值:**
481
482| 类型                | 说明                      |
483| ------------------- | ------------------------- |
484| Promise&lt;void&gt; | 无返回结果的Promise对象。 |
485
486**错误码:**
487
488以下错误码的详细介绍请参见[窗口错误码](errorcode-window.md)。
489
490| 错误码ID | 错误信息                                                     |
491| -------- | ------------------------------------------------------------ |
492| 202      | Permission verification failed. A non-system application calls a system API. |
493| 401      | Parameter error. Possible causes: <br> 1. Mandatory parameters are left unspecified. <br> 2. Incorrect parameters types. <br> 3. Parameter verification failed. |
494| 1300002  | Abnormal state. Possible causes: <br> 1. The UIExtension window proxy is abnormal. <br> 2. Not the UIExtensionAbility process calling.                    |
495
496**示例:**
497
498```ts
499// ExtensionProvider.ts
500import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
501import { BusinessError } from '@kit.BasicServicesKit';
502
503export default class EntryAbility extends UIExtensionAbility {
504  onSessionCreate(want: Want, session: UIExtensionContentSession) {
505    const extensionHostWindow = session.getUIExtensionHostWindowProxy();
506    // 开启截图隐私内容保护
507    extensionHostWindow.hidePrivacyContentForHost(true).then(() => {
508      console.info(`Successfully enabled privacy protection for non-system screenshots.`);
509    }).catch((err: BusinessError) => {
510      console.error(`Failed enabled privacy protection for non-system screenshots. Cause:${JSON.stringify(err)}`);
511    })
512  }
513}
514```
515
516## UIExtensionHostWindowProxyProperties
517
518用于表示宿主应用窗口和UIExtensionComponent组件的信息。
519
520**系统能力**:SystemCapability.ArkUI.ArkUI.Full
521
522**系统接口**:此接口为系统接口。
523
524| 名称                         | 类型        | 必填      | 说明                             |
525| ------------------------------ | ----------- | -------------------------------- | -------------------------------- |
526| uiExtensionHostWindowProxyRect | [window.Rect](arkts-apis-window-i.md#rect7) | 是 | UIExtensionComponent的位置和宽高。 |
527
528## 完整示例
529
530本示例展示文档中所有API在UIExtensionAbility中的基础使用方式,示例应用需采用系统签名,且`bundleName`为"com.example.uiextensiondemo", 被拉起的`UIExtensionAbility`为"ExampleUIExtensionAbility"。
531
532- 示例应用中的EntryAbility(UIAbility)加载首页文件:`pages/Index.ets`,其中内容如下:
533
534  ```ts
535  // pages/Index.ets -- UIAbility启动时加载此页面
536  import { Want } from '@kit.AbilityKit';
537
538  @Entry
539  @Component
540  struct Index {
541    @State message: string = 'Message: ';
542    private want: Want = {
543      bundleName: "com.example.uiextensiondemo",
544      abilityName: "ExampleUIExtensionAbility",
545      parameters: {
546        "ability.want.params.uiExtensionType": "sys/commonUI"
547      }
548    }
549
550    build() {
551      Row() {
552        Column() {
553          Text(this.message).fontSize(30)
554          UIExtensionComponent(this.want)
555            .width('100%')
556            .height('90%')
557        }
558        .width('100%')
559      }
560      .height('100%')
561    }
562  }
563  ```
564
565- UIExtensionComponent拉起的UIExtensionAbility在`ets/extensionAbility/ExampleUIExtensionAbility`文件中实现,内容如下:
566
567  ```ts
568  import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
569
570  const TAG: string = '[ExampleUIExtensionAbility]';
571  export default class ExampleUIExtensionAbility extends UIExtensionAbility {
572    onCreate() {
573      console.log(TAG, `onCreate`);
574    }
575
576    onForeground() {
577      console.log(TAG, `onForeground`);
578    }
579
580    onBackground() {
581      console.log(TAG, `onBackground`);
582    }
583
584    onDestroy() {
585      console.log(TAG, `onDestroy`);
586    }
587
588    onSessionCreate(want: Want, session: UIExtensionContentSession) {
589      console.log(TAG, `onSessionCreate, want: ${JSON.stringify(want)}`);
590      let param: Record<string, UIExtensionContentSession> = {
591        'session': session
592      };
593      let storage: LocalStorage = new LocalStorage(param);
594      session.loadContent('pages/extension', storage);
595    }
596  }
597  ```
598
599- UIExtensionAbility的入口页面文件`pages/extension.ets`内容如下:
600
601  ```ts
602  import { UIExtensionContentSession } from '@kit.AbilityKit';
603  import { BusinessError } from '@kit.BasicServicesKit';
604  import { uiExtensionHost, window } from '@kit.ArkUI';
605
606  @Entry()
607  @Component
608  struct Extension {
609    @State message: string = 'UIExtensionAbility Index';
610    private storage: LocalStorage | undefined = this.getUIContext()?.getSharedLocalStorage();
611    private session: UIExtensionContentSession | undefined = this.storage?.get<UIExtensionContentSession>('session');
612    private extensionHostWindow: uiExtensionHost.UIExtensionHostWindowProxy | undefined = this.session?.getUIExtensionHostWindowProxy();
613    private subWindow: window.Window | undefined = undefined;
614
615    aboutToAppear(): void {
616      this.extensionHostWindow?.on('windowSizeChange', (size) => {
617          console.info(`size = ${JSON.stringify(size)}`);
618      });
619      this.extensionHostWindow?.on('avoidAreaChange', (info) => {
620          console.info(`type = ${JSON.stringify(info.type)}, area = ${JSON.stringify(info.area)}`);
621      });
622      let promise = this.extensionHostWindow?.hideNonSecureWindows(true);
623      promise?.then(()=> {
624        console.log(`Succeeded in hiding the non-secure windows.`);
625      }).catch((err: BusinessError)=> {
626        console.log(`Failed to hide the non-secure windows. Cause:${JSON.stringify(err)}`);
627      })
628      this.extensionHostWindow?.hidePrivacyContentForHost(true)?.then(() => {
629        console.log(`Successfully enabled privacy protection for non-system screenshots.`);
630      }).catch((err: BusinessError) => {
631        console.log(`Failed enabled privacy protection for non-system screenshots. Cause:${JSON.stringify(err)}`);
632      })
633    }
634
635    aboutToDisappear(): void {
636      this.extensionHostWindow?.off('windowSizeChange');
637      this.extensionHostWindow?.off('avoidAreaChange');
638      let promise = this.extensionHostWindow?.hideNonSecureWindows(false);
639      promise?.then(()=> {
640        console.log(`Succeeded in showing the non-secure windows.`);
641      }).catch((err: BusinessError)=> {
642        console.log(`Failed to show the non-secure windows. Cause:${JSON.stringify(err)}`);
643      })
644    }
645
646    build() {
647      Column() {
648        Text(this.message)
649          .fontSize(20)
650          .fontWeight(FontWeight.Bold)
651        Button("获取组件大小").width('90%').margin({top: 5, bottom: 5}).fontSize(16).onClick(() => {
652          let rect = this.extensionHostWindow?.properties.uiExtensionHostWindowProxyRect;
653          console.info(`UIExtensionComponent的宽高和位置信息: ${JSON.stringify(rect)}`);
654        })
655        Button("获取系统规避区信息").width('90%').margin({top: 5, bottom: 5}).fontSize(16).onClick(() => {
656          let avoidArea: window.AvoidArea | undefined = this.extensionHostWindow?.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM);
657          console.info(`系统规避区: ${JSON.stringify(avoidArea)}`);
658        })
659        Button("创建子窗口").width('90%').margin({top: 5, bottom: 5}).fontSize(16).onClick(() => {
660          let subWindowOpts: window.SubWindowOptions = {
661            'title': 'This is a subwindow',
662            decorEnabled: true
663          };
664          this.extensionHostWindow?.createSubWindowWithOptions('subWindowForHost', subWindowOpts)
665            .then((subWindow: window.Window) => {
666              this.subWindow = subWindow;
667              this.subWindow.loadContent('pages/Index', this.storage, (err, data) =>{
668                if (err && err.code != 0) {
669                  return;
670                }
671                this.subWindow?.resize(300, 300, (err, data)=>{
672                  if (err && err.code != 0) {
673                    return;
674                  }
675                  this.subWindow?.moveWindowTo(100, 100, (err, data)=>{
676                    if (err && err.code != 0) {
677                      return;
678                    }
679                    this.subWindow?.showWindow((err, data) => {
680                      if (err && err.code == 0) {
681                        console.info(`The subwindow has been shown!`);
682                      } else {
683                        console.error(`Failed to show the subwindow!`);
684                      }
685                    });
686                  });
687                });
688              });
689            }).catch((error: BusinessError) => {
690              console.error(`Create subwindow failed: ${JSON.stringify(error)}`);
691            })
692        })
693      }.width('100%').height('100%')
694    }
695  }
696  ```
697
698- 最后,示例应用的`module.json5`中的"extensionAbilities"中需要增加一项,具体内容如下:
699  ```json
700  {
701    "name": "ExampleUIExtensionAbility",
702    "srcEntry": "./ets/extensionAbility/ExampleUIExtensionAbility.ets",
703    "type": "sys/commonUI",
704  }
705  ```
706