應(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}`);
});
}
}
}
}