1# UIExtensionComponent (系统接口) 2<!--Kit: ArkUI--> 3<!--Subsystem: ArkUI--> 4<!--Owner: @dutie123--> 5<!--Designer: @lmleon--> 6<!--Tester: @fredyuan0912--> 7<!--Adviser: @HelloCrease--> 8 9UIExtensionComponent用于支持在本页面内嵌入其他应用提供的UI。展示的内容在另外一个进程中运行,本应用并不参与其中的布局和渲染。 10 11通常用于有进程隔离诉求的模块化开发场景。 12 13> **说明:** 14> 15> 该组件从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 16> 17> 本模块为系统接口。 18 19## 使用约束 20 21本组件不支持预览。 22 23被拉起的Ability必须是带UI的Ability扩展,如何实现带UI的Ability扩展请参考[实现带UI的Ability扩展](../../apis-ability-kit/js-apis-app-ability-uiExtensionAbility.md)。 24 25必须显式设置组件宽高为非0有效值。 26 27不支持滚动到边界后,传递至上层继续滚动的场景。当UIExtensionComponent组件使用方和扩展Ability都支持内容滚动时,通过手势滚动会导致UIExtensionComponent内外同时响应,包括但不限于[Scroll](ts-container-scroll.md)、[Swiper](ts-container-swiper.md)、[List](ts-container-list.md)、[Grid](ts-container-grid.md)等滚动容器。内外手势同时滚动场景的规避方法可参考[示例2](#示例2-uec内外部同时响应滚动时隔离处理)。 28 29 30## 子组件 31 32无 33 34## 接口 35 36UIExtensionComponent(want: Want, options?: UIExtensionOptions) 37 38**系统接口:** 此接口为系统接口。 39 40**系统能力:** SystemCapability.ArkUI.ArkUI.Full 41 42**参数:** 43 44| 参数名 | 类型 | 必填 | 说明 | 45| --------------------- | ---------------------------------------------------------- | ---- | ------------------ | 46| want | [Want](../../apis-ability-kit/js-apis-app-ability-want.md) | 是 | 要加载的Ability。 | 47| options<sup>11+</sup> | [UIExtensionOptions](#uiextensionoptions11) | 否 | 需要传递的构造项。 | 48 49## 属性 50 51支持[通用属性](ts-component-general-attributes.md)。 52 53## 事件 54 55不支持[点击](ts-universal-events-click.md)等通用事件。 56 57将事件经过坐标转换后传递给对端Ability处理。 58 59支持以下事件: 60 61### onRemoteReady 62 63onRemoteReady(callback: [Callback](../../apis-basic-services-kit/js-apis-base.md#callback)\<UIExtensionProxy>) 64 65UIExtensionAbility连接完成时的回调,之后可使用proxy向被拉起的Ability发送数据。 66 67**系统接口:** 此接口为系统接口。 68 69**系统能力:** SystemCapability.ArkUI.ArkUI.Full 70 71**参数:** 72 73| 参数名 | 类型 | 必填 | 说明 | 74| ---------------------------- | ------ | ------ | ------------------------------------------------------- | 75| callback | [Callback](../../apis-basic-services-kit/js-apis-base.md#callback)\<UIExtensionProxy>) | 是 | 用于向对端Ability发送数据。 | 76 77### onReceive 78 79onReceive(callback: ReceiveCallback) 80 81收到被拉起的Ability发送的数据时触发的回调。 82 83**系统接口:** 此接口为系统接口。 84 85**系统能力:** SystemCapability.ArkUI.ArkUI.Full 86 87**参数:** 88 89| 参数名 | 类型 | 必填 | 说明 | 90| ---------------------------- | ------ | ------ | ------------------------------------------------------- | 91| callback | [ReceiveCallback](#receivecallback18) | 是 | 收到来自对端Ability的数据。 | 92 93### onResult<sup>(deprecated)</sup> 94 95onResult(callback: [Callback](../../apis-basic-services-kit/js-apis-base.md#callback)\<{code: number; want?: Want}>) 96 97被拉起的Ability扩展调用terminateSelfWithResult时会先触发本回调函数,再触发OnRelease。 98 99本回调内可处理对端Ability的结果数据,可参考[AbilityResult](../../apis-ability-kit/js-apis-inner-ability-abilityResult.md)。 100 101> **说明:** 102> 从 API version 10 开始支持,从 API version 12 开始废弃,建议使用[onTerminated](#onterminated12)替代。 103 104**系统接口:** 此接口为系统接口。 105 106**系统能力:** SystemCapability.ArkUI.ArkUI.Full 107 108**参数:** 109 110| 参数名 | 类型 | 必填 |说明 | 111| ---------------------------- | ------ | ------ | ------------------------------------------------------------ | 112| code | number | 是 | 收到来自对端Ability的处理结果code。 | 113| want | Want | 否 |收到来自对端Ability的处理结果[Want](../../apis-ability-kit/js-apis-app-ability-want.md)。 | 114 115### onRelease<sup>(deprecated)</sup> 116 117onRelease(callback: [Callback](../../apis-basic-services-kit/js-apis-base.md#callback)\<number>) 118 119用于处理被拉起的Ability销毁时的回调。 120 121被拉起的Ability扩展调用terminateSelfWithResult或者terminateSelf时会触发本回调,此时releaseCode为0,即正常销毁。 122 123被拉起的Ability扩展意外Crash或被kill时,触发本回调,此时releaseCode为1。 124 125> **说明:** 126> 从 API version 10 开始支持,从 API version 12 开始废弃,建议使用[onTerminated](#onterminated12)或者[onError](#onerror)替代。 127 128**系统接口:** 此接口为系统接口。 129 130**系统能力:** SystemCapability.ArkUI.ArkUI.Full 131 132**参数:** 133 134| 参数名 | 类型 | 必填 | 说明 | 135| ---------------------------- | ------ | ------ | ------------------------------------------------------------ | 136| callback | [Callback](../../apis-basic-services-kit/js-apis-base.md#callback)\<number> | 是 |对端Ability销毁时的code,0为正常销毁,1为异常销毁。 | 137 138### onError 139 140onError(callback:[ErrorCallback](../../apis-basic-services-kit/js-apis-base.md#errorcallback)) 141 142被拉起的Ability扩展在运行过程中发生异常时触发本回调。可通过回调参数中的code、name和message获取错误信息并做处理,业务错误码详细介绍请参见[UIExtension错误码](../errorcode-uiextension.md)。 143 144**系统接口:** 此接口为系统接口。 145 146**系统能力:** SystemCapability.ArkUI.ArkUI.Full 147 148**参数:** 149 150| 参数名 | 类型 | 必填 | 说明 | 151| ---------------------------- | ------ | ------ | ------------------------------------------------------------ | 152| callback | [ErrorCallback](../../apis-basic-services-kit/js-apis-base.md#errorcallback) | 是 | 报错信息。 | 153 154### onTerminated<sup>12+</sup> 155 156onTerminated(callback: Callback<TerminationInfo>) 157 158被拉起的UIExtensionAbility通过调用`terminateSelfWithResult`或者`terminateSelf`正常退出时,触发本回调函数。 159 160**系统接口:** 此接口为系统接口。 161 162**系统能力:** SystemCapability.ArkUI.ArkUI.Full 163 164**参数:** 165 166| 参数名 | 类型 | 必填 | 说明 | 167| ------- | ------ | ------ | ------------------------------------------------------------------------------------- | 168| callback | [Callback](../../apis-basic-services-kit/js-apis-base.md#callback)\<[TerminationInfo](#terminationinfo12)> | 是 | 回调函数,入参用于接收UIExtensionAbility的返回结果,类型为[TerminationInfo](#terminationinfo12)。 | 169 170> **说明:** 171> 172> - 若UIExtensionAbility通过调用`terminateSelfWithResult`退出,其携带的信息会传给回调函数的入参。 173> - 若UIExtensionAbility通过调用`terminateSelf`退出,上述回调函数的入参中,"code"取默认值"0","want"为"undefined"。 174 175### onDrawReady<sup>18+</sup> 176 177onDrawReady(callback: Callback\<void>) 178 179被拉起的UIExtensionAbility绘制第一帧时触发本回调。 180 181**系统接口:** 此接口为系统接口。 182 183**系统能力:** SystemCapability.ArkUI.ArkUI.Full 184 185**参数:** 186 187| 参数名 | 类型 | 必填 | 说明 | 188| ---------------------------- | ------ | ------ | ------------------------------------------------------------ | 189| callback | [Callback](../../apis-basic-services-kit/js-apis-base.md#callback)\<void> | 是 | 回调函数,UIExtensionAbility绘制第一帧时触发本回调,类型为void。 | 190 191### TerminationInfo<sup>12+</sup> 192 193用于表示被拉起的UIExtensionAbility通过调用`terminateSelfWithResult`或者`terminateSelf`正常退出时的返回结果。 194 195**系统接口:** 此接口为系统接口。 196 197**系统能力:** SystemCapability.ArkUI.ArkUI.Full 198 199| 名称 | 类型 | 只读 |可选 | 说明 | 200| ------- | ------ | ------ | ------ |--------------------------------------------------- | 201| code | number | 否 | 否 | 被拉起UIExtensionAbility退出时返回的结果码,返回的结果码由`terminateSelfWithResult`或者`terminateSelf`被调用时传入的数据决定。 | 202| want | [Want](../../apis-ability-kit/js-apis-app-ability-want.md) | 否 | 是 | 被拉起UIExtensionAbility退出时返回的数据。 | 203 204## ReceiveCallback<sup>18+</sup> 205type ReceiveCallback = [Callback](../../apis-basic-services-kit/js-apis-base.md#callback)\<Record\<string, Object\>\> 206 207用于封装被拉起的Ability发送的数据。 208 209**系统接口:** 此接口为系统接口。 210 211**系统能力:** SystemCapability.ArkUI.ArkUI.Full 212 213| 类型 | 说明 | 214| ------ | --------------------------------------------------------- | 215| [Callback](../../apis-basic-services-kit/js-apis-base.md#callback)\<Record\<string, Object\>\> | 收到来自对端Ability的数据。 | 216 217## UIExtensionOptions<sup>11+</sup> 218 219用于在UIExtensionComponent进行构造的时传递可选的构造参数。 220 221**系统接口:** 此接口为系统接口。 222 223**系统能力:** SystemCapability.ArkUI.ArkUI.Full 224 225 226| 名称 | 类型 | 只读 | 可选 | 说明 | 227| ---- | ---------------------------------------- | ---- | ---- | --------------- | 228| isTransferringCaller | boolean | 否 | 是 | 在使用UIExtensionComponent嵌套时,设置当前UIExtensionComponent是否转发上一级的Caller信息。</br> 默认值:false | 229| placeholder<sup>12+</sup> | [ComponentContent](../js-apis-arkui-ComponentContent.md) | 否 | 是 | 设置占位符,在UIExtensionComponent与UIExtensionAbility建立连接前显示。 | 230| dpiFollowStrategy<sup>12+</sup> | [DpiFollowStrategy](ts-container-ui-extension-component-sys.md#dpifollowstrategy12) | 否 | 是 | 提供接口支持设置DPI跟随宿主或跟随UIExtensionAbility。</br> 默认值:FOLLOW_UI_EXTENSION_ABILITY_DPI | 231| areaChangePlaceholder<sup>14+</sup> | Record<string, [ComponentContent](../js-apis-arkui-ComponentContent.md)> | 否 | 是 | 设置尺寸变化占位符,在UIExtensionComponent尺寸发生变化并且UIExtension内部渲染未完成时显示, key值支持"FOLD_TO_EXPAND"(折叠展开尺寸变化)、"UNDEFINED"(默认尺寸变化)。 | 232| windowModeFollowStrategy<sup>18+</sup> | [WindowModeFollowStrategy](ts-container-ui-extension-component-sys.md#windowmodefollowstrategy18) | 否 | 是 | 提供接口以支持设置窗口Mode,使其能够跟随宿主或UIExtensionAbility。</br> 默认值:FOLLOW_UI_EXTENSION_ABILITY_WINDOW_MODE | 233 234## DpiFollowStrategy<sup>12+</sup> 235 236**系统接口:** 此接口为系统接口。 237 238**系统能力:** SystemCapability.ArkUI.ArkUI.Full 239 240| 名称 | 值 | 说明 | 241| ---------------------------------------- | ----|--------------- | 242| FOLLOW_HOST_DPI | 0 | 表示DPI跟随宿主。 | 243| FOLLOW_UI_EXTENSION_ABILITY_DPI | 1 | 表示DPI跟随UIExtensionAbility。 | 244 245## WindowModeFollowStrategy<sup>18+</sup> 246 247窗口Mode跟随策略,用于设置窗口Mode,使其能够跟随宿主或UIExtensionAbility。 248 249**系统接口:** 此接口为系统接口。 250 251**系统能力:** SystemCapability.ArkUI.ArkUI.Full 252 253| 名称 | 值 | 说明 | 254| ---------------------------------------- | ----|--------------- | 255| FOLLOW_HOST_WINDOW_MODE | 0 | 表示窗口Mode跟随宿主。 | 256| FOLLOW_UI_EXTENSION_ABILITY_WINDOW_MODE | 1 | 表示窗口Mode跟随UIExtensionAbility。 | 257 258## UIExtensionProxy 259 260用于在双方建立连接成功后,组件使用方向被拉起的Ability发送数据、订阅和取消订阅注册。 261 262### send 263 264send(data: Record\<string, Object\>): void 265 266用于在双方建立连接成功后,组件使用方向被拉起的Ability发送数据的场景,提供异步发送数据。 267 268**系统接口:** 此接口为系统接口。 269 270**系统能力:** SystemCapability.ArkUI.ArkUI.Full 271 272**参数:** 273 274| 参数名 | 类型 | 必填 | 说明 | 275| ---- | ---------------------------------------- | ---- | --------------- | 276| data | Record\<string, Object\> | 是 | 异步发送给被拉起的扩展Ability的数据。 | 277 278### sendSync<sup>11+</sup> 279 280sendSync(data: Record\<string, Object\>): Record\<string, Object\> 281 282用于在双方建立连接成功后,组件使用方向被拉起的Ability发送数据的场景,提供同步发送数据。 283 284**系统接口:** 此接口为系统接口。 285 286**系统能力:** SystemCapability.ArkUI.ArkUI.Full 287 288**参数:** 289 290| 参数名 | 类型 | 必填 | 说明 | 291| ---- | ---------------------------------------- | ---- | --------------- | 292| data | Record\<string, Object\> | 是 | 同步发送给被拉起的扩展Ability的数据。 | 293 294**返回值:** 295 296| 类型 | 描述 | 297| ---- | ----| 298| Record\<string, Object\> | 扩展Ability回复的数据。 | 299 300**错误码:** 301 302以下错误码的详细介绍请参见[UIExtension错误码](../errorcode-uiextension.md)。 303| 错误码ID | 错误信息 | 304| ------- | --------| 305| 100011 | No callback has been registered to respond to this request. | 306| 100012 | Transferring data failed. | 307 308### on('asyncReceiverRegister')<sup>11+</sup> 309 310on(type: 'asyncReceiverRegister', callback: Callback\<UIExtensionProxy\>): void 311 312用于在双方建立连接成功后,组件使用方订阅被拉起的Ability发生异步注册的场景。 313 314**系统接口:** 此接口为系统接口。 315 316**系统能力:** SystemCapability.ArkUI.ArkUI.Full 317 318**参数:** 319 320| 参数名 | 类型 |必填 | 说明 | 321| ------ | -------- |---- | ------- | 322| type | string | 是 | 代表订阅扩展Ability发生异步注册回调。 | 323| callback | Callback\<UIExtensionProxy\> | 是 | 订阅扩展Ability注册setReceiveDataCallback后触发的回调。 | 324 325### on('syncReceiverRegister')<sup>11+</sup> 326 327on(type: 'syncReceiverRegister', callback: Callback\<UIExtensionProxy\>): void; 328 329用于在双方建立连接成功后,组件使用方订阅被拉起的Ability发生同步注册的场景。 330 331**系统接口:** 此接口为系统接口。 332 333**系统能力:** SystemCapability.ArkUI.ArkUI.Full 334 335**参数:** 336 337| 参数名 | 类型 |必填 | 说明 | 338| ------ | -------- |---- | ------- | 339| type | string | 是 | 订阅扩展Ability发生同步注册回调。 | 340| callback | Callback\<UIExtensionProxy\> | 是 | 扩展Ability注册setReceiveDataForResultCallback后触发的回调。 | 341 342### off('asyncReceiverRegister')<sup>11+</sup> 343 344off(type: 'asyncReceiverRegister', callback?: Callback\<UIExtensionProxy\>): void 345 346用于在双方建立连接成功后,组件使用方取消订阅被拉起的Ability发生异步注册的场景。 347 348**系统接口:** 此接口为系统接口。 349 350**系统能力:** SystemCapability.ArkUI.ArkUI.Full 351 352**参数:** 353 354| 参数名 | 类型 | 必填 | 说明 | 355| ------ | -------- | ----- | ------- | 356| type | string | 是 | 取消订阅扩展Ability发生异步注册回调。 | 357| callback | Callback\<UIExtensionProxy\> | 否 | 为空代表取消订阅所有扩展Ability异步注册后触发回调。<br> 非空代表取消订阅异步对应回调。 | 358 359### off('syncReceiverRegister')<sup>11+</sup> 360 361off(type: 'syncReceiverRegister', callback?: Callback\<UIExtensionProxy\>): void 362 363用于在双方建立连接成功后,组件使用方取消订阅被拉起的Ability发生同步注册的场景。 364 365**系统接口:** 此接口为系统接口。 366 367**系统能力:** SystemCapability.ArkUI.ArkUI.Full 368 369**参数:** 370 371| 参数名 | 类型 | 必填 | 说明 | 372| ------ | -------- | ----- | ------- | 373| type | string | 是 | 取消订阅扩展Ability发生同步注册回调。 | 374| callback | Callback\<UIExtensionProxy\> | 否 | 为空代表取消订阅所有扩展Ability同步注册后触发回调<br> 非空代表取消订阅同步对应回调。 | 375 376## 示例 377 378### 示例1 (加载UIExtension) 379 380UIExtensionComponent组件使用分为使用方和提供方。本示例仅展示组件使用的方法和扩展的Ability,实际运行需在设备中安装bundleName为"com.example.newdemo",abilityName为"UIExtensionProvider"的Ability扩展。 381 382**组件使用方** 383 384使用方入口界面Index.ets内容如下: 385```ts 386import { ComponentContent } from '@kit.ArkUI'; 387 388class Params { 389} 390@Builder 391function LoadingBuilder(params: Params) { 392 Column() { 393 LoadingProgress() 394 .color(Color.Blue) 395 } 396} 397@Builder 398function AreaChangePlaceholderBuilder(params: Params) { 399 Column() { 400 } 401 .width('100%') 402 .height('100%') 403 .backgroundColor(Color.Orange) 404} 405@Entry 406@Component 407struct Second { 408 @State message1: string = 'Hello World 1'; 409 @State message2: string = 'Hello World 2'; 410 @State message3: string = 'Hello World 3'; 411 @State visible: Visibility = Visibility.Hidden; 412 @State wid: number = 300; 413 @State hei: number = 300; 414 @State windowStrategy: WindowModeFollowStrategy = WindowModeFollowStrategy.FOLLOW_UI_EXTENSION_ABILITY_WINDOW_MODE; 415 private proxy: UIExtensionProxy | null = null; 416 private initPlaceholder = new ComponentContent(this.getUIContext(), wrapBuilder(LoadingBuilder), new Params); 417 private areaChangePlaceholder = new ComponentContent(this.getUIContext(), wrapBuilder(AreaChangePlaceholderBuilder), new Params); 418 419 420 build() { 421 Row() { 422 Column() { 423 Text(this.message1).fontSize(30) 424 Text(this.message2).fontSize(30) 425 Text(this.message3).fontSize(30) 426 UIExtensionComponent({ 427 bundleName : "com.example.newdemo", 428 abilityName: "UIExtensionProvider", 429 parameters: { 430 "ability.want.params.uiExtensionType": "sys/commonUI" 431 }}, 432 { 433 placeholder: this.initPlaceholder, 434 areaChangePlaceholder: { 435 "FOLD_TO_EXPAND" : this.areaChangePlaceholder, 436 }, 437 windowModeFollowStrategy: this.windowStrategy 438 }) 439 .width(this.wid) 440 .height(this.hei) 441 .border({width: 5, color: Color.Blue}) 442 .onReceive((data) => { 443 console.info('Lee onReceive, for test'); 444 this.message3 = JSON.stringify(data['data']); 445 }) 446 .onTerminated((info) => { 447 console.info('onTerminated: code =' + info.code + ', want = ' + JSON.stringify(info.want)); 448 }) 449 .onRemoteReady((proxy) => { 450 console.info('onRemoteReady, for test'); 451 this.proxy = proxy; 452 453 this.proxy.on("syncReceiverRegister", syncRegisterCallback1); 454 455 this.proxy.on("asyncReceiverRegister", (proxy1) => { 456 console.info("on invoke for test, type is asyncReceiverRegister"); 457 }); 458 }) 459 460 Button("点击向UIExtensionAbility发送数据").onClick(() => { 461 if (this.proxy != undefined) { 462 this.proxy.send({data: "你好1"}); 463 464 try { 465 let re = this.proxy.sendSync({data: "你好2"}); 466 console.info("for test, re=" + JSON.stringify(re)); 467 } catch (err) { 468 console.error(`sendSync failed for test. errCode=${err.code}, msg=${err.message}`); 469 } 470 } 471 }) 472 } 473 .width('100%') 474 } 475 .height('100%') 476 } 477} 478 479function syncRegisterCallback1(proxy: UIExtensionProxy) { 480 console.info("on invoke for test, syncRegisterCallback1, type is syncReceiverRegister"); 481} 482 483function syncRegisterCallback2(proxy: UIExtensionProxy) { 484 console.info("on invoke for test, syncRegisterCallback2, type is syncReceiverRegister"); 485} 486``` 487**组件提供方** 488 489提供方包含三个文件需要修改 490- 提供方新增扩展入口文件/src/main/ets/uiextensionability/UIExtensionProvider.ets 491```ts 492import { UIExtensionAbility, UIExtensionContentSession, Want } from '@kit.AbilityKit'; 493 494const TAG: string = '[UIExtAbility]' 495export default class UIExtAbility extends UIExtensionAbility { 496 497 onCreate() { 498 console.info(TAG, `UIExtAbility onCreate`); 499 } 500 501 onForeground() { 502 console.info(TAG, `UIExtAbility onForeground`); 503 } 504 505 onBackground() { 506 console.info(TAG, `UIExtAbility onBackground`); 507 } 508 509 onDestroy() { 510 console.info(TAG, `UIExtAbility onDestroy`); 511 } 512 513 onSessionCreate(want: Want, session: UIExtensionContentSession) { 514 console.info(TAG, `UIExtAbility onSessionCreate, want: ${JSON.stringify(want)}`); 515 let param: Record<string, UIExtensionContentSession> = { 516 'session': session 517 }; 518 let storage: LocalStorage = new LocalStorage(param); 519 session.loadContent('pages/extension', storage); 520 } 521 522 onSessionDestroy(session: UIExtensionContentSession) { 523 console.info(TAG, `UIExtAbility onSessionDestroy`); 524 } 525} 526``` 527 528- 提供方扩展Ability入口页面文件/src/main/ets/pages/extension.ets 529```ts 530import { UIExtensionContentSession } from '@kit.AbilityKit'; 531 532let storage = new LocalStorage(); 533AppStorage.setOrCreate('message', 'UIExtensionAbility'); 534 535@Entry(storage) 536@Component 537struct Extension { 538 @StorageLink('message') storageLink: string = ''; 539 private session: UIExtensionContentSession | undefined = storage.get<UIExtensionContentSession>('session'); 540 pathStack: NavPathStack = new NavPathStack(); 541 542 @Builder 543 PageMap(name: string) { 544 if (name === "hello") { 545 pageOneTmp(); 546 } 547 } 548 549 onPageShow() { 550 if (this.session != undefined) { 551 this.session.setReceiveDataCallback((data)=> { 552 this.storageLink = JSON.stringify(data); 553 console.info("invoke for test, handle callback set by setReceiveDataCallback successfully"); 554 }) 555 556 this.session.setReceiveDataForResultCallback(func1); 557 } 558 } 559 560 build() { 561 Navigation(this.pathStack) { 562 Row() { 563 Column() { 564 Text(this.storageLink) 565 .fontSize(20) 566 .fontWeight(FontWeight.Bold) 567 Button("点击向Component发送数据").onClick(()=>{ 568 if (this.session != undefined) { 569 this.session.sendData({"data": 543321}); 570 console.info('send 543321, for test'); 571 } 572 }) 573 Button("terminate").onClick(()=> { 574 if (this.session != undefined) { 575 this.session.terminateSelf(); 576 } 577 storage.clear(); 578 }) 579 Button("terminate with result").onClick(()=>{ 580 if (this.session != undefined) { 581 this.session.terminateSelfWithResult({ 582 resultCode: 0, 583 want: { 584 bundleName: "myBundleName", 585 parameters: { "result": 123456 } 586 } 587 }); 588 } 589 storage.clear(); 590 }) 591 592 Button("点击跳转").onClick(()=> { 593 this.pathStack.pushPath({ name: "hello"}); 594 }) 595 } 596 } 597 .height('100%') 598 }.navDestination(this.PageMap) 599 .mode(NavigationMode.Stack) 600 } 601} 602 603// pageOne 604@Component 605export struct pageOneTmp { 606 pathStack: NavPathStack = new NavPathStack() 607 608 build() { 609 NavDestination() { 610 Column() { 611 Text("Hello World") 612 }.width('100%').height('100%') 613 }.title("pageOne") 614 .onBackPressed(() => { 615 const popDestinationInfo = this.pathStack.pop(); // 弹出路由栈栈顶元素 616 console.info('pop' + '返回值' + JSON.stringify(popDestinationInfo)); 617 return true; 618 }) 619 .onReady((context: NavDestinationContext) => { 620 this.pathStack = context.pathStack; 621 }) 622 } 623} 624 625function func1(data: Record<string, Object>): Record<string, Object> { 626 let linkToMsg: SubscribedAbstractProperty<string> = AppStorage.link('message'); 627 linkToMsg.set(JSON.stringify(data)); 628 console.info("invoke for test, handle callback set by setReceiveDataForResultCallback successfully"); 629 return data; 630} 631 632``` 633 634- 提供方扩展Ability, module配置文件/src/main/module.json5添加对应配置 635```json 636{ 637 "name": "UIExtensionProvider", 638 "srcEntry": "./ets/uiextensionability/UIExtensionProvider.ets", 639 "description": "1", 640 "label": "$string:EntryAbility_label", 641 "type": "sys/commonUI", 642 "exported": true, 643} 644``` 645 646### 示例2 (UEC内外部同时响应滚动时隔离处理) 647 648本示例展示了当UIExtensionComponent组件使用方和扩展的Ability同时使用[Scroll](ts-container-scroll.md)容器的场景,通过对UIExtensionComponent设置手势拦截处理,实现当UIExtensionComponent内部滚动时,外部组件不响应滚动。 649 650手势使用方式: 651组件内部滚动:手指在组件内部进行滚动操作; 652组件外部滚动:拖动外部滚动条进行滚动。 653 654实际运行时需先在设备中安装bundleName为"com.example.newdemo",abilityName为"UIExtensionProvider"的Ability扩展。 655 656提供方扩展入口文件UIExtensionProvider.ets与[示例1](#示例1-加载uiextension)扩展入口文件UIExtensionProvider.ets代码一致。 657 658提供方扩展Ability, module配置文件与[示例1](#示例1-加载uiextension)扩展module配置文件module.json5代码一致。 659 660- 使用方组件使用示例: 661```ts 662@Entry 663@Component 664struct Second { 665 @State message1: string = 'Hello World 1'; 666 @State message2: string = 'Hello World 2'; 667 @State message3: string = 'Hello World 3'; 668 @State visible: Visibility = Visibility.Hidden; 669 @State wid: number = 300; 670 @State hei: number = 300; 671 private scroller: Scroller = new Scroller(); 672 private arr: number[] = [0, 1, 2, 3, 4, 5, 6]; 673 674 build() { 675 Column() { 676 // 可滚动的容器组件 677 Scroll(this.scroller) { 678 Column() { 679 Text(this.message1).fontSize(30) 680 Text(this.message2).fontSize(30) 681 Text(this.message3).fontSize(30) 682 683 // 重复设置组件,构造滚动内容 684 ForEach(this.arr, (item: number) => { 685 UIExtensionComponent({ 686 bundleName: "com.example.newdemo", 687 abilityName: "UIExtensionProvider", 688 parameters: { 689 "ability.want.params.uiExtensionType": "sys/commonUI" 690 } 691 }) 692 .width(this.wid) 693 .height(this.hei) 694 // 设置手势拦截,UEC外部组件不响应滚动 695 .gesture(PanGesture().onActionStart(() => { 696 console.info('UIExtensionComponent PanGesture onAction'); 697 })) 698 .border({ width: 5, color: Color.Blue }) 699 .onReceive((data) => { 700 console.info('Lee onReceive, for test'); 701 this.message3 = JSON.stringify(data['data']); 702 }) 703 .onTerminated((info) => { 704 console.info('onTerminated: code =' + info.code + ', want = ' + JSON.stringify(info.want)); 705 }) 706 .onRemoteReady((proxy) => { 707 console.info('onRemoteReady, for test'); 708 }) 709 }, (item: string) => item) 710 } 711 .width('100%') 712 } 713 .scrollable(ScrollDirection.Vertical) // 滚动方向纵向 714 .scrollBar(BarState.On) // 滚动条常驻显示 715 .scrollBarColor(Color.Gray) // 滚动条颜色 716 .scrollBarWidth(10) // 滚动条宽度 717 .friction(0.6) 718 .edgeEffect(EdgeEffect.None) 719 .onWillScroll((xOffset: number, yOffset: number, scrollState: ScrollState) => { 720 console.info(xOffset + ' ' + yOffset); 721 }) 722 .onScrollEdge((side: Edge) => { 723 console.info('To the edge'); 724 }) 725 .onScrollStop(() => { 726 console.info('Scroll Stop'); 727 }) 728 } 729 .height('100%') 730 } 731} 732``` 733 734- 提供方扩展Ability入口页面文件extension.ets 735```ts 736@Entry 737@Component 738struct Extension { 739 @StorageLink('message') storageLink: string = ''; 740 private scroller: Scroller = new Scroller(); 741 private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8]; 742 743 build() { 744 Column() { 745 // 可滚动的容器组件 746 Scroll(this.scroller) { 747 Column() { 748 Text('Test demo') 749 .fontSize(20) 750 .fontWeight(FontWeight.Bold) 751 // 重复设置组件,构造滚动内容 752 ForEach(this.arr, (item: number) => { 753 Text(item.toString()) 754 .width('90%') 755 .height(150) 756 .backgroundColor(Color.Pink) 757 .borderRadius(15) 758 .fontSize(16) 759 .textAlign(TextAlign.Center) 760 .margin({ top: 10 }) 761 }, (item: string) => item) 762 } 763 } 764 765 } 766 .height('100%') 767 } 768} 769``` 770