基于HarmonyOS的利用模型,能够通过以下两种形式来实现UIAbility组件与UI之间的数据同步。

  • 应用EventHub进行数据通信:基于公布订阅模式来实现,事件须要先订阅后公布,订阅者收到音讯后进行解决。
  • 应用globalThis进行数据同步:ArkTS引擎实例外部的一个全局对象,在ArkTS引擎实例外部都能拜访。
  • 应用AppStorage/LocalStorage进行数据同步:ArkUI提供了AppStorage和LocalStorage两种利用级别的状态治理计划,可用于实现利用级别和UIAbility级别的数据同步。

应用EventHub进行数据通信

EventHub提供了UIAbility组件/ExtensionAbility组件级别的事件机制,以UIAbility组件/ExtensionAbility组件为核心提供了订阅、勾销订阅和触发事件的数据通信能力。接口阐明请参见EventHub。

在应用EventHub之前,首先须要获取EventHub对象。基类Context提供了EventHub对象,本章节以应用EventHub实现UIAbility与UI之间的数据通信为例进行阐明。

1.在UIAbility中调用eventHub.on()办法注册一个自定义事件“event1”,eventHub.on()有如下两种调用形式,应用其中一种即可。

import UIAbility from '@ohos.app.ability.UIAbility';const TAG: string = '[Example].[Entry].[EntryAbility]';export default class EntryAbility extends UIAbility {    func1(...data) {        // 触发事件,实现相应的业务操作        console.info(TAG, '1. ' + JSON.stringify(data));    }    onCreate(want, launch) {        // 获取eventHub        let eventhub = this.context.eventHub;        // 执行订阅操作        eventhub.on('event1', this.func1);        eventhub.on('event1', (...data) => {            // 触发事件,实现相应的业务操作            console.info(TAG, '2. ' + JSON.stringify(data));        });    }}

2.在UI界面中通过eventHub.emit()办法触发该事件,在触发事件的同时,依据须要传入参数信息。

import common from '@ohos.app.ability.common';@Entry@Componentstruct Index {  private context = getContext(this) as common.UIAbilityContext;  eventHubFunc() {    // 不带参数触发自定义“event1”事件    this.context.eventHub.emit('event1');    // 带1个参数触发自定义“event1”事件    this.context.eventHub.emit('event1', 1);    // 带2个参数触发自定义“event1”事件    this.context.eventHub.emit('event1', 2, 'test');    // 开发者能够依据理论的业务场景设计事件传递的参数  }  // 页面展现  build() {    // ...  }}

3.在UIAbility的注册事件回调中能够失去对应的触发事件后果,运行日志后果如下所示。

[][1][2,'test']

4.在自定义事件“event1”应用实现后,能够依据须要调用eventHub.off()办法勾销该事件的订阅。

// context为UIAbility实例的AbilityContextthis.context.eventHub.off('event1');

应用globalThis进行数据同步

globalThis是ArkTS引擎实例外部的一个全局对象,引擎外部的UIAbility/ExtensionAbility/Page都能够应用,因而能够应用globalThis全局对象进行数据同步。

图1 应用globalThis进行数据同步

如上图所示,上面来具体介绍globalThis的应用:

  • UIAbility和Page之间应用globalThis
  • UIAbility和UIAbility之间应用globalThis
  • globalThis应用的注意事项

UIAbility和Page之间应用globalThis

globalThis为ArkTS引擎实例下的全局对象,能够通过globalThis绑定属性/办法来进行UIAbility组件与UI的数据同步。例如在UIAbility组件中绑定want参数,即可在UIAbility对应的UI界面上应用want参数信息。

1.调用startAbility()办法启动一个UIAbility实例时,被启动的UIAbility创立实现后会进入onCreate()生命周期回调,且在onCreate()生命周期回调中可能承受到传递过去的want参数,能够将want参数绑定到globalThis上。

import UIAbility from '@ohos.app.ability.UIAbility'export default class EntryAbility extends UIAbility {    onCreate(want, launch) {        globalThis.entryAbilityWant = want;        // ...    }    // ...}

在UI界面中即可通过globalThis获取到want参数信息。

let entryAbilityWant;@Entry@Componentstruct Index {  aboutToAppear() {    entryAbilityWant = globalThis.entryAbilityWant;  }  // 页面展现  build() {    // ...  }}

UIAbility和UIAbility之间应用globalThis

同一个利用中UIAbility和UIAbility之间的数据传递,能够通过将数据绑定到全局变量globalThis上进行同步,如在AbilityA中将数据保留在globalThis,而后跳转到AbilityB中获得该数据:

1.AbilityA中保留数据一个字符串数据并挂载到globalThis上。

import UIAbility from '@ohos.app.ability.UIAbility'export default class AbilityA extends UIAbility {    onCreate(want, launch) {        globalThis.entryAbilityStr = 'AbilityA'; // AbilityA寄存字符串“AbilityA”到globalThis        // ...    }}

2.AbilityB中获取对应的数据。

import UIAbility from '@ohos.app.ability.UIAbility'export default class AbilityB extends UIAbility {    onCreate(want, launch) {        // AbilityB从globalThis读取name并输入        console.info('name from entryAbilityStr: ' + globalThis.entryAbilityStr);        // ...    }}

globalThis应用的注意事项

图2 globalThis注意事项

  • Stage模型下过程内的UIAbility组件共享ArkTS引擎实例,应用globalThis时须要防止寄存雷同名称的对象。例如AbilityA和AbilityB能够应用globalThis共享数据,在寄存雷同名称的对象时,先寄存的对象会被后寄存的对象笼罩。
  • FA模型因为每个UIAbility组件之间引擎隔离,不会存在该问题。
  • 对于绑定在globalThis上的对象,其生命周期与ArkTS虚拟机实例雷同,倡议在应用实现之后将其赋值为null,以缩小对利用内存的占用。

Stage模型上同名对象笼罩导致问题的场景举例说明。

1.在AbilityA文件中应用globalThis寄存了UIAbilityContext。

import UIAbility from '@ohos.app.ability.UIAbility'export default class AbilityA extends UIAbility {    onCreate(want, launch) {        globalThis.context = this.context; // AbilityA寄存context到globalThis        // ...    }}

2.在AbilityA的页面中获取该UIAbilityContext并进行应用。应用实现后将AbilityA实例切换至后盾。

@Entry@Componentstruct Index {  onPageShow() {    let ctx = globalThis.context; // 页面中从globalThis中取出context并应用    let permissions = ['com.example.permission']    ctx.requestPermissionsFromUser(permissions,(result) => {       // ...    });  }  // 页面展现  build() {    // ...  }}

3.在AbilityB文件中应用globalThis寄存了UIAbilityContext,并且命名为雷同的名称。

import UIAbility from '@ohos.app.ability.UIAbility'export default class AbilityB extends UIAbility {    onCreate(want, launch) {        // AbilityB笼罩了AbilityA在globalThis中寄存的context        globalThis.context = this.context;        // ...    }}

4.在AbilityB的页面中获取该UIAbilityContext并进行应用。此时获取到的globalThis.context曾经示意为AbilityB中赋值的UIAbilityContext内容。

@Entry@Componentstruct Index {  onPageShow() {    let ctx = globalThis.context; // Page中从globalThis中取出context并应用    let permissions = ['com.example.permission']    ctx.requestPermissionsFromUser(permissions,(result) => {      console.info('requestPermissionsFromUser result:' + JSON.stringify(result));    });  }  // 页面展现  build() {    // ...  }}

5.在AbilityB实例切换至后盾,将AbilityA实例从后盾切换回到前台。此时AbilityA的onCreate生命周期不会再次进入。

import UIAbility from '@ohos.app.ability.UIAbility'export default class AbilityA extends UIAbility {    onCreate(want, launch) { // AbilityA从后盾进入前台,不会再走这个生命周期        globalThis.context = this.context;        // ...    }}

6.在AbilityA的页面再次回到前台时,其获取到的globalThis.context示意的为AbilityB的UIAbilityContext,而不是AbilityA的UIAbilityContext,在AbilityA的页面中应用则会出错。

@Entry@Componentstruct Index {  onPageShow() {    let ctx = globalThis.context; // 这时候globalThis中的context是AbilityB的context    let permissions=['com.example.permission'];    ctx.requestPermissionsFromUser(permissions,(result) => { // 应用这个对象就会导致过程解体       console.info('requestPermissionsFromUser result:' + JSON.stringify(result));    });  }  // 页面展现  build() {    // ...  }}

应用AppStorage/LocalStorage进行数据同步

ArkUI提供了AppStorage和LocalStorage两种利用级别的状态治理计划,可用于实现利用级别和UIAbility级别的数据同步。应用这些计划能够不便地治理利用状态,进步利用性能和用户体验。其中,AppStorage是一个全局的状态管理器,实用于多个UIAbility共享同一状态数据的状况;而LocalStorage则是一个部分的状态管理器,实用于单个UIAbility外部应用的状态数据。通过这两种计划,开发者能够更加灵便地管制利用状态,进步利用的可维护性和可扩展性。具体请参见利用级变量的状态治理。

作为一名合格一线开发程序员,大家心里必定会有很多疑难!鸿蒙零碎这么弱小~~

为了可能让大家跟上互联网时代的技术迭代,在这里跟大家分享一下我本人近期学习心得以及参考网上材料整顿出的一份最新版的鸿蒙学习晋升材料,有须要的小伙伴自行支付,限时开源,先到先得~~~~

支付以下高清学习路线原图请点击→《鸿蒙开发学习之利用模型》纯血鸿蒙HarmonyOS根底技能学习路线图

支付以上残缺高清学习路线图,请点击→《鸿蒙开发学习之UI》小编本人整顿的局部学习材料(蕴含有高清视频、开发文档、电子书籍等)

以上分享的学习路线都适宜哪些人跟着学习?
-应届生/计算机专业
通过学习鸿蒙新兴技术,入行互联网,将来高起点待业。
-0根底转行提前布局新方向,抓住风口,自我晋升,取得更多就业机会。
-技术晋升/进阶跳槽倒退瓶颈期,晋升职场竞争力,疾速把握鸿蒙技术,享受蓝海红利。

写在最初

如果你感觉这篇内容对你还蛮有帮忙,我想邀请你帮我三个小忙:点赞,转发,有你们的 『点赞和评论』,才是我发明的能源。关注小编,同时能够期待后续文章ing,不定期分享原创常识。想要获取更多残缺鸿蒙最新VIP学习材料,请点击→《鸿蒙全套学习指南》