1# EmbeddedComponent
2
3EmbeddedComponent用于支持在当前页面嵌入本应用内其他[EmbeddedUIExtensionAbility](../../apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md)提供的UI。EmbeddedUIExtensionAbility在独立进程中运行,完成页面布局和渲染。
4
5通常用于有进程隔离诉求的模块化开发场景。
6
7> **说明:**
8>
9> 该组件从API Version 12开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
10
11## 使用约束
12
13EmbeddedComponent仅支持在拥有多进程权限的设备上使用。
14
15EmbeddedComponent只能在UIAbility中使用,且被拉起的EmbeddedUIExtensionAbility需与UIAbility属于同一应用。
16
17## 子组件
18
1920
21## 接口
22
23EmbeddedComponent(loader: Want, type: EmbeddedType)
24
25**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
26
27**参数:**
28
29| 参数名                | 参数类型                                                   | 必填 | 参数描述                             |
30| --------------------- | ---------------------------------------------------------- | ---- | ------------------------------------ |
31| loader                | [Want](../../apis-ability-kit/js-apis-app-ability-want.md) | 是   | 要加载的EmbeddedUIExtensionAbility。 |
32| type                  | [EmbeddedType](ts-appendix-enums.md#embeddedtype)                              | 是   | 提供方的类型。                       |
33
34## 属性
35
36支持[通用属性](ts-universal-attributes-size.md)。
37
38> **说明:**
39>
40> EmbeddedComponent组件宽高默认值和最小值均为10vp, 不支持如下与宽高相关的属性:"constraintSize"、"aspectRatio"、"layoutWeight"、"flexBasis"、"flexGrow"和"flexShrink"。
41
42## 事件
43
44与屏幕坐标相关的事件信息会基于EmbeddedComponent的位置宽高进行坐标转换后传递给被拉起的EmbeddedUIExtensionAbility处理。
45
46不支持[点击](ts-universal-events-click.md)等通用事件。仅支持以下事件:
47
48### onTerminated
49
50onTerminated(callback: Callback<TerminationInfo>)
51
52被拉起的EmbeddedUIExtensionAbility通过调用`terminateSelfWithResult`或者`terminateSelf`正常退出时,触发本回调函数。
53
54**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
55
56**参数:**
57
58| 参数名   | 类型   | 说明                                                                                     |
59| -------  | ------ | ---------------------------------------------------------------------------------------- |
60| callback | [Callback](../../apis-basic-services-kit/js-apis-base.md#callback)\<[TerminationInfo](#terminationinfo)> | 回调函数,入参用于接收EmbeddedUIExtensionAbility的返回结果,类型为[TerminationInfo](#terminationinfo)。 |
61
62> **说明:**
63>
64> - 若EmbeddedUIExtensionAbility通过调用`terminateSelfWithResult`退出,其携带的信息会传给回调函数的入参;
65> - 若EmbeddedUIExtensionAbility通过调用`terminateSelf`退出,上述回调函数的入参中,"code"取默认值"0","want"为"undefined"。
66
67### onError
68
69onError(callback: ErrorCallback)
70
71被拉起的EmbeddedUIExtensionAbility在运行过程中发生异常时触发本回调。
72
73**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
74
75**参数:**
76
77| 参数名 | 类型                                                                         | 说明      |
78| ------ | ---------------------------------------------------------------------------- | --------- |
79| callback    | [ErrorCallback](../../apis-basic-services-kit/js-apis-base.md#errorcallback) | 回调函数,入参用于接收异常信息,类型为[BusinessError](../../apis-basic-services-kit/js-apis-base.md#businesserror),可通过参数中的`code`、`name`和`message`获取错误信息并做处理。 |
80
81> **说明:**
82>
83> 如下情形会触发本回调:
84> - 通知提供方拉起EmbeddedUIExtensionAbility失败。
85> - 通知提供方EmbeddedUIExtensionAbility切后台失败。
86> - 通知提供方销毁EmbeddedUIExtensionAbility失败。
87> - 提供方EmbeddedUIExtensionAbility异常退出。
88> - 在EmbeddedUIExtensionAbility中嵌套使用EmbeddedComponent。
89
90## TerminationInfo
91
92用于表示被拉起的EmbeddedUIExtensionAbility的返回结果。
93
94**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
95
96| 属性名  | 类型   | 说明                                                 |
97| ------- | ------ | ---------------------------------------------------  |
98| code    | number | 被拉起EmbeddedUIExtensionAbility退出时返回的结果码。 |
99| want    | [Want](../../apis-ability-kit/js-apis-app-ability-want.md)   | 被拉起EmbeddedUIExtensionAbility退出时返回的数据。   |
100
101## 示例
102
103本示例展示EmbeddedComponent组件和EmbeddedUIExtensionAbility的基础使用方式,示例应用的`bundleName`为"com.example.embeddeddemo", 被拉起的`EmbeddedUIExtensionAbility`为"ExampleEmbeddedAbility".
104
105- 示例应用中的EntryAbility(UIAbility)加载首页文件:`pages/Index.ets`,其中内容如下:
106
107  ```ts
108  // pages/Index.ets -- UIAbility启动时加载此页面
109  import { Want } from '@kit.AbilityKit';
110
111  @Entry
112  @Component
113  struct Index {
114    @State message: string = 'Message: '
115    private want: Want = {
116      bundleName: "com.example.embeddeddemo",
117      abilityName: "ExampleEmbeddedAbility",
118    }
119
120    build() {
121      Row() {
122        Column() {
123          Text(this.message).fontSize(30)
124          EmbeddedComponent(this.want, EmbeddedType.EMBEDDED_UI_EXTENSION)
125            .width('100%')
126            .height('90%')
127            .onTerminated((info)=>{
128              this.message = 'Termination: code = ' + info.code + ', want = ' + JSON.stringify(info.want);
129            })
130            .onError((error)=>{
131              this.message = 'Error: code = ' + error.code;
132            })
133        }
134        .width('100%')
135      }
136      .height('100%')
137    }
138  }
139  ```
140
141- EmbeddedComponent拉起的EmbeddedUIExtensionAbility在`ets/extensionAbility/ExampleEmbeddedAbility`文件中实现,内容如下:
142
143  ```ts
144  import { EmbeddedUIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit';
145
146  const TAG: string = '[ExampleEmbeddedAbility]'
147  export default class ExampleEmbeddedAbility extends EmbeddedUIExtensionAbility {
148    
149    onCreate() {
150      console.log(TAG, `onCreate`);
151    }
152
153    onForeground() {
154      console.log(TAG, `onForeground`);
155    }
156
157    onBackground() {
158      console.log(TAG, `onBackground`);
159    }
160
161    onDestroy() {
162      console.log(TAG, `onDestroy`);
163    }
164
165    onSessionCreate(want: Want, session: UIExtensionContentSession) {
166      console.log(TAG, `onSessionCreate, want: ${JSON.stringify(want)}`);
167      let param: Record<string, UIExtensionContentSession> = {
168        'session': session
169      };
170      let storage: LocalStorage = new LocalStorage(param);
171      session.loadContent('pages/extension', storage);
172    }
173
174    onSessionDestroy(session: UIExtensionContentSession) {
175      console.log(TAG, `onSessionDestroy`);
176    }
177  }
178  ```
179
180- EmbeddedUIExtensionAbility的入口页面文件`pages/extension.ets`内容如下:
181
182  ```ts
183  import { UIExtensionContentSession } from '@kit.AbilityKit';
184
185  let storage = LocalStorage.getShared()
186
187  @Entry(storage)
188  @Component
189  struct Extension {
190    @State message: string = 'EmbeddedUIExtensionAbility Index';
191    private session: UIExtensionContentSession | undefined = storage.get<UIExtensionContentSession>('session');
192
193    build() {
194      Column() {
195        Text(this.message)
196          .fontSize(20)
197          .fontWeight(FontWeight.Bold)
198        Button("terminateSelfWithResult").fontSize(20).onClick(() => {
199          this.session?.terminateSelfWithResult({
200            resultCode: 1,
201            want: {
202              bundleName: "com.example.embeddeddemo",
203              abilityName: "ExampleEmbeddedAbility",
204            }});
205        })
206      }.width('100%').height('100%')
207    }
208  }
209  ```
210
211- 最后,示例应用的`module.json5`中的"extensionAbilities"中需要增加一项,具体内容如下:
212  ```json
213  {
214    "name": "ExampleEmbeddedAbility",
215    "srcEntry": "./ets/extensionAbility/ExampleEmbeddedAbility.ets",
216    "type": "embeddedUI"
217  }
218  ```
219