一、AbilityStage
1、基本概念
-
AbilityStage是一个Module级别的组件容器,当HAP中的代码首次被加载到进程中的时候,系统会先创建AbilityStage实例。可以对该Module进行初始化等操作。
-
AbilityStage与Module一一对应,即一个Module拥有一个AbilityStage。
2、生命周期和回调
import { AbilityStage, Want } from '@kit.AbilityKit';
export default class MyAbilityStage extends AbilityStage {
onCreate(): void {
// 应用HAP首次加载时触发,可以在此执行该Module的初始化操作(例如资源预加载、线程创建等)。
}
onAcceptWant(want: Want): string {
// 仅specified模式下触发
return 'MyAbilityStage';
}
}
- onCreate():在开始加载对应Module的第一个UIAbility实例之前会先创建AbilityStage,创建完成后执行onCreate()生命周期回调。可以在此进行该Module的初始化。
- onAcceptWant()事件回调:UIAbility指定实例模式(specified)启动时候触发的事件回调。
- onConfigurationUpdated()事件回调:当系统全局配置发生变更时触发的事件,系统语言、深浅色等,配置项目前均定义在Configuration类中。
- onMemoryLevel()事件回调:当系统调整内存时触发的事件。
二、WindowStage
1、基本概念
每一个UIAbility实例都对应持有一个WindowStage实例。WindowStage为本地窗口管理器,用于管理窗口相关的内容,例如与界面相关的获焦/失焦、可见/不可见。
应用场景
- 设置应用主窗口属性及目标页面
- 设置应用子窗口属性及目标页面
- 体验窗口沉浸式能力
- 设置悬浮窗
- 监听窗口不可交互与可交互事件
2、创建时机
UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage。
3、WindowStage生命周期
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 {
// 设置WindowStage的事件订阅(获焦/失焦、切到前台/切到后台、前台可交互/前台不可交互)
try {
windowStage.on('windowStageEvent', (data) => {
let stageEventType: window.WindowStageEventType = data;
switch (stageEventType) {
case window.WindowStageEventType.SHOWN: // 切到前台
break;
case window.WindowStageEventType.ACTIVE: // 获焦状态
break;
case window.WindowStageEventType.INACTIVE: // 失焦状态
break;
case window.WindowStageEventType.HIDDEN: // 切到后台
break;
case window.WindowStageEventType.RESUMED: // 前台可交互状态
break;
case window.WindowStageEventType.PAUSED: // 前台不可交互状态
break;
default:
break;
}
});
} catch (exception) {
}
// 设置UI加载
windowStage.loadContent('pages/Index', (err, data) => {
// ...
});
}
onWindowStageDestroy() {
// 释放UI资源
}
}
- onWindowStageCreate回调中通过loadContent()方法设置应用要加载的页面,并根据需要调用on('windowStageEvent')方法订阅WindowStage的事件(获焦/失焦、切到前台/切到后台、前台可交互/前台不可交互)。
三、Context
1、基本概念
应用中对象的上下文,其提供了应用的一些基础信息,例如resourceManager(资源管理)、applicationInfo(当前应用信息)、dir(应用文件路径)、area(文件分区)等,以及应用的一些基本方法。UIAbility组件和各种ExtensionAbility派生类组件都有各自不同的Context类。
1.1 ApplicationContext
应用级别的Context。在基类Context的基础上提供了订阅应用内应用组件的生命周期的变化、订阅系统内存变化和订阅应用内系统环境的变化的能力。
在UIAbility、ExtensionAbility、AbilityStage中均可以获取。
import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
let applicationContext = this.context.getApplicationContext();
//...
}
}
进程内UIAbility生命周期
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
// 定义生命周期回调对象
let abilityLifecycleCallback: AbilityLifecycleCallback = {
// 当UIAbility创建时被调用
onAbilityCreate(uiAbility) {
},
// 当窗口创建时被调用
onWindowStageCreate(uiAbility, windowStage: window.WindowStage) {
},
// 当窗口处于活动状态时被调用
onWindowStageActive(uiAbility, windowStage: window.WindowStage) {
},
// 当窗口处于非活动状态时被调用
onWindowStageInactive(uiAbility, windowStage: window.WindowStage) {
},
// 当窗口被销毁时被调用
onWindowStageDestroy(uiAbility, windowStage: window.WindowStage) {
},
// 当UIAbility被销毁时被调用
onAbilityDestroy(uiAbility) {
},
// 当UIAbility从后台转到前台时触发回调
onAbilityForeground(uiAbility) {
},
// 当UIAbility从前台转到后台时触发回调
onAbilityBackground(uiAbility) {
},
// 当UIAbility迁移时被调用
onAbilityContinue(uiAbility) {
}
}
// 获取应用上下文
let applicationContext = this.context.getApplicationContext();
// 注册应用内生命周期回调
this.lifecycleId = applicationContext.on('abilityLifecycle', abilityLifecycleCallback);
}
...
onDestroy() {
// 获取应用上下文
let applicationContext = this.context.getApplicationContext();
// 取消应用内生命周期回调
applicationContext.off('abilityLifecycle', this.lifecycleId);
}
}
系统环境变量监控
subscribeConfigurationUpdate() {
let systemLanguage: string | undefined = this.context.config.language; // 获取系统当前语言
// 1.获取ApplicationContext
let applicationContext = this.context.getApplicationContext();
// 2.通过applicationContext订阅环境变量变化
let environmentCallback: EnvironmentCallback = {
onConfigurationUpdated(newConfig: Configuration) {
console.info(`onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`);
if (this.systemLanguage !== newConfig.language) {
console.info(`systemLanguage from ${systemLanguage} changed to ${newConfig.language}`);
systemLanguage = newConfig.language; // 将变化之后的系统语言保存,作为下一次变化前的系统语言
}
},
onMemoryLevel(level) {
console.info(`onMemoryLevel level: ${level}`);
}
}
this.callbackId = applicationContext.on('environment', environmentCallback);
}
1.2 AbilityStageContext
Module级别的Context,额外提供HapModuleInfo、Configuration等信息。
import { AbilityStage } from '@kit.AbilityKit';
export default class MyAbilityStage extends AbilityStage {
onCreate(): void {
let abilityStageContext = this.context;
//...
}
}
1.3 UIAbilityContext
每个UIAbility中都包含了一个Context属性,提供操作应用组件、获取应用组件的配置信息等能力。
import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
let uiAbilityContext = this.context;
//...
}
}
1.4 ExtensionContext
特定场景的ExtensionContex
import { ServiceExtensionAbility, Want } from '@kit.AbilityKit';
export default class ServiceExtAbility extends ServiceExtensionAbility {
onCreate(want: Want) {
let serviceExtensionContext = this.context;
//...
}
}
2、继承关系
3、持有关系
四、Want
1、基本概念
Want是一种对象,用于在应用组件之间传递信息,常见的使用场景是作为startAbility()方法的参数。
2、显式Want
在启动目标应用组件时,调用方传入的want参数中指定了abilityName和bundleName。
//显式Want
let wantInfo: Want = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.example.myapplication',
abilityName: 'FuncAbility',
}
3、隐式Want
在启动目标应用组件时,调用方传入的want参数中未指定abilityName。
//隐式Want
let wantInfo: Want = {
action: 'ohos.want.action.search',
entities: [ 'entity.system.browsable' ],
uri: 'https://www.test.com:8080/query/student',
type: 'text/plain',
};
隐式调用的结果
- 未匹配到满足条件的应用组件:启动失败。
- 匹配到一个满足条件的应用组件:直接启动该应用组件。
- 匹配到多个满足条件的应用组件(UIAbility):弹出选择框让用户选择。