鴻蒙開(kāi)發(fā)-UIAbility

應(yīng)用的根vc, UIAbility

UIAbility生命周期狀態(tài)


UIAbility生命周期狀態(tài)

WindowStageCreate和WindowStageDestroy狀態(tài)


WindowStageCreate和WindowStageDestroy狀態(tài)
import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';


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


export default class EntryAbility extends UIAbility {
  // ...
  onWindowStageCreate(windowStage: window.WindowStage): void {
    // 設(shè)置WindowStage的事件訂閱(獲焦/失焦、切到前臺(tái)/切到后臺(tái)、前臺(tái)可交互/前臺(tái)不可交互)
    try {
      windowStage.on('windowStageEvent', (data) => {
        let stageEventType: window.WindowStageEventType = data;
        switch (stageEventType) {
          case window.WindowStageEventType.SHOWN: // 切到前臺(tái)
            hilog.info(DOMAIN_NUMBER, TAG, `windowStage foreground.`);
            break;
          case window.WindowStageEventType.ACTIVE: // 獲焦?fàn)顟B(tài)
            hilog.info(DOMAIN_NUMBER, TAG, `windowStage active.`);
            break;
          case window.WindowStageEventType.INACTIVE: // 失焦?fàn)顟B(tài)
            hilog.info(DOMAIN_NUMBER, TAG, `windowStage inactive.`);
            break;
          case window.WindowStageEventType.HIDDEN: // 切到后臺(tái)
            hilog.info(DOMAIN_NUMBER, TAG, `windowStage background.`);
            break;
          case window.WindowStageEventType.RESUMED: // 前臺(tái)可交互狀態(tài)
            hilog.info(DOMAIN_NUMBER, TAG, `windowStage resumed.`);
            break;
          case window.WindowStageEventType.PAUSED: // 前臺(tái)不可交互狀態(tài)
            hilog.info(DOMAIN_NUMBER, TAG, `windowStage paused.`);
            break;
          default:
            break;
        }
      });
    } catch (exception) {
      hilog.error(DOMAIN_NUMBER, TAG,
        `Failed to enable the listener for window stage event changes. Cause: ${JSON.stringify(exception)}`);
    }
    hilog.info(DOMAIN_NUMBER, TAG, `%{public}s`, `Ability onWindowStageCreate`);
    // 設(shè)置UI加載
    windowStage.loadContent('pages/Index', (err, data) => {
      // ...
    });
  }
}

UIAbility的啟動(dòng)模式是指UIAbility實(shí)例在啟動(dòng)時(shí)的不同呈現(xiàn)狀態(tài)。針對(duì)不同的業(yè)務(wù)場(chǎng)景,系統(tǒng)提供了三種啟動(dòng)模式:

UIAbility組件間交互(設(shè)備內(nèi))
https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717497122909477

一個(gè)UIAbility可以對(duì)應(yīng)多個(gè)頁(yè)面,在不同的場(chǎng)景下啟動(dòng)該UIAbility時(shí)需要展示不同的頁(yè)面,例如從一個(gè)UIAbility的頁(yè)面中跳轉(zhuǎn)到另外一個(gè)UIAbility時(shí),希望啟動(dòng)目標(biāo)UIAbility的指定頁(yè)面。

UIAbility的啟動(dòng)分為兩種情況:UIAbility冷啟動(dòng)和UIAbility熱啟動(dòng)。

  • UIAbility冷啟動(dòng):指的是UIAbility實(shí)例處于完全關(guān)閉狀態(tài)下被啟動(dòng),這需要完整地加載和初始化UIAbility實(shí)例的代碼、資源等。
  • UIAbility熱啟動(dòng):指的是UIAbility實(shí)例已經(jīng)啟動(dòng)并在前臺(tái)運(yùn)行過(guò),由于某些原因切換到后臺(tái),再次啟動(dòng)該UIAbility實(shí)例,這種情況下可以快速恢復(fù)UIAbility實(shí)例的狀態(tài)。

冷啟動(dòng)后可以指定進(jìn)入的頁(yè)面

import { AbilityConstant, Want, UIAbility } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window, UIContext } from '@kit.ArkUI';


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


export default class EntryAbility extends UIAbility {
  funcAbilityWant: Want | undefined = undefined;
  uiContext: UIContext | undefined = undefined;


  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 接收調(diào)用方UIAbility傳過(guò)來(lái)的參數(shù)
    this.funcAbilityWant = want;
  }


  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageCreate');
    // Main window is created, set main page for this ability
    let url = 'pages/Index';
    if (this.funcAbilityWant?.parameters?.router && this.funcAbilityWant.parameters.router === 'funcA') {
      url = 'pages/Page_ColdStartUp';
    }
    windowStage.loadContent(url, (err, data) => {
      // ...
    });
  }
}

熱啟動(dòng)流程


image.png

主要代碼

import { AbilityConstant, Want, UIAbility } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import type { Router, UIContext } from '@kit.ArkUI';
import type { BusinessError } from '@kit.BasicServicesKit';


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


export default class EntryAbility extends UIAbility {
  funcAbilityWant: Want | undefined = undefined;
  uiContext: UIContext | undefined = undefined;
  // ...
  onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    if (want?.parameters?.router && want.parameters.router === 'funcA') {
      let funcAUrl = 'pages/Page_HotStartUp';
      if (this.uiContext) {
        let router: Router = this.uiContext.getRouter();
        router.pushUrl({
          url: funcAUrl
        }).catch((err: BusinessError) => {
          hilog.error(DOMAIN_NUMBER, TAG, `Failed to push url. Code is ${err.code}, message is ${err.message}`);
        });
      }
    }
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容