【HarmonyOS 5】鸿蒙中的UIAbility详解(二)

GeorgeGcs
• 阅读 4

##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言 今天我们继续深入讲解UIAbility,根据下图可知,在鸿蒙中UIAbility继承于Ability,开发者无法直接继承Ability。只能使用其两个子类:UIAbility和ExtensionAbility。

本文将对UIAbility的三种启动模式,数据如何传递,订阅UIAbility生命周期变化,订阅设备的信息变化进行讲解。 二、UIAbility的三种启动模式 singleton(单实例模式),说人话就是单例模式,App任务进度中该UIAbilty只能存在一个。 multiton(多实例模式),说人话就是单例模式,App任务进度中该UIAbilty能存在多个。 specified(指定实例模式),这玩意就有点复杂了,参见下图,主要通过唯一标识key来作为判断量,看该UIAbility是创建新的,还是使用已创建的。

在module.json5配置文件中的launchType字段配置为singleton,multiton,specified即可。 { "module": { // ... "abilities": [ { "launchType": "singleton", // ... } ] } } 三、UIAbility的数据如何传递 一般而言,UIAbility的数据传递有两种场景: 1、A UIAbility数据传递给 B UIAbility。 2、A UIAbility数据传给内部的page或者自定义view。 同样通用数据传递的方式有以下三种方式进行:

  1. 单例对象维护数据 通过单例对象和注册回调的机制,将数据进行传导:

export class EventDataMgr {

private static mEventDataMgr : EventDataMgr | null = null;

// 需要处理的数据 public mData: XXX | null = null;

/**

  • 获取实例

  • @returns

  • / public static Ins(){

    if(!EventDataMgr .mEventDataMgr ){ EventDataMgr .mEventDataMgr = new EventDataMgr(); } return EventDataMgr .mEventDataMgr; } }

    1. EventHub,Emitter 我是不建议使用Emitter作为数据传递方案,因为它太重了,使用起来也没有EventHub方便。 而EventHub是从context中获取,所以在多Ability数据共享场景中,需要对EventHub做唯一性处理 import { common } from '@kit.AbilityKit';

export class EventHubUtils {

private static mEventHub: common.EventHub | null = null;

/**

  • 获取事件通知实例
  • @returns
  • / public static getEventHub(){ // 封装唯一性。因为在不同window中会导致获取的eventhub 不是一个。 if(!EventHubUtils.mEventHub){ let context = getContext() as common.UIAbilityContext; EventHubUtils.mEventHub = context.eventHub; console.log("EventHubUtils", "EventIns mEventHub done !"); } return EventHubUtils.mEventHub; } }
    1. AppStroage或者LocalStroage AppStroage主要用于多UIAbility共享数据进行传递的业务场景。 LocalStroage用于UIAbility内部到page或者自定义view进行传递传递的业务场景。 import { UIAbility } from '@kit.AbilityKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { window } from '@kit.ArkUI';

export default class EntryAbility extends UIAbility {

storage: LocalStorage = new LocalStorage();

onWindowStageCreate(windowStage: window.WindowStage): void { windowStage.loadContent('pages/Index', this.storage, (err) => { if (err.code) { hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); return; } hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); }); }

} 四、订阅UIAbility生命周期变化 该场景主要用于统计SDK或者三方应用自己进行业务用户时长交互的数据统计工作。 当进程内的UIAbility生命周期变化时,如创建、可见/不可见、获焦/失焦、销毁等,会触发相应的回调函数。每次注册回调函数时,都会返回一个监听生命周期的ID,此ID会自增+1。当超过监听上限数量2^63-1时,会返回-1。 import { AbilityConstant, AbilityLifecycleCallback, UIAbility, Want } from '@kit.AbilityKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { window } from '@kit.ArkUI'; import { BusinessError } from '@kit.BasicServicesKit';

const TAG: string = '[LifecycleAbility]'; const DOMAIN_NUMBER: number = 0xFF00;

export default class LifecycleAbility extends UIAbility { // 定义生命周期ID lifecycleId: number = -1;

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { // 定义生命周期回调对象 let abilityLifecycleCallback: AbilityLifecycleCallback = { // 当UIAbility创建时被调用 onAbilityCreate(uiAbility) { hilog.info(DOMAIN_NUMBER, TAG, onAbilityCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}); }, // 当窗口创建时被调用 onWindowStageCreate(uiAbility, windowStage: window.WindowStage) { hilog.info(DOMAIN_NUMBER, TAG, onWindowStageCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}); hilog.info(DOMAIN_NUMBER, TAG, onWindowStageCreate windowStage: ${JSON.stringify(windowStage)}); }, // 当窗口处于活动状态时被调用 onWindowStageActive(uiAbility, windowStage: window.WindowStage) { hilog.info(DOMAIN_NUMBER, TAG, onWindowStageActive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}); hilog.info(DOMAIN_NUMBER, TAG, onWindowStageActive windowStage: ${JSON.stringify(windowStage)}); }, // 当窗口处于非活动状态时被调用 onWindowStageInactive(uiAbility, windowStage: window.WindowStage) { hilog.info(DOMAIN_NUMBER, TAG, onWindowStageInactive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}); hilog.info(DOMAIN_NUMBER, TAG, onWindowStageInactive windowStage: ${JSON.stringify(windowStage)}); }, // 当窗口被销毁时被调用 onWindowStageDestroy(uiAbility, windowStage: window.WindowStage) { hilog.info(DOMAIN_NUMBER, TAG, onWindowStageDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}); hilog.info(DOMAIN_NUMBER, TAG, onWindowStageDestroy windowStage: ${JSON.stringify(windowStage)}); }, // 当UIAbility被销毁时被调用 onAbilityDestroy(uiAbility) { hilog.info(DOMAIN_NUMBER, TAG, onAbilityDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}); }, // 当UIAbility从后台转到前台时触发回调 onAbilityForeground(uiAbility) { hilog.info(DOMAIN_NUMBER, TAG, onAbilityForeground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}); }, // 当UIAbility从前台转到后台时触发回调 onAbilityBackground(uiAbility) { hilog.info(DOMAIN_NUMBER, TAG, onAbilityBackground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}); }, // 当UIAbility迁移时被调用 onAbilityContinue(uiAbility) { hilog.info(DOMAIN_NUMBER, TAG, onAbilityContinue uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}); } }; // 获取应用上下文 let applicationContext = this.context.getApplicationContext(); try { // 注册应用内生命周期回调 this.lifecycleId = applicationContext.on('abilityLifecycle', abilityLifecycleCallback); } catch (err) { let code = (err as BusinessError).code; let message = (err as BusinessError).message; hilog.error(DOMAIN_NUMBER, TAG, Failed to register applicationContext. Code is ${code}, message is ${message}); }

hilog.info(DOMAIN_NUMBER, TAG, `register callback number: ${this.lifecycleId}`);

} //... onDestroy(): void { // 获取应用上下文 let applicationContext = this.context.getApplicationContext(); try { // 取消应用内生命周期回调 applicationContext.off('abilityLifecycle', this.lifecycleId); } catch (err) { let code = (err as BusinessError).code; let message = (err as BusinessError).message; hilog.error(DOMAIN_NUMBER, TAG, Failed to unregister applicationContext. Code is ${code}, message is ${message}); } } } 五、订阅设备的信息变化 该场景主要是系统配置更新时调用。例如设备的语言环境,设备横竖屏状态,深浅模式等。 在UIAbility中onConfigurationUpdate()回调方法中实现监测系统这些配置信息的变化。 import { AbilityConstant, Configuration, UIAbility, Want } from '@kit.AbilityKit'; import { hilog } from '@kit.PerformanceAnalysisKit';

const TAG: string = '[EntryAbility]'; const DOMAIN_NUMBER: number = 0xFF00;

let systemLanguage: string | undefined; // 系统当前语言

export default class EntryAbility extends UIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { systemLanguage = this.context.config.language; // UIAbility实例首次加载时,获取系统当前语言 hilog.info(DOMAIN_NUMBER, TAG, systemLanguage is ${systemLanguage}); }

onConfigurationUpdate(newConfig: Configuration): void { console.info(envCallback onConfigurationUpdated success: ${JSON.stringify(config)}); // 表示应用程序的当前语言,例如“zh"。 let language = config.language; // 表示深浅色模式,默认为浅色。取值范围: // // - COLOR_MODE_NOT_SET:未设置 // // - COLOR_MODE_LIGHT:浅色模式 // // - COLOR_MODE_DARK:深色模式 let colorMode = config.colorMode; // 表示屏幕方向,取值范围: // // - DIRECTION_NOT_SET:未设置 // // - DIRECTION_HORIZONTAL:水平方向 // // - DIRECTION_VERTICAL:垂直方向 let direction = config.direction; let screenDensity = config.screenDensity; let displayId = config.displayId; let hasPointerDevice = config.hasPointerDevice; let fontId = config.fontId; let fontSizeScale = config.fontSizeScale; let fontWeightScale = config.fontWeightScale; let mcc = config.mcc; let mnc = config.mnc; } // ... }

点赞
收藏
评论区
推荐文章
GeorgeGcs GeorgeGcs
16小时前
【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解
【HarmonyOS5入门系列】鸿蒙HarmonyOS示例项目讲解\鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言:移动开发声明式UI框架的技术变革在移动操作系统的发展历程中,UI开发模式经历了从命令式到声明式的重大变革。根据
GeorgeGcs GeorgeGcs
16小时前
【HarmonyOS 5】AttributeModifier和AttributeUpdater区别详解
【HarmonyOS5】AttributeModifier和AttributeUpdater区别详解\鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、AttributeModifier和AttributeUpdater的定义和作用1
GeorgeGcs GeorgeGcs
10小时前
从“备胎”到领航者,鸿蒙操作系统的传奇进化
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财【HarmonyOS5】2019年,在全球科技产业的风云变幻中,华为正式推出了鸿蒙操作系统(HarmonyOS),这一消息如同一颗重磅炸弹,瞬间吸引了全世界的目光。彼时,外界对鸿蒙的诞生背
GeorgeGcs GeorgeGcs
7小时前
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS5的应用开发模型中,featureAbility是旧版FA模型(FeatureAbility)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文
GeorgeGcs GeorgeGcs
7小时前
【HarmonyOS 5】鸿蒙中的UIAbility详解(一)
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、UIAbility是什么?Stage模型中的组件类型名,即UIAbility组件,包含UI,提供展示UI的能力,主要用于和用户交互。UIAbility类似于传统移动开发Android中
GeorgeGcs GeorgeGcs
7小时前
【HarmonyOS 5】鸿蒙中的UIAbility详解(三)
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙游戏类应用(游戏一、前言本文是鸿蒙中的UIAbility详解系列的最终章。主要针对UIAbility的冷启动和热启动,对于want数据的处理。UIAbility的备份恢复,UIAbility的接续等高级功能的
GeorgeGcs GeorgeGcs
7小时前
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS5的应用开发模型中,featureAbility是旧版FA模型(FeatureAbility)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文
GeorgeGcs GeorgeGcs
7小时前
【HarmonyOS 5】使用openCustomDialog如何禁止手势关闭的方案
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS中使用openCustomDialog自定义弹框时,我们会遇到实现禁止手势关闭弹框的业务场景。虽然在HarmonyOSNext中,自定义Dialog默认可能继承
GeorgeGcs GeorgeGcs
6小时前
【HarmonyOS 5】鸿蒙发展历程
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、鸿蒙HarmonyOS版本年代记鸿蒙1.0:2019年8月9日,华为在开发者大会上正式发布鸿蒙1.0系统,这一版本首次应用于华为荣耀智慧屏产品中,标志着华为正式进军操作系统领域。该版本
GeorgeGcs GeorgeGcs
6小时前
【HarmonyOS 5】鸿蒙Web组件和内嵌网页双向通信DEMO示例
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在ArkUI开发中,Web组件(Web)允许开发者在应用内嵌入网页,实现混合开发场景。本文将通过完整DEMO,详解如何通过WebviewController实现ArkUI与内嵌网页
GeorgeGcs
GeorgeGcs
Lv1
男 · 金融头部企业 · 鸿蒙应用架构师
HarmonyOS认证创作先锋,华为HDE专家,鸿蒙讲师,作者。目前任职鸿蒙应用架构师。 历经腾讯,宝马,研究所,金融。 待过私企,外企,央企。 深耕大应用开发领域十年。 AAE,Harmony(OpenHarmony\HarmonyOS),MAE(Android\IOS),FE(H5\Vue\RN)。
文章
56
粉丝
1
获赞
2