一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【HarmonyOS 5】鴻蒙中的UIAbility詳解(二)

HarmonyOS解決方案 ? 來源:HarmonyOS解決方案 ? 作者:HarmonyOS解決方案 ? 2025-07-11 18:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

HarmonyOS 5】鴻蒙中的UIAbility詳解(二)

##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類應(yīng)用 (金融理財(cái)#

一、前言

今天我們繼續(xù)深入講解UIAbility,根據(jù)下圖可知,在鴻蒙中UIAbility繼承于Ability,開發(fā)者無法直接繼承Ability。只能使用其兩個(gè)子類:UIAbility和ExtensionAbility。
image.png

本文將對(duì)UIAbility的三種啟動(dòng)模式,數(shù)據(jù)如何傳遞,訂閱UIAbility生命周期變化,訂閱設(shè)備的信息變化進(jìn)行講解。

二、UIAbility的三種啟動(dòng)模式

singleton(單實(shí)例模式),說人話就是單例模式,App任務(wù)進(jìn)度中該UIAbilty只能存在一個(gè)。

multiton(多實(shí)例模式),說人話就是單例模式,App任務(wù)進(jìn)度中該UIAbilty能存在多個(gè)。

specified(指定實(shí)例模式),這玩意就有點(diǎn)復(fù)雜了,參見下圖,主要通過唯一標(biāo)識(shí)key來作為判斷量,看該UIAbility是創(chuàng)建新的,還是使用已創(chuàng)建的。
image.png

在module.json5配置文件中的launchType字段配置為singleton,multiton,specified即可。

{
  "module": {
    // ...
    "abilities": [
      {
        "launchType": "singleton",
        // ...
      }
    ]
  }
}

三、UIAbility的數(shù)據(jù)如何傳遞

一般而言,UIAbility的數(shù)據(jù)傳遞有兩種場(chǎng)景:
1、A UIAbility數(shù)據(jù)傳遞給 B UIAbility。
2、A UIAbility數(shù)據(jù)傳給內(nèi)部的page或者自定義view。

同樣通用數(shù)據(jù)傳遞的方式有以下三種方式進(jìn)行:
1. 單例對(duì)象維護(hù)數(shù)據(jù)
通過單例對(duì)象和注冊(cè)回調(diào)的機(jī)制,將數(shù)據(jù)進(jìn)行傳導(dǎo):

export class EventDataMgr {

  private static mEventDataMgr : EventDataMgr  | null = null;

  // 需要處理的數(shù)據(jù)
  public mData: XXX | null = null;

  /**
   * 獲取實(shí)例
   * @returns
   */
  public static Ins(){

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

2. EventHub,Emitter
我是不建議使用Emitter作為數(shù)據(jù)傳遞方案,因?yàn)樗亓耍褂闷饋硪矝]有EventHub方便。

而EventHub是從context中獲取,所以在多Ability數(shù)據(jù)共享場(chǎng)景中,需要對(duì)EventHub做唯一性處理

import { common } from '@kit.AbilityKit';

export class EventHubUtils {

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

  /**
   * 獲取事件通知實(shí)例
   * @returns
   */
  public static getEventHub(){
    // 封裝唯一性。因?yàn)樵诓煌瑆indow中會(huì)導(dǎo)致獲取的eventhub 不是一個(gè)。
    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ù)進(jìn)行傳遞的業(yè)務(wù)場(chǎng)景。
LocalStroage用于UIAbility內(nèi)部到page或者自定義view進(jìn)行傳遞傳遞的業(yè)務(wù)場(chǎng)景。

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生命周期變化

該場(chǎng)景主要用于統(tǒng)計(jì)SDK或者三方應(yīng)用自己進(jìn)行業(yè)務(wù)用戶時(shí)長(zhǎng)交互的數(shù)據(jù)統(tǒng)計(jì)工作。

當(dāng)進(jìn)程內(nèi)的UIAbility生命周期變化時(shí),如創(chuàng)建、可見/不可見、獲焦/失焦、銷毀等,會(huì)觸發(fā)相應(yīng)的回調(diào)函數(shù)。每次注冊(cè)回調(diào)函數(shù)時(shí),都會(huì)返回一個(gè)監(jiān)聽生命周期的ID,此ID會(huì)自增+1。當(dāng)超過監(jiān)聽上限數(shù)量2^63-1時(shí),會(huì)返回-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)對(duì)象
    let abilityLifecycleCallback: AbilityLifecycleCallback = {
      // 當(dāng)UIAbility創(chuàng)建時(shí)被調(diào)用
      onAbilityCreate(uiAbility) {
        hilog.info(DOMAIN_NUMBER, TAG, `onAbilityCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      },
      // 當(dāng)窗口創(chuàng)建時(shí)被調(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)}`);
      },
      // 當(dāng)窗口處于活動(dòng)狀態(tài)時(shí)被調(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)}`);
      },
      // 當(dāng)窗口處于非活動(dòng)狀態(tài)時(shí)被調(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)}`);
      },
      // 當(dāng)窗口被銷毀時(shí)被調(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)}`);
      },
      // 當(dāng)UIAbility被銷毀時(shí)被調(diào)用
      onAbilityDestroy(uiAbility) {
        hilog.info(DOMAIN_NUMBER, TAG, `onAbilityDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      },
      // 當(dāng)UIAbility從后臺(tái)轉(zhuǎn)到前臺(tái)時(shí)觸發(fā)回調(diào)
      onAbilityForeground(uiAbility) {
        hilog.info(DOMAIN_NUMBER, TAG, `onAbilityForeground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      },
      // 當(dāng)UIAbility從前臺(tái)轉(zhuǎn)到后臺(tái)時(shí)觸發(fā)回調(diào)
      onAbilityBackground(uiAbility) {
        hilog.info(DOMAIN_NUMBER, TAG, `onAbilityBackground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      },
      // 當(dāng)UIAbility遷移時(shí)被調(diào)用
      onAbilityContinue(uiAbility) {
        hilog.info(DOMAIN_NUMBER, TAG, `onAbilityContinue uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      }
    };
    // 獲取應(yīng)用上下文
    let applicationContext = this.context.getApplicationContext();
    try {
      // 注冊(cè)應(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è)備的信息變化

該場(chǎng)景主要是系統(tǒng)配置更新時(shí)調(diào)用。例如設(shè)備的語言環(huán)境,設(shè)備橫豎屏狀態(tài),深淺模式等。

在UIAbility中onConfigurationUpdate()回調(diào)方法中實(shí)現(xiàn)監(jiān)測(cè)系統(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)當(dāng)前語言


export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    systemLanguage = this.context.config.language; // UIAbility實(shí)例首次加載時(shí),獲取系統(tǒng)當(dāng)前語言
    hilog.info(DOMAIN_NUMBER, TAG, `systemLanguage is ${systemLanguage}`);
  }


  onConfigurationUpdate(newConfig: Configuration): void {
            console.info(`envCallback onConfigurationUpdated success: ${JSON.stringify(config)}`);
        // 表示應(yīng)用程序的當(dāng)前語言,例如“zh"。
        let language = config.language;
        // 表示深淺色模式,默認(rèn)為淺色。取值范圍:
        //
        // - 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;
  }
  // ...
}

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 鴻蒙
    +關(guān)注

    關(guān)注

    60

    文章

    2620

    瀏覽量

    44063
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2126

    瀏覽量

    33085
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    深入理解HarmonyOS UIAbility:生命周期、WindowStage與啟動(dòng)模式探析

    UIAbility組件概述 UIAbility組件是HarmonyOS中一種包含UI界面的應(yīng)用組件,主要用于與用戶進(jìn)行交互。每個(gè)UIAbility組件實(shí)例對(duì)應(yīng)最近任務(wù)列表
    的頭像 發(fā)表于 02-17 15:33 ?2229次閱讀
    深入理解<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>UIAbility</b>:生命周期、WindowStage與啟動(dòng)模式探析

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

    基于Stage模型下的UIAbility開發(fā),實(shí)現(xiàn)UIAbility內(nèi)和UIAbility間頁面的跳轉(zhuǎn)。
    的頭像 發(fā)表于 05-09 15:06 ?2218次閱讀
    <b class='flag-5'>HarmonyOS</b>開發(fā)案例:【<b class='flag-5'>UIAbility</b>內(nèi)和<b class='flag-5'>UIAbility</b>間頁面的跳轉(zhuǎn)】

    鴻蒙開發(fā)-應(yīng)用程序框架UIAbility的使用

    ,都對(duì)應(yīng)于一個(gè)最近任務(wù)列表的任務(wù)。 一個(gè)應(yīng)用可以有一個(gè)UIAbility,也可以有多個(gè)UIAbility,如下圖所示。例如瀏覽器應(yīng)用可以通過一個(gè)UIAbility結(jié)合多頁面的形式讓用
    發(fā)表于 01-17 16:36

    HarmonyOS 5】VisionKit人臉活體檢測(cè)詳解

    HarmonyOS 5】VisionKit人臉活體檢測(cè)詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##
    的頭像 發(fā)表于 06-21 11:52 ?299次閱讀
    【<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>5</b>】VisionKit人臉活體檢測(cè)<b class='flag-5'>詳解</b>

    HarmonyOS 5 makeObserved接口詳解

    HarmonyOS 5】makeObserved接口詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##
    的頭像 發(fā)表于 06-16 17:58 ?287次閱讀

    HarmonyOS 5鴻蒙應(yīng)用隱私保護(hù)詳解

    HarmonyOS 5鴻蒙應(yīng)用隱私保護(hù)詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK
    的頭像 發(fā)表于 07-11 18:30 ?301次閱讀

    HarmonyOS 5鴻蒙中進(jìn)度條的使用詳解

    HarmonyOS 5鴻蒙中進(jìn)度條的使用詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SD
    的頭像 發(fā)表于 07-11 18:26 ?227次閱讀
    【<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>5</b>】<b class='flag-5'>鴻蒙</b>中進(jìn)度條的使用<b class='flag-5'>詳解</b>

    HarmonyOS 5鴻蒙星閃NearLink詳解

    HarmonyOS 5鴻蒙星閃NearLink詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS
    的頭像 發(fā)表于 07-11 18:24 ?317次閱讀
    【<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>5</b>】<b class='flag-5'>鴻蒙</b>星閃NearLink<b class='flag-5'>詳解</b>

    HarmonyOS 5鴻蒙mPaaS詳解

    HarmonyOS 5鴻蒙mPaaS詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)
    的頭像 發(fā)表于 07-11 18:23 ?286次閱讀
    【<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>5</b>】<b class='flag-5'>鴻蒙</b>mPaaS<b class='flag-5'>詳解</b>

    HarmonyOS 5】金融應(yīng)用開發(fā)鴻蒙組件實(shí)踐

    HarmonyOS 5】金融應(yīng)用開發(fā)鴻蒙組件實(shí)踐 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##
    的頭像 發(fā)表于 07-11 18:20 ?289次閱讀
    【<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>5</b>】金融應(yīng)用開發(fā)<b class='flag-5'>鴻蒙</b>組件實(shí)踐

    HarmonyOS 5鴻蒙UIAbility詳解(三)

    HarmonyOS 5鴻蒙UIAbility詳解(三) ##
    的頭像 發(fā)表于 06-14 22:32 ?50次閱讀

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

    HarmonyOS 5】桌面快捷方式功能實(shí)現(xiàn)詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##
    的頭像 發(fā)表于 06-21 16:42 ?297次閱讀
    【<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>5</b>】桌面快捷方式功能實(shí)現(xiàn)<b class='flag-5'>詳解</b>

    HarmonyOS 5 入門系列 】鴻蒙HarmonyOS示例項(xiàng)目講解

    HarmonyOS 5 入門系列 】鴻蒙HarmonyOS示例項(xiàng)目講解 ##鴻蒙開發(fā)能力 ##Har
    的頭像 發(fā)表于 07-07 11:57 ?154次閱讀
    【 <b class='flag-5'>HarmonyOS</b> <b class='flag-5'>5</b> 入門系列 】<b class='flag-5'>鴻蒙</b><b class='flag-5'>HarmonyOS</b>示例項(xiàng)目講解

    鴻蒙Stage模型與FA模型詳解

    HarmonyOS 5鴻蒙Stage模型與FA模型詳解 ##鴻蒙開發(fā)能力 ##
    的頭像 發(fā)表于 07-07 11:50 ?176次閱讀

    鴻蒙應(yīng)用px,vp,fp概念詳解

    HarmonyOS 5鴻蒙應(yīng)用px,vp,fp概念詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS
    的頭像 發(fā)表于 07-07 11:48 ?179次閱讀
    <b class='flag-5'>鴻蒙</b>應(yīng)用px,vp,fp概念<b class='flag-5'>詳解</b>