您现在的位置是:首页 >其他 >HarmonyOS NEXT应用开发:Stage模型开发-UIServiceExtension网站首页其他
HarmonyOS NEXT应用开发:Stage模型开发-UIServiceExtension
简介HarmonyOS NEXT应用开发:Stage模型开发-UIServiceExtension
往期鸿蒙5.0全套实战文章必看:(文中附带全栈鸿蒙5.0学习资料)
UIServiceExtension
概述
UIServiceExtension是UIService类型的ExtensionAbility浮窗类组件,提供UI界面(例如预览界面)和后台服务能力。组件内部持有了一个UIServiceExtensionContext,通过UIServiceExtensionContext提供了丰富的接口供外部使用。
本文描述中称被启动的UIServiceExtension为服务端,称启动UIServiceExtension的组件为客户端。
应用可以通过启动和连接两种形式使用UIServiceExtension:
- 通过UIExtensionContext调用startUIServiceExtensionAbility()方法启动UIServiceExtension。
- 通过UIAbilityContext、UIExtensionContext调用connectUIServiceExtensionAbility()方法连接UIServiceExtension。
说明
三方应用可以使用UIServiceExtension,不支持实现UIServiceExtension(需要系统权限)。
三方应用需要在前台获焦的情况下才能连接系统提供的UIServiceExtension。
UIServiceExtension的生命周期与绑定的窗口强关联,窗口销毁后UIServiceExtension也一起销毁。
启动UIServiceExtension
应用通过startUIServiceExtensionAbility()方法启动一个UIServiceExtension。UIServiceExtension启动后,其生命周期独立于客户端,即使客户端已经销毁,该后台服务仍可继续运行,窗口创建失败或销毁后该服务会被销毁。
import { common, Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
@Entry
@Component
struct Index {
build() {
Column() {
Row() {
// 创建启动按钮
Button('start ability')
.enabled(true)
.onClick(() => {
let context = getContext(this) as common.UIAbilityContext;
let startWant: Want = {
bundleName: 'com.acts.uiserviceextensionability',
abilityName: 'UiServiceExtAbility',
};
try {
// 启动UIServiceExtensionAbility
context.startUIServiceExtensionAbility(startWant).then(() => {
console.log('startUIServiceExtensionAbility success');
}).catch((error: BusinessError) => {
console.log('startUIServiceExtensionAbility error', JSON.stringify(error));
})
} catch (err) {
console.log('startUIServiceExtensionAbility failed', JSON.stringify(err));
}
})
}
}
}
}
客户端连接服务端
客户端通过connectUIServiceExtensionAbility()连接服务端,获取并保存UIServiceProxy对象。通过该proxy对象的sendData()方法发送数据给服务端。服务端通过UIServiceExtensionAbility类onData()(系统接口)方法接收客户端数据。
import { common, Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
@Entry
@Component
struct Index {
comProxy: common.UIServiceProxy | null = null;
connectCallback : common.UIServiceExtensionConnectCallback = {
onData:(data: Record<string, Object>) => {
console.log("received data", JSON.stringify(data));
},
onDisconnect:() => {
console.log("onDisconnect ");
}
}
build() {
Column() {
Row() {
// 创建连接按钮
Button("connect ability")
.enabled(true)
.onClick(() => {
let context = getContext(this) as common.UIAbilityContext;
let startWant:Want = {
bundleName: 'com.acts.uiserviceextensionability',
abilityName: 'UiServiceExtAbility',
};
try {
// 连接UIServiceExtensionAbility
context.connectUIServiceExtensionAbility(startWant, this.connectCallback).then((proxy: common.UIServiceProxy) => {
this.comProxy = proxy;
let formData: Record<string, string> = {
'test': 'test'
};
try {
this.comProxy.sendData(formData);
} catch (err) {
console.log('sendData failed', JSON.stringify(err));
};
}).catch((err: BusinessError) => {
console.log("connectUIServiceExtensionAbility failed", JSON.stringify(err));
});
} catch(err) {
console.log("connectUIServiceExtensionAbility failed", JSON.stringify(err));
};
})
}
}
}
}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结