1e41f4b71Sopenharmony_ci# EmbeddedUIExtensionAbility 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci## 概述 4e41f4b71Sopenharmony_ci 5e41f4b71Sopenharmony_ci[EmbeddedUIExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md)是EMBEDDED_UI类型的[ExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-extensionAbility.md)组件,提供了跨进程界面嵌入的能力。 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ciEmbeddedUIExtensionAbility需要和[EmbeddedComponent](../reference/apis-arkui/arkui-ts/ts-container-embedded-component.md)一起配合使用,开发者可以在[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)的页面中通过EmbeddedComponent嵌入本应用的EmbeddedUIExtensionAbility提供的UI。EmbeddedUIExtensionAbility会在独立于UIAbility的进程中运行,完成其页面的布局和渲染。通常用于有进程隔离诉求的模块化开发场景。 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci> **说明:** 10e41f4b71Sopenharmony_ci> 11e41f4b71Sopenharmony_ci> 1. 当前EmbeddedUIExtensionAbility和EmbeddedComponent仅支持在拥有多进程配置的设备上使用。 12e41f4b71Sopenharmony_ci> 2. EmbeddedComponent只能在UIAbility中使用,且被拉起的EmbeddedUIExtensionAbility需与UIAbility属于同一应用。<!--Del--> 13e41f4b71Sopenharmony_ci> 3. 当前提供的EmbeddedUIExtensionAbility支持多实例场景,并且继承了UIExtensionAbility的进程模型,UIExtensionAbility的多实例及进程配置相关介绍可参见[UIExtensionAbility](uiextensionability.md)。<!--DelEnd--> 14e41f4b71Sopenharmony_ci 15e41f4b71Sopenharmony_ciEmbeddedUIExtensionAbility通过[UIExtensionContext](../reference/apis-ability-kit/js-apis-inner-application-uiExtensionContext.md)和[UIExtensionContentSession](../reference/apis-ability-kit/js-apis-app-ability-uiExtensionContentSession.md)提供相关能力。本文描述中称被启动的EmbeddedUIExtensionAbility为提供方,称启动EmbeddedUIExtensionAbility的EmbeddedComponent组件为使用方。 16e41f4b71Sopenharmony_ci 17e41f4b71Sopenharmony_ci## 开发EmbeddedUIExtensionAbility提供方 18e41f4b71Sopenharmony_ci 19e41f4b71Sopenharmony_ci### 生命周期 20e41f4b71Sopenharmony_ci 21e41f4b71Sopenharmony_ci[EmbeddedUIExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md)提供了[onCreate](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md#embeddeduiextensionabilityoncreate)、[onSessionCreate](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md#embeddeduiextensionabilityonsessioncreate)、[onSessionDestroy](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md#embeddeduiextensionabilityonsessiondestroy)、[onForeground](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md#embeddeduiextensionabilityonforeground)、[onBackground](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md#embeddeduiextensionabilityonbackground)和[onDestroy](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md#embeddeduiextensionabilityondestroy)生命周期回调,根据需要重写对应的回调方法。 22e41f4b71Sopenharmony_ci 23e41f4b71Sopenharmony_ci- **onCreate**:当EmbeddedUIExtensionAbility创建时回调,执行初始化业务逻辑操作。 24e41f4b71Sopenharmony_ci- **onSessionCreate**:当EmbeddedUIExtensionAbility界面内容对象创建后调用。 25e41f4b71Sopenharmony_ci- **onSessionDestroy**:当EmbeddedUIExtensionAbility界面内容对象销毁后调用。 26e41f4b71Sopenharmony_ci- **onForeground**:当EmbeddedUIExtensionAbility从后台转到前台时触发。 27e41f4b71Sopenharmony_ci- **onBackground**:当EmbeddedUIExtensionAbility从前台转到后台时触发。 28e41f4b71Sopenharmony_ci- **onDestroy**:当EmbeddedUIExtensionAbility销毁时回调,可以执行资源清理等操作。 29e41f4b71Sopenharmony_ci 30e41f4b71Sopenharmony_ci### 开发步骤 31e41f4b71Sopenharmony_ci 32e41f4b71Sopenharmony_ci开发者在实现一个[EmbeddedUIExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md)提供方时,需要在DevEco Studio工程中手动新建一个EmbeddedUIExtensionAbility,具体步骤如下。 33e41f4b71Sopenharmony_ci 34e41f4b71Sopenharmony_ci1. 在工程Module对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为EmbeddedUIExtAbility。 35e41f4b71Sopenharmony_ci 36e41f4b71Sopenharmony_ci2. 在EmbeddedUIExtAbility目录,右键选择“New > File”,新建一个.ets文件并命名为EmbeddedUIExtAbility.ets。 37e41f4b71Sopenharmony_ci 38e41f4b71Sopenharmony_ci3. 打开EmbeddedUIExtAbility.ets文件,导入EmbeddedUIExtensionAbility的依赖包,自定义类继承EmbeddedUIExtensionAbility并实现[onCreate](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md#embeddeduiextensionabilityoncreate)、[onSessionCreate](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md#embeddeduiextensionabilityonsessioncreate)、[onSessionDestroy](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md#embeddeduiextensionabilityonsessiondestroy)、[onForeground](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md#embeddeduiextensionabilityonforeground)、[onBackground](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md#embeddeduiextensionabilityonbackground)和[onDestroy](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md#embeddeduiextensionabilityondestroy)生命周期回调。 39e41f4b71Sopenharmony_ci 40e41f4b71Sopenharmony_ci ```ts 41e41f4b71Sopenharmony_ci import { EmbeddedUIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit'; 42e41f4b71Sopenharmony_ci 43e41f4b71Sopenharmony_ci const TAG: string = '[ExampleEmbeddedAbility]' 44e41f4b71Sopenharmony_ci 45e41f4b71Sopenharmony_ci export default class ExampleEmbeddedAbility extends EmbeddedUIExtensionAbility { 46e41f4b71Sopenharmony_ci onCreate() { 47e41f4b71Sopenharmony_ci console.log(TAG, `onCreate`); 48e41f4b71Sopenharmony_ci } 49e41f4b71Sopenharmony_ci 50e41f4b71Sopenharmony_ci onForeground() { 51e41f4b71Sopenharmony_ci console.log(TAG, `onForeground`); 52e41f4b71Sopenharmony_ci } 53e41f4b71Sopenharmony_ci 54e41f4b71Sopenharmony_ci onBackground() { 55e41f4b71Sopenharmony_ci console.log(TAG, `onBackground`); 56e41f4b71Sopenharmony_ci } 57e41f4b71Sopenharmony_ci 58e41f4b71Sopenharmony_ci onDestroy() { 59e41f4b71Sopenharmony_ci console.log(TAG, `onDestroy`); 60e41f4b71Sopenharmony_ci } 61e41f4b71Sopenharmony_ci 62e41f4b71Sopenharmony_ci onSessionCreate(want: Want, session: UIExtensionContentSession) { 63e41f4b71Sopenharmony_ci console.log(TAG, `onSessionCreate, want: ${JSON.stringify(want)}`); 64e41f4b71Sopenharmony_ci let param: Record<string, UIExtensionContentSession> = { 65e41f4b71Sopenharmony_ci 'session': session 66e41f4b71Sopenharmony_ci }; 67e41f4b71Sopenharmony_ci let storage: LocalStorage = new LocalStorage(param); 68e41f4b71Sopenharmony_ci session.loadContent('pages/extension', storage); 69e41f4b71Sopenharmony_ci } 70e41f4b71Sopenharmony_ci 71e41f4b71Sopenharmony_ci onSessionDestroy(session: UIExtensionContentSession) { 72e41f4b71Sopenharmony_ci console.log(TAG, `onSessionDestroy`); 73e41f4b71Sopenharmony_ci } 74e41f4b71Sopenharmony_ci } 75e41f4b71Sopenharmony_ci ``` 76e41f4b71Sopenharmony_ci 77e41f4b71Sopenharmony_ci4. EmbeddedUIExtensionAbility的[onSessionDestroy](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md#embeddeduiextensionabilityonsessiondestroy)中加载了入口页面文件pages/extension.ets内容如下: 78e41f4b71Sopenharmony_ci 79e41f4b71Sopenharmony_ci ```ts 80e41f4b71Sopenharmony_ci import { UIExtensionContentSession } from '@kit.AbilityKit'; 81e41f4b71Sopenharmony_ci 82e41f4b71Sopenharmony_ci let storage = LocalStorage.getShared() 83e41f4b71Sopenharmony_ci 84e41f4b71Sopenharmony_ci @Entry(storage) 85e41f4b71Sopenharmony_ci @Component 86e41f4b71Sopenharmony_ci struct Extension { 87e41f4b71Sopenharmony_ci @State message: string = 'EmbeddedUIExtensionAbility Index'; 88e41f4b71Sopenharmony_ci private session: UIExtensionContentSession | undefined = storage.get<UIExtensionContentSession>('session'); 89e41f4b71Sopenharmony_ci 90e41f4b71Sopenharmony_ci build() { 91e41f4b71Sopenharmony_ci Column() { 92e41f4b71Sopenharmony_ci Text(this.message) 93e41f4b71Sopenharmony_ci .fontSize(20) 94e41f4b71Sopenharmony_ci .fontWeight(FontWeight.Bold) 95e41f4b71Sopenharmony_ci Button("terminateSelfWithResult").fontSize(20).onClick(() => { 96e41f4b71Sopenharmony_ci this.session?.terminateSelfWithResult({ 97e41f4b71Sopenharmony_ci resultCode: 1, 98e41f4b71Sopenharmony_ci want: { 99e41f4b71Sopenharmony_ci bundleName: "com.example.embeddeddemo", 100e41f4b71Sopenharmony_ci abilityName: "ExampleEmbeddedAbility", 101e41f4b71Sopenharmony_ci }}); 102e41f4b71Sopenharmony_ci }) 103e41f4b71Sopenharmony_ci }.width('100%').height('100%') 104e41f4b71Sopenharmony_ci } 105e41f4b71Sopenharmony_ci } 106e41f4b71Sopenharmony_ci ``` 107e41f4b71Sopenharmony_ci 108e41f4b71Sopenharmony_ci5. 在工程Module对应的[module.json5配置文件](../quick-start/module-configuration-file.md)中注册EmbeddedUIExtensionAbility,type标签需要设置为“embeddedUI”,srcEntry标签表示当前EmbeddedUIExtensionAbility组件所对应的代码路径。 109e41f4b71Sopenharmony_ci 110e41f4b71Sopenharmony_ci ```json 111e41f4b71Sopenharmony_ci { 112e41f4b71Sopenharmony_ci "module": { 113e41f4b71Sopenharmony_ci "extensionAbilities": [ 114e41f4b71Sopenharmony_ci { 115e41f4b71Sopenharmony_ci "name": "EmbeddedUIExtAbility", 116e41f4b71Sopenharmony_ci "icon": "$media:icon", 117e41f4b71Sopenharmony_ci "description": "EmbeddedUIExtAbility", 118e41f4b71Sopenharmony_ci "type": "embeddedUI", 119e41f4b71Sopenharmony_ci "srcEntry": "./ets/EmbeddedUIExtAbility/EmbeddedUIExtAbility.ets" 120e41f4b71Sopenharmony_ci }, 121e41f4b71Sopenharmony_ci ] 122e41f4b71Sopenharmony_ci } 123e41f4b71Sopenharmony_ci } 124e41f4b71Sopenharmony_ci ``` 125e41f4b71Sopenharmony_ci 126e41f4b71Sopenharmony_ci 127e41f4b71Sopenharmony_ci 128e41f4b71Sopenharmony_ci## 开发EmbeddedUIExtensionAbility使用方 129e41f4b71Sopenharmony_ci 130e41f4b71Sopenharmony_ci开发者可以在[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)的页面中通过[EmbeddedComponent](../reference/apis-arkui/arkui-ts/ts-container-embedded-component.md)容器加载自己应用内的[EmbeddedUIExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-embeddedUIExtensionAbility.md)。此外,EmbeddedUIExtensionAbility在[want](../reference/apis-ability-kit/js-apis-app-ability-want.md).parameters中新增了两个字段ohos.extension.processMode.hostSpecified和ohos.extension.processMode.hostInstance。 131e41f4b71Sopenharmony_ci- ohos.extension.processMode.hostSpecified控制非首次启动的EmbeddedUIExtensionAbility是否运行在同[UIExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-uiExtensionAbility.md)的进程中,参数是进程名称。例如,"ohos.extension.processMode.hostSpecified": "com.ohos.inentexecutedemo:share"。 132e41f4b71Sopenharmony_ci- ohos.extension.processMode.hostInstance控制启动的EmbeddedUIExtensionAbility是否按照独立进程启动,传入false时,按照UIExtensionAbility的进程模型启动,入参true的时候,不管被拉起的UIExtensionAbility配置的是什么进程模型,都会新增一个进程,例如,"ohos.extension.processMode.hostInstance": "true"。 133e41f4b71Sopenharmony_ci 134e41f4b71Sopenharmony_ciohos.extension.processMode.hostSpecified和ohos.extension.processMode.hostInstance同时配置时,hostSpecified优先,会运行在指定的进程中。 135e41f4b71Sopenharmony_ci如在首页文件:pages/Index.ets中添加如下内容: 136e41f4b71Sopenharmony_ci```ts 137e41f4b71Sopenharmony_ciimport { Want } from '@kit.AbilityKit'; 138e41f4b71Sopenharmony_ciimport { BusinessError } from '@kit.BasicServicesKit'; 139e41f4b71Sopenharmony_ci 140e41f4b71Sopenharmony_ci@Entry 141e41f4b71Sopenharmony_ci@Component 142e41f4b71Sopenharmony_cistruct Index { 143e41f4b71Sopenharmony_ci @State message: string = 'Message: ' 144e41f4b71Sopenharmony_ci private want: Want = { 145e41f4b71Sopenharmony_ci bundleName: "com.example.embeddeddemo", 146e41f4b71Sopenharmony_ci abilityName: "EmbeddedUIExtAbility", 147e41f4b71Sopenharmony_ci parameters: { 148e41f4b71Sopenharmony_ci 'ohos.extension.processMode.hostInstance': 'true' 149e41f4b71Sopenharmony_ci } 150e41f4b71Sopenharmony_ci } 151e41f4b71Sopenharmony_ci 152e41f4b71Sopenharmony_ci build() { 153e41f4b71Sopenharmony_ci Row() { 154e41f4b71Sopenharmony_ci Column() { 155e41f4b71Sopenharmony_ci Text(this.message).fontSize(30) 156e41f4b71Sopenharmony_ci EmbeddedComponent(this.want, EmbeddedType.EMBEDDED_UI_EXTENSION) 157e41f4b71Sopenharmony_ci .width('100%') 158e41f4b71Sopenharmony_ci .height('90%') 159e41f4b71Sopenharmony_ci .onTerminated((info: TerminationInfo) => { 160e41f4b71Sopenharmony_ci this.message = 'Terminarion: code = ' + info.code + ', want = ' + JSON.stringify(info.want); 161e41f4b71Sopenharmony_ci }) 162e41f4b71Sopenharmony_ci .onError((error: BusinessError) => { 163e41f4b71Sopenharmony_ci this.message = 'Error: code = ' + error.code; 164e41f4b71Sopenharmony_ci }) 165e41f4b71Sopenharmony_ci } 166e41f4b71Sopenharmony_ci .width('100%') 167e41f4b71Sopenharmony_ci } 168e41f4b71Sopenharmony_ci .height('100%') 169e41f4b71Sopenharmony_ci } 170e41f4b71Sopenharmony_ci} 171e41f4b71Sopenharmony_ci``` 172