元服务要支持被应用嵌入式运行,必须使用EmbeddableUIAbility进行开发。EmbeddableUIAbility既支持被嵌入式运行,又支持被跳出式运行;普通的UIAbility只支持被跳出式运行。嵌入式运行元服务和跳出式运行元服务的主要区别请参考下表:
跳转模式 | 体验对比 | 总结 |
嵌入式运行元服务 |
| 嵌入式运行元服务相比较跳出式运行元服务有更沉浸式、更友好的使用体验 |
跳出式运行元服务 |
|
export default class AtomicServiceAbility extends EmbeddableUIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); } }
通过want的wantConstant.Params.SHOW_MODE_KEY参数判断元服务是否为嵌入式运行,want.parameters[wantConstant.Params.SHOW_MODE_KEY]的值为wantConstant.ShowMode.EMBEDDED_FULL表示元服务是被全屏嵌入式运行。
export default class AtomicServiceAbility extends EmbeddableUIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); if (want.parameters) { hilog.debug(0x0000, 'testTag', '%{public}s', 'Ability onCreate:' + want.parameters[wantConstant.Params.SHOW_MODE_KEY]) } } }
import { FullScreenLaunchComponent } from '@ohos.arkui.advanced.FullScreenLaunchComponent'; import { common } from '@kit.AbilityKit'; @Entry @Component struct Index { pageStack: NavPathStack = new NavPathStack(); private context = getContext(this) as common.UIAbilityContext; appId = '5765880207854520769' build() { Navigation(this.pageStack) { Column() { FullScreenLaunchComponent({ content: ColumChild, appId: this.appId, options: {} }) .margin({ top: 20 }) Button('跳出式运行元服务').onClick(() => { this.context.openAtomicService(this.appId) }) .margin({ top: 20 }) } } .title('可分可合应用') } } @Builder function ColumChild() { Column() { Button('嵌入式运行元服务') } }
在应用的页面增加参数传递:
FullScreenLaunchComponent({ content: ColumChildHsp, appId: this.hspAppId, options: { parameters: { page: 'SubPkgPageOneHsp', } } }) .margin({ top: 20 })
在元服务的EmbeddableUIAbility的onCreate中通过want获取应用传给元服务的参数:
export default class AtomicServiceHspAbility extends EmbeddableUIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { console.log(`onCreate, want parameters: ${want.parameters?.page}`); } }
嵌入式运行元服务能力默认是受限的,需要开发者申请权限,才能使用。如果开发者在申请权限之前开发调试阶段想临时开启权限,可以通过打开开发者选项中的“开发中元服务豁免管控”开关来获取调试嵌入式元服务的权限。

开发者选项中的“开发中元服务豁免管控”开关具体放通规格说明: