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 &gt; Directory”,新建一个目录并命名为EmbeddedUIExtAbility。
35e41f4b71Sopenharmony_ci
36e41f4b71Sopenharmony_ci2. 在EmbeddedUIExtAbility目录,右键选择“New &gt; File”,新建一个.ets文件并命名为EmbeddedUIExtAbility.ets37e41f4b71Sopenharmony_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.hostSpecifiedohos.extension.processMode.hostInstance131e41f4b71Sopenharmony_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.hostSpecifiedohos.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