鸿蒙开发——AbilityStage、WindowStage、Context

803 阅读5分钟

一、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。

image.png

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、继承关系

image.png

3、持有关系

image.png

四、Want

1、基本概念

Want是一种对象,用于在应用组件之间传递信息,常见的使用场景是作为startAbility()方法的参数。

image.png

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):弹出选择框让用户选择。