【HarmonyOS 5】鴻蒙中的UIAbility詳解(二)
##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類應(yīng)用 (金融理財#
一、前言
今天我們繼續(xù)深入講解UIAbility,根據(jù)下圖可知,在鴻蒙中UIAbility繼承于Ability,開發(fā)者無法直接繼承Ability。只能使用其兩個子類:UIAbility和ExtensionAbility。
本文將對UIAbility的三種啟動模式,數(shù)據(jù)如何傳遞,訂閱UIAbility生命周期變化,訂閱設(shè)備的信息變化進行講解。
二、UIAbility的三種啟動模式
singleton(單實例模式),說人話就是單例模式,App任務(wù)進度中該UIAbilty只能存在一個。
multiton(多實例模式),說人話就是單例模式,App任務(wù)進度中該UIAbilty能存在多個。
specified(指定實例模式),這玩意就有點復(fù)雜了,參見下圖,主要通過唯一標識key來作為判斷量,看該UIAbility是創(chuàng)建新的,還是使用已創(chuàng)建的。
在module.json5配置文件中的launchType字段配置為singleton,multiton,specified即可。
{
"module": {
// ...
"abilities": [
{
"launchType": "singleton",
// ...
}
]
}
}
三、UIAbility的數(shù)據(jù)如何傳遞
一般而言,UIAbility的數(shù)據(jù)傳遞有兩種場景:
1、A UIAbility數(shù)據(jù)傳遞給 B UIAbility。
2、A UIAbility數(shù)據(jù)傳給內(nèi)部的page或者自定義view。
同樣通用數(shù)據(jù)傳遞的方式有以下三種方式進行:
1. 單例對象維護數(shù)據(jù)
通過單例對象和注冊回調(diào)的機制,將數(shù)據(jù)進行傳導(dǎo):
export class EventDataMgr {
private static mEventDataMgr : EventDataMgr | null = null;
// 需要處理的數(shù)據(jù)
public mData: XXX | null = null;
/**
* 獲取實例
* @returns
*/
public static Ins(){
if(!EventDataMgr .mEventDataMgr ){
EventDataMgr .mEventDataMgr = new EventDataMgr();
}
return EventDataMgr .mEventDataMgr;
}
}
2. EventHub,Emitter
我是不建議使用Emitter作為數(shù)據(jù)傳遞方案,因為它太重了,使用起來也沒有EventHub方便。
而EventHub是從context中獲取,所以在多Ability數(shù)據(jù)共享場景中,需要對EventHub做唯一性處理
import { common } from '@kit.AbilityKit';
export class EventHubUtils {
private static mEventHub: common.EventHub | null = null;
/**
* 獲取事件通知實例
* @returns
*/
public static getEventHub(){
// 封裝唯一性。因為在不同window中會導(dǎo)致獲取的eventhub 不是一個。
if(!EventHubUtils.mEventHub){
let context = getContext() as common.UIAbilityContext;
EventHubUtils.mEventHub = context.eventHub;
console.log("EventHubUtils", "EventIns mEventHub done !");
}
return EventHubUtils.mEventHub;
}
}
3. AppStroage或者LocalStroage
AppStroage主要用于多UIAbility共享數(shù)據(jù)進行傳遞的業(yè)務(wù)場景。
LocalStroage用于UIAbility內(nèi)部到page或者自定義view進行傳遞傳遞的業(yè)務(wù)場景。
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生命周期變化
該場景主要用于統(tǒng)計SDK或者三方應(yīng)用自己進行業(yè)務(wù)用戶時長交互的數(shù)據(jù)統(tǒng)計工作。
當進程內(nèi)的UIAbility生命周期變化時,如創(chuàng)建、可見/不可見、獲焦/失焦、銷毀等,會觸發(fā)相應(yīng)的回調(diào)函數(shù)。每次注冊回調(diào)函數(shù)時,都會返回一個監(jiān)聽生命周期的ID,此ID會自增+1。當超過監(jiān)聽上限數(shù)量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 {
// 定義生命周期回調(diào)對象
let abilityLifecycleCallback: AbilityLifecycleCallback = {
// 當UIAbility創(chuàng)建時被調(diào)用
onAbilityCreate(uiAbility) {
hilog.info(DOMAIN_NUMBER, TAG, `onAbilityCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
},
// 當窗口創(chuàng)建時被調(diào)用
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)}`);
},
// 當窗口處于活動狀態(tài)時被調(diào)用
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)}`);
},
// 當窗口處于非活動狀態(tài)時被調(diào)用
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)}`);
},
// 當窗口被銷毀時被調(diào)用
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被銷毀時被調(diào)用
onAbilityDestroy(uiAbility) {
hilog.info(DOMAIN_NUMBER, TAG, `onAbilityDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
},
// 當UIAbility從后臺轉(zhuǎn)到前臺時觸發(fā)回調(diào)
onAbilityForeground(uiAbility) {
hilog.info(DOMAIN_NUMBER, TAG, `onAbilityForeground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
},
// 當UIAbility從前臺轉(zhuǎn)到后臺時觸發(fā)回調(diào)
onAbilityBackground(uiAbility) {
hilog.info(DOMAIN_NUMBER, TAG, `onAbilityBackground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
},
// 當UIAbility遷移時被調(diào)用
onAbilityContinue(uiAbility) {
hilog.info(DOMAIN_NUMBER, TAG, `onAbilityContinue uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
}
};
// 獲取應(yīng)用上下文
let applicationContext = this.context.getApplicationContext();
try {
// 注冊應(yīng)用內(nèi)生命周期回調(diào)
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 {
// 獲取應(yīng)用上下文
let applicationContext = this.context.getApplicationContext();
try {
// 取消應(yīng)用內(nèi)生命周期回調(diào)
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}`);
}
}
}
五、訂閱設(shè)備的信息變化
該場景主要是系統(tǒng)配置更新時調(diào)用。例如設(shè)備的語言環(huán)境,設(shè)備橫豎屏狀態(tài),深淺模式等。
在UIAbility中onConfigurationUpdate()回調(diào)方法中實現(xiàn)監(jiān)測系統(tǒng)這些配置信息的變化。
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; // 系統(tǒng)當前語言
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
systemLanguage = this.context.config.language; // UIAbility實例首次加載時,獲取系統(tǒng)當前語言
hilog.info(DOMAIN_NUMBER, TAG, `systemLanguage is ${systemLanguage}`);
}
onConfigurationUpdate(newConfig: Configuration): void {
console.info(`envCallback onConfigurationUpdated success: ${JSON.stringify(config)}`);
// 表示應(yīng)用程序的當前語言,例如“zh"。
let language = config.language;
// 表示深淺色模式,默認為淺色。取值范圍:
//
// - COLOR_MODE_NOT_SET:未設(shè)置
//
// - COLOR_MODE_LIGHT:淺色模式
//
// - COLOR_MODE_DARK:深色模式
let colorMode = config.colorMode;
// 表示屏幕方向,取值范圍:
//
// - DIRECTION_NOT_SET:未設(shè)置
//
// - 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;
}
// ...
}
審核編輯 黃宇
-
鴻蒙
+關(guān)注
關(guān)注
60文章
2613瀏覽量
44010 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2121瀏覽量
32898
發(fā)布評論請先 登錄
深入理解HarmonyOS UIAbility:生命周期、WindowStage與啟動模式探析

HarmonyOS開發(fā)案例:【UIAbility內(nèi)和UIAbility間頁面的跳轉(zhuǎn)】

鴻蒙開發(fā)-應(yīng)用程序框架UIAbility的使用
【HarmonyOS 5】VisionKit人臉活體檢測詳解

HarmonyOS 5 makeObserved接口詳解
【HarmonyOS 5】鴻蒙應(yīng)用隱私保護詳解
【HarmonyOS 5】金融應(yīng)用開發(fā)鴻蒙組件實踐

【HarmonyOS 5】桌面快捷方式功能實現(xiàn)詳解

評論