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