鸿蒙~UiAbility 和page,UiAbility和UiA
2024-01-01 本文已影响0人
胡修波
基于HarmonyOS的应用模型,可以通过以下两种方式来实现UIAbility组件与UI之间的数据同步。
-
EventHub:基于发布订阅模式来实现,事件需要先订阅后发布,订阅者收到消息后进行处理。
-
globalThis:ArkTS引擎实例内部的一个全局对象,在ArkTS引擎实例内部都能访问。
EventHub 较简单,直接上代码
- 在UIAbility中订阅
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
let eventHub = this.context.eventHub
eventHub.on("test_event", (...data)=> {
console.info(TAG, `data:${JSON.stringify(data)}`);
})
}
- 2、在UI界面中通过eventHub.emit()方法触发该事件,在触发事件的同时,根据需要传入参数信息。
import common from '@ohos.app.ability.common'
const TAG = "huxiubo"
@Entry
@Component
struct Index {
@State message: string = 'Hello World'
private context = getContext(this) as common.UIAbilityContext
private MyNumber: number
private MyNString: string;
eventHub() {
this.context.eventHub.emit("test_event", 1, "huxiubo", "beijing")
this.MyNString = globalThis.MyNString
this.MyNumber = globalThis.MyNumber
console.info(TAG, `MyNString, ${ this.MyNString}`);
console.info(TAG, `MyNumber, ${ this.MyNumber}`);
}
build() {
Row() {
Column() {
Text("enter Ability")
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(()=>{
this.eventHub()
})
}
.width('100%')
}
.height('100%')
}
}
使用globalThis进行数据同步-- page页面和另一个UIAbility接受数据一样
globalThis是ArkTS引擎实例内部的一个全局对象,引擎内部的UIAbility/ExtensionAbility/Page都可以使用,因此可以使用globalThis全局对象进行数据同步
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
let eventHub = this.context.eventHub
globalThis.MyNumber = 100;
globalThis.MyNString = "字符串测试";
}
Page页面接受数据
import common from '@ohos.app.ability.common'
const TAG = "huxiubo"
@Entry
@Component
struct Index {
@State message: string = 'Hello World'
private MyNumber: number
private MyNString: string;
aboutToAppear() {
this.MyNString = globalThis.MyNString
this.MyNumber = globalThis.MyNumber
console.info(TAG, `${this.MyNString}`);
console.info(TAG, `${this.MyNumber}`);
}
build() {
Row() {
Column() {
Text("enter Ability")
.fontSize(50)
.fontWeight(FontWeight.Bold)
}
.width('100%')
}
.height('100%')
}
}
UIAbility接受数据也Page一样