鸿蒙系统开发实力显著,HarmonyOS SDK应用服务丰富多样,尤其在金融领域,金融理财类应用表现尤为突出。
一、前言
今日,我们持续对UIAbility进行深入剖析,观察下方的图示可以明确,在鸿蒙系统中,UIAbility是Ability的一个分支,开发者并不能直接对Ability进行继承。他们只能选择利用其两个派生类别,即UIAbility与ExtensionAbility。

本文将详细阐述UIAbility的三种启动方式,以及数据传输的机制,并介绍如何订阅UIAbility的生命周期变动和设备信息的变化。
二、UIAbility的三种启动模式
Singleton模式,通俗来讲即单例模式,指的是在App任务进度中,该UIAbilty的实例只能有一个。
多实例模式,通俗来讲,等同于单例模式开yun体育app官网网页登录入口,在App任务进度中,该UIAbilty可以存在不止一个实例。
指定实例模式,这一模式相对较为繁复,如图所示,它主要通过一个唯一的标识符key来进行判断,以此来确定该UIAbility是应当创建一个新的实例,还是应当使用已经存在的实例。

在module.json5配置文件里,只需将launchType字段设置为singleton、multiton或specified即可。
{
"module": {
// ...
"abilities": [
{
"launchType": "singleton",
// ...
}
]
}
}
三、UIAbility的数据如何传递
一般而言kaiyun.ccm,UIAbility的数据传递有两种场景:
A端将UIAbility数据传递至B端。
将UIAbility的数据传递至内部页面或自定义视图。
同样通用数据传递的方式有以下三种方式进行:
1. 单例对象维护数据
通过单例对象和注册回调的机制,将数据进行传导:
export class EventDataMgr {
定义了一个私有静态变量mEventDataMgr,其类型为EventDataMgr或null,初始值设置为null。
// 需要处理的数据
public mData: XXX 或 null 的值被设定为 null;
/**
* 获取实例
* @returns
*/
public static Ins(){
若(EventDataMgr的)mEventDataMgr属性未设置。
EventDataMgr类的成员变量mEventDataMgr被赋予了一个新的EventDataMgr对象。
}
返回EventDataMgr实例中的mEventDataMgr成员。
}
}
2. EventHub,Emitter
我不赞同选用Emitter作为数据传输的方案,理由是它相对较重,并且在操作上也不及EventHub来得便捷。
EventHub的信息来源于上下文环境,因此kaiyun全站网页版登录,在涉及多个Ability间的数据共享场景中,我们必须对EventHub进行唯一性标识的处理。
引入了来自“@kit.AbilityKit”的通用模块;使用了common这一部分;从该模块中提取了相关功能。
export class EventHubUtils {
私有静态的mEventHub变量,其类型为common.EventHub或null,目前被初始化为null。
/**
* 获取事件通知实例
* @returns
*/
public static getEventHub(){
确保封装的唯一性,否则在不同窗口中获取的eventhub可能并非同一实例。
if(!EventHubUtils.mEventHub){
获取上下文对象,将其定义为common.UIAbilityContext类型的变量context。
EventHubUtils类中的mEventHub属性被设置为context对象所拥有的eventHub。
在控制台输出信息,表明"EventHubUtils"模块中,"EventIns"操作在"mEventHub"上已顺利完成。
}
返回EventHubUtils类中的EventHub实例;
}
}
3. AppStroage或者LocalStroage
AppStroage主要应用于处理多个UIAbility间共享数据的传输需求。
LocalStroage在UIAbility内部被应用于将数据传递至page页面或自定义视图的特定业务场合。
引入模块 `UIAbility`,源自 `@kit.AbilityKit` 库。
引入了名为 hilog 的模块,该模块来源于 '@kit.PerformanceAnalysisKit' 包。
引入模块中包含的window对象,来自名为 '@kit.ArkUI' 的库。
将默认导出类EntryAbility继承自UIAbility
LocalStorage对象:通过实例化操作创建了一个LocalStorage实例,命名为LocalStorage。
在创建窗口阶段时,针对指定的window.WindowStage对象执行:void onWindowStageCreate(windowStage: window.WindowStage)。
windowStage执行加载内容操作,指定内容为'pages/Index',使用当前存储对象,并在回调函数中处理可能出现的错误,该函数形式为(err) => {。
if (err.code) {
hilog记录错误信息,错误代码为0x0000,标签为testTag,内容为“加载内容失败。原因:%{public}s”,其中%s将被JSON字符串化后的错误信息(如果存在)所替代,否则为空字符串;hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
return;
}
hilog.info输出信息,编号为0x0000,标签为testTag,内容为“成功加载了内容”。
});
}
}
四、订阅UIAbility生命周期变化
此场景主要服务于对SDK或第三方应用在业务层面与用户进行时长交互的数据收集与分析。
在UIAbility的生命周期发生变更,诸如启动、显现/隐藏、聚焦/失焦、终止等情况下,会激活对应的回调机制。在每次设定回调函数的过程中,系统将赋予一个用于跟踪生命周期的唯一标识码,该标识码会持续递增。一旦该标识码的数值达到上限,即2^63-1,系统将返回-1作为响应。
引入了来自`@kit.AbilityKit`的`AbilityConstant`、`AbilityLifecycleCallback`、`UIAbility`和`Want`等模块。
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
引入模块 BusinessError,该模块来源于 '@kit.BasicServicesKit'。
定义一个字符串常量,其值为“[生命周期能力]”。
定义了一个名为DOMAIN_NUMBER的常量,其数值为十六进制的FF00。
将默认导出类 LifecycleAbility 继承自 UIAbility 类。
// 定义生命周期ID
lifecycleId: number = -1;
在创建过程中,针对所需求的参数(want)以及启动参数(launchParam),执行一个空的void函数。
// 定义生命周期回调对象
设定能力生命周期回调函数为:AbilityLifecycleCallback = {
// 当UIAbility创建时被调用
onAbilityCreate(uiAbility) {
hilog.info(DOMAIN_NUMBER, TAG, `触发能力创建事件,uiAbility.launchWant的详细信息如下:${JSON.stringify(uiAbility.launchWant)}`);
},
// 当窗口创建时被调用
在窗口阶段创建时,对uiAbility进行操作,并传入windowStage作为窗口阶段的参数:window.WindowStage。
hilog.info(DOMAIN_NUMBER, TAG, "在窗口阶段创建时,启动了uiAbility,并传递了以下启动需求:", JSON.stringify(uiAbility.launchWant));
hilog.info(DOMAIN_NUMBER, TAG, `窗口阶段创建事件触发,窗口阶段信息如下:${JSON.stringify(windowStage)}`);
},
// 当窗口处于活动状态时被调用
当窗口阶段激活时,针对uiAbility执行操作,并传入参数windowStage,该参数属于window.WindowStage类型。
hilog.info(DOMAIN_NUMBER, TAG, `当窗口状态激活时,启动需求的UI能力将被触发:${JSON.stringify(uiAbility.launchWant)}`);
hilog.info(DOMAIN_NUMBER, TAG, `当窗口阶段激活时,窗口阶段信息如下:${JSON.stringify(windowStage)}`);
},
// 当窗口处于非活动状态时被调用
当窗口处于非活动状态时,针对uiAbility执行操作,并传入windowStage参数:window.WindowStage。
hilog.info(DOMAIN_NUMBER, TAG, "当窗口处于非活动状态时,启动愿望:", JSON.stringify(uiAbility.launchWant));
hilog.info(DOMAIN_NUMBER, TAG, "窗口活动状态变为非活动时,窗口状态信息如下:", JSON.stringify(windowStage));
},
// 当窗口被销毁时被调用
在窗口阶段销毁事件中,针对uiAbility对象及其关联的windowStage窗口阶段,执行以下操作:{
hilog.info(DOMAIN_NUMBER, TAG, "在窗口阶段销毁时,uiAbility启动愿望如下:", JSON.stringify(uiAbility.launchWant));
hilog.info(DOMAIN_NUMBER, TAG, `触发onWindowStageDestroy事件,涉及窗口阶段信息:${JSON.stringify(windowStage)}`);
},
// 当UIAbility被销毁时被调用
onAbilityDestroy(uiAbility) {
hilog.info(DOMAIN_NUMBER, TAG, "在能力销毁事件中,触发uiAbility.launchWant的启动需求,具体内容如下:", JSON.stringify(uiAbility.launchWant));
},
// 当UIAbility从后台转到前台时触发回调
当处于界面能力的前台时,针对uiAbility进行操作。
hilog.info输出信息,指定域名编号为DOMAIN_NUMBER,标签为TAG,内容为`onAbilityForeground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`。
},
// 当UIAbility从前台转到后台时触发回调
在能力背景设定中针对uiAbility进行操作,{ }
hilog.info(DOMAIN_NUMBER, TAG, "在能力背景界面,启动愿望功能被触发,具体愿望详情如下:", JSON.stringify(uiAbility.launchWant));
},
// 当UIAbility迁移时被调用
当执行能力持续操作时,针对用户界面能力进行函数调用。
hilog.info(DOMAIN_NUMBER, TAG, "在能力继续时触发,执行uiAbility.launchWant操作,具体参数如下:", JSON.stringify(uiAbility.launchWant));
}
};
// 获取应用上下文
获取应用程序上下文,将其赋值给变量applicationContext。
try {
// 注册应用内生命周期回调
此生命周期ID是通过监听名为“abilityLifecycle”的事件并注册能力生命周期回调函数来设置的,该函数由applicationContext提供。
} catch (err) {
将错误对象中的业务错误代码赋值给变量code。
将错误信息赋值给变量message,即(message := (err as BusinessError).message)。
hilog记录错误信息,指定领域编号为DOMAIN_NUMBER,标签为TAG,内容为“无法注册applicationContext。错误代码为${code},错误信息为${message}。”
}
hilog.info(DOMAIN_NUMBER, TAG, `注册回调的编号为:${this.lifecycleId}`);
}
//...
onDestroy(): void {
// 获取应用上下文
let applicationContext = this.context.getApplicationContext();
try {
// 取消应用内生命周期回调
applicationContext取消了对'abilityLifecycle'的监听,并移除了与lifecycleId相关的绑定。
} catch (err) {
let code = (err as BusinessError).code;
let message = (err as BusinessError).message;
hilog记录错误信息,指出领域编号为DOMAIN_NUMBER,标签为TAG,提示无法注销applicationContext,错误代码为${code},具体信息为${message}。
}
}
}

