1# 同应用进程嵌入式组件 (EmbeddedComponent) 2<!--Kit: ArkUI--> 3<!--Subsystem: ArkUI--> 4<!--Owner: @dutie123--> 5<!--Designer: @lmleon--> 6<!--Tester: @fredyuan0912--> 7<!--Adviser: @HelloCrease--> 8 9EmbeddedComponent组件允许当前页面嵌入同一应用内其他EmbeddedUIExtensionAbility供给的UI内容,这些UI运行在独立进程中,提供更高的安全性和稳定性。 10 11EmbeddedComponent组件主要用于实现跨模块、跨进程的嵌入式界面集成,其核心目标是通过模块化设计提升应用的灵活性和用户体验。 12 13开发者在使用时需注意其使用限制和生命周期管理,合理设计应用架构以最大限度地发挥其优势。 14 15## 基本概念 16 17- [EmbeddedComponent](../reference/apis-arkui/arkui-ts/ts-container-embedded-component.md)组件 18 19 EmbeddedComponent组件用于在当前页面嵌入本应用内其他EmbeddedUIExtensionAbility提供的UI。它允许开发者将应用的某些功能或界面嵌入另一个界面中,实现更灵活的用户界面设计,适用于需要进程隔离的模块化开发场景。 20 21- [EmbeddedUIExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md)组件 22 23 提供方应用中定义使用,用于实现跨进程界面嵌入功能,仅能被同应用的UIAbility拉起,并需在多进程权限的场景下使用。 24 25## 使用约束 26 27- 设备要求 28 29 EmbeddedComponent组件仅支持在拥有多进程权限的设备上使用。 30 31- 应用范围 32 33 EmbeddedComponent组件只能在UIAbility中使用,且被拉起的EmbeddedUIExtensionAbility需与UIAbility属于同一应用。 34 35- 属性限制 36 37 EmbeddedComponent组件支持[通用属性](../reference/apis-arkui/arkui-ts/ts-component-general-attributes.md),且宽高默认值和最小值均为10vp; 38 39 不支持如下与宽高相关的属性: 40 "constraintSize"、"aspectRatio"、"layoutWeight"、"flexBasis"、"flexGrow"和"flexShrink"。 41 42- 事件调用 43 44 与屏幕坐标相关的事件信息会基于EmbeddedComponent的位置宽高进行坐标转换后传递给被拉起的EmbeddedUIExtensionAbility处理。 45 46 EmbeddedComponent组件不支持[点击](../reference/apis-arkui/arkui-ts/ts-universal-events-click.md)等通用事件,仅支持[onTerminated](../reference/apis-arkui/arkui-ts/ts-container-embedded-component.md#onterminated)事件和[onError](../reference/apis-arkui/arkui-ts/ts-container-embedded-component.md#onerror)事件。 47 48## 场景示例 49 50该示例简单展示了EmbeddedComponent组件和EmbeddedUIExtensionAbility的基础使用方式。 51 52**加载项首页** 53 54加载项首页是EmbeddedComponent组件的宿主页面,负责加载和展示嵌入式UI扩展能力的内容。以下是一个完整的加载项首页实现示例: 55 56```ts 57import { Want } from '@kit.AbilityKit'; 58 59@Entry 60@Component 61struct Index { 62 @State message: string = 'Message: ' 63 private want: Want = { 64 bundleName: "com.example.embeddeddemo", 65 abilityName: "ExampleEmbeddedAbility", 66 } 67 68 build() { 69 Row() { 70 Column() { 71 Text(this.message).fontSize(30) 72 EmbeddedComponent(this.want, EmbeddedType.EMBEDDED_UI_EXTENSION) 73 .width('100%') 74 .height('90%') 75 .onTerminated((info) => { 76 // 点击extension页面内的terminateSelfWithResult按钮后触发onTerminated回调,文本框显示如下信息 77 this.message = 'Termination: code = ' + info.code + ', want = ' + JSON.stringify(info.want); 78 }) 79 .onError((error) => { 80 // 失败或异常触发onError回调,文本框显示如下报错内容 81 this.message = 'Error: code = ' + error.code; 82 }) 83 } 84 .width('100%') 85 } 86 .height('100%') 87 } 88} 89``` 90 91在ArkTS项目中,EmbeddedUIExtensionAbility的实现代码通常位于项目的ets/extensionAbility目录下。例如,ExampleEmbeddedAbility.ets文件位于./ets/extensionAbility/目录中。 92 93在实现加载项首页时,开发者需要注意以下几点: 94 95- 多进程模型检测 96 97 在应用启动时,建议检测设备是否已开启多进程模型。如果未开启,应提供明确的错误提示或引导用户开启。 98 99- 异常处理 100 101 通过[onError](../reference/apis-arkui/arkui-ts/ts-container-embedded-component.md#onerror)事件处理加载或运行嵌入式能力时可能出现的错误,提升用户体验。 102 103- 生命周期管理 104 105 了解并管理好嵌入式组件的生命周期,确保资源的正确释放和回收。 106 107- 样式配置 108 109 合理配置EmbeddedComponent组件的大小和位置,确保嵌入式界面能够以期望的尺寸和位置显示。 110 111**提供方应用生命周期实现** 112 113提供方应用是指提供嵌入式UI扩展能力的应用。以下是提供方应用生命周期实现的代码示例: 114 115```ts 116import { EmbeddedUIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit'; 117 118const TAG: string = '[ExampleEmbeddedAbility]' 119 120export default class ExampleEmbeddedAbility extends EmbeddedUIExtensionAbility { 121 onCreate() { 122 console.info(TAG, `onCreate`); 123 } 124 125 onForeground() { 126 console.info(TAG, `onForeground`); 127 } 128 129 onBackground() { 130 console.info(TAG, `onBackground`); 131 } 132 133 onDestroy() { 134 console.info(TAG, `onDestroy`); 135 } 136 137 onSessionCreate(want: Want, session: UIExtensionContentSession) { 138 console.info(TAG, `onSessionCreate, want: ${JSON.stringify(want)}`); 139 let param: Record<string, UIExtensionContentSession> = { 140 'session': session 141 }; 142 let storage: LocalStorage = new LocalStorage(param); 143 // 加载pages/extension.ets页面内容 144 session.loadContent('pages/extension', storage); 145 } 146 147 onSessionDestroy(session: UIExtensionContentSession) { 148 console.info(TAG, `onSessionDestroy`); 149 } 150} 151``` 152 153关键实现说明: 154 155- 生命周期阶段 156 157 onCreate → onForeground:组件初始化到可见的完整流程; 158 159 onBackground → onForeground:前后台切换时的状态迁移; 160 161 onDestroy:组件被宿主主动销毁时的资源回收点。 162 163- 会话管理 164 165 onSessionCreate:创建独立存储上下文并加载UI界面; 166 167 onSessionDestroy:处理会话结束时(如用户主动关闭)的清理操作。 168 169- 上下文传递 170 171 通过LocalStorage实现UIExtensionContentSession的跨组件传递; 172 173 使用loadContent方法绑定ArkTS页面与扩展能力上下文。 174 175**入口页面** 176 177以下提供方应用的入口组件实现,展示了如何使用UIExtensionContentSession会话以及如何通过按钮点击事件退出嵌入式页面并返回结果,该代码文件需要在main_pages.json配置文件中声明使用。 178 179```ts 180import { UIExtensionContentSession } from '@kit.AbilityKit'; 181 182@Entry 183@Component 184struct Extension { 185 @State message: string = 'EmbeddedUIExtensionAbility Index'; 186 private localStorage: LocalStorage|undefined = this.getUIContext().getSharedLocalStorage(); 187 private session: UIExtensionContentSession | undefined = this.localStorage.get<UIExtensionContentSession>('session'); 188 189 build() { 190 Column() { 191 Text(this.message) 192 .fontSize(20) 193 .fontWeight(FontWeight.Bold) 194 Button("terminateSelfWithResult").fontSize(20).onClick(() => { 195 // 点击按钮后调用terminateSelfWithResult退出 196 this.session?.terminateSelfWithResult({ 197 resultCode: 1, 198 want: { 199 bundleName: "com.example.embeddeddemo", 200 abilityName: "ExampleEmbeddedAbility", 201 } 202 }); 203 }) 204 }.width('100%').height('100%') 205 } 206} 207``` 208 209在实现入口页面时,开发者需要注意以下几点: 210 2111. 会话管理 212 213 正确获取并使用UIExtensionContentSession会话对象,确保与宿主应用的通信正常。 214 2152. 结果返回 216 217 通过terminateSelfWithResult方法向宿主应用返回结果时,需要指定: 218 219 - resultCode:结果代码; 220 221 - want:目标意图,指定结果的接收方。 222 2233. 页面生命周期 224 225 了解并管理好入口页面的生命周期,确保资源的正确释放和回收。 226 2274. 样式配置 228 229 合理配置页面元素的样式,确保界面显示效果符合预期。 230 231**添加配置项** 232 233 为了使嵌入式UI扩展能力正常工作,需要在应用的配置文件中进行相应的设置。 234 235 在module.json5配置文件的"extensionAbilities"标签下增加ExampleEmbeddedAbility配置,以注册ExampleEmbeddedAbility嵌入式UI扩展能力。 236 237```json 238{ 239 "name": "ExampleEmbeddedAbility", 240 "srcEntry": "./ets/extensionAbility/ExampleEmbeddedAbility.ets", 241 "type": "embeddedUI" 242} 243``` 244 245**预期效果** 246 2471. 启动应用,由于设备默认未开启多进程,会出现报错信息; 248 249  250 2512. 设备测试开启多进程后重启设备,开启多进程的hdc命令如下: 252 253 ```bash 254 hdc shell param set persist.sys.abilityms.multi_process_model true 255 ``` 256 2573. 启动应用,界面显示正常; 258 259  260 2614. 点击terminateSelfWithResult按钮,提供方内容消失,页面显示onTerminated信息。 262