HarmonyOS 订阅系统环境变量的变化

系统环境变量是指:在应用程序运行期间,终端设备的系统设置(例如系统的语言环境、屏幕方向等)发生变化。

开发者通过订阅系统环境变化,可以使应用程序及时感知这种变化,并作出相应处理,从而提供更好的用户体验。例如,用户更改系统语言设置时,应用程序可以自动根据新的语言设置更新用户界面的语言;当用户将设备旋转到横屏或者竖屏时,应用程序可以重新布局用户界面,以适应屏幕方向和尺寸。

系统配置的变化通常由"设置"中的选项或"控制中心"中的图标触发。订阅系统环境变量变化,可以使应用程序更加智能地响应系统环境变化,从而提供更好的用户体验。查看当前支持订阅变化的系统环境变量 。

基于当前的应用模型,可以通过以下几种方式来实现订阅系统环境变量的变化。

  • 使用ApplicationContext订阅回调
  • 在AbilityStage组件容器中订阅回调
  • 在UIAbility组件中订阅回调
  • 在ExtensionAbility组件中订阅回调

使用ApplicationContext订阅回调

ApplicationContext 提供了注册回调函数以订阅系统环境变量的变化,并且可以通过调用相应的方法来撤销该回调。这有助于在资源不再需要时释放相关资源,从而提高系统的可靠性和性能。

  1. 使用ApplicationContext.on(type: 'environment', callback: EnvironmentCallback)方法,应用程序可以通过在非应用组件模块中订阅系统环境变量的变化来动态响应这些变化。例如,使用该方法在页面中监测系统语言的变化。

    import common from '@ohos.app.ability.common';
    import EnvironmentCallback from '@ohos.app.ability.EnvironmentCallback';
    import hilog from '@ohos.hilog';
    import { Configuration } from '@ohos.app.ability.Configuration';

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

    @Entry
    @Component
    struct Index {
    private context = getContext(this) as common.UIAbilityContext;
    private callbackId: number = 0; // 注册订阅系统环境变化的ID

    subscribeConfigurationUpdate(): void {
    let systemLanguage: string | undefined = this.context.config.language; // 获取系统当前语言

     // 1.获取ApplicationContext
     let applicationContext = this.context.getApplicationContext();
    
     // 2.通过applicationContext订阅环境变量变化
     let environmentCallback: EnvironmentCallback = {
       onConfigurationUpdated(newConfig: Configuration) {
         hilog.info(DOMAIN_NUMBER, TAG, `onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`);
         if (this.systemLanguage !== newConfig.language) {
           hilog.info(DOMAIN_NUMBER, TAG, `systemLanguage from ${systemLanguage} changed to ${newConfig.language}`);
           systemLanguage = newConfig.language; // 将变化之后的系统语言保存,作为下一次变化前的系统语言
         }
       },
       onMemoryLevel(level) {
         hilog.info(DOMAIN_NUMBER, TAG, `onMemoryLevel level: ${level}`);
       }
     }
     this.callbackId = applicationContext.on('environment', environmentCallback);
    

    }

    // 页面展示
    build() {
    //...
    }
    }

  2. 在资源使用完成之后,可以通过调用ApplicationContext.off(type: 'environment', callbackId: number)方法释放相关资源。

    import common from '@ohos.app.ability.common';

    @Entry
    @Component
    struct Index {
    private context = getContext(this) as common.UIAbilityContext;
    private callbackId: number = 0; // 注册订阅系统环境变化的ID

    unsubscribeConfigurationUpdate() {
    let applicationContext = this.context.getApplicationContext();
    applicationContext.off('environment', this.callbackId);
    }

    // 页面展示
    build() {
    //...
    }
    }

在AbilityStage组件容器中订阅回调

使用 AbilityStage.onConfigurationUpdate() 回调方法订阅系统环境变量的变化。当系统环境变量发生变化时,会调用该回调方法。在该方法中,通过 Configuration 对象获取最新的系统环境配置信息。可以进行相应的界面适配等操作,从而提高系统的灵活性和可维护性。

说明:

  • DevEco Studio默认工程中未自动生成AbilityStage,AbilityStage文件的创建请参见 AbilityStage组件容器 。
  • 当使用回调方法订阅系统环境变量的变化时,该回调方法会随着 AbilityStage 的生命周期而存在,在Module销毁时一并销毁。

例如,在 AbilityStage.onConfigurationUpdate() 回调方法中实现监测系统语言的变化。

import AbilityStage from '@ohos.app.ability.AbilityStage';
import hilog from '@ohos.hilog';
import type { Configuration } from '@ohos.app.ability.Configuration';

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

let systemLanguage: string | undefined; // 系统当前语言

export default class MyAbilityStage extends AbilityStage {
  onCreate(): void {
    systemLanguage = this.context.config.language; // Module首次加载时,获取系统当前语言
    hilog.info(DOMAIN_NUMBER, TAG, `systemLanguage is ${systemLanguage}`);
    //...
  }

  onConfigurationUpdate(newConfig: Configuration): void {
    hilog.info(DOMAIN_NUMBER, TAG, `onConfigurationUpdate, language: ${newConfig.language}`);
    hilog.info(DOMAIN_NUMBER, TAG, `onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`);

    if (systemLanguage !== newConfig.language) {
      hilog.info(DOMAIN_NUMBER, TAG, `systemLanguage from ${systemLanguage} changed to ${newConfig.language}`);
      systemLanguage = newConfig.language; // 将变化之后的系统语言保存,作为下一次变化前的系统语言
    }
  }
}

在UIAbility组件中订阅回调

UIAbility组件提供了UIAbility.onConfigurationUpdate()回调方法用于订阅系统环境变量的变化。当系统环境变量发生变化时,会调用该回调方法。在该方法中,通过 Configuration 对象获取最新的系统环境配置信息,而无需重启UIAbility。

说明:

当使用回调方法订阅系统环境变量的变化时,该回调方法会随着UIAbility的生命周期而存在,在UIAbility销毁时一并销毁。

例如,在onConfigurationUpdate()回调方法中实现监测系统语言的变化。

import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import hilog from '@ohos.hilog';
import UIAbility from '@ohos.app.ability.UIAbility';
import Want from '@ohos.app.ability.Want';
import { Configuration } from '@ohos.app.ability.Configuration';

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

let systemLanguage: string | undefined; // 系统当前语言

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    systemLanguage = this.context.config.language; // UIAbility实例首次加载时,获取系统当前语言
    hilog.info(DOMAIN_NUMBER, TAG, `systemLanguage is ${systemLanguage}`);
  }

  onConfigurationUpdate(newConfig: Configuration): void {
    hilog.info(DOMAIN_NUMBER, TAG, `onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`);

    if (systemLanguage !== newConfig.language) {
      hilog.info(DOMAIN_NUMBER, TAG, `systemLanguage from ${systemLanguage} changed to ${newConfig.language}`);
      systemLanguage = newConfig.language; // 将变化之后的系统语言保存,作为下一次变化前的系统语言
    }
  }

  // ...
}

在ExtensionAbility组件中订阅回调

ExtensionAbility组件提供了onConfigurationUpdate()回调方法用于订阅系统环境变量的变化。当系统环境变量发生变化时,会调用该回调方法。在该方法中,通过 Configuration 对象获取最新的系统环境配置信息。

说明:

当使用回调方法订阅系统环境变量的变化时,该回调方法会随着ExtensionAbility的生命周期而存在,在ExtensionAbility销毁时一并销毁。

以FormExtensionAbility为例说明。例如,在onConfigurationUpdate()回调方法中实现系统环境变量的变化。

import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
import { Configuration } from '@ohos.app.ability.Configuration';

export default class EntryFormAbility extends FormExtensionAbility {
  onConfigurationUpdate(newConfig: Configuration) {
    console.info(`newConfig is ${JSON.stringify(newConfig)}`);
  }

  // ...
}

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ......

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ......

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ......

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题

2.性能优化方向

3.架构方向

4.鸿蒙开发系统底层方向

5.鸿蒙音视频开发方向

6.鸿蒙车载开发方向

7.鸿蒙南向开发方向

相关推荐
weixin_431449685 小时前
web组态软件
前端·物联网·低代码·编辑器·组态
Shaun_青璇5 小时前
STM32 流水灯实验
stm32·单片机·嵌入式硬件·mcu·物联网
万少6 小时前
HarmonyOS Next 简单上手元服务开发
前端·harmonyos
启明云端wireless-tag7 小时前
乐鑫芯片模组物联网方案,实现设备快速响应控制,启明云端乐鑫代理商
物联网·乐鑫·智能设备·无线方案·esp32芯片模组
什么都什么10 小时前
YonBuilder移动开发鸿蒙版本编译教程
javascript·app·移动开发·harmonyos·yonbuilder·纯血鸿蒙·apicloud
Shaun_青璇11 小时前
stm32 点亮LED
stm32·单片机·嵌入式硬件·mcu·物联网
7yewh11 小时前
嵌入式硬件实战基础篇(三)-四层板PCB设计-步进电机驱动(TMC2208/TMC2209)
驱动开发·嵌入式硬件·mcu·物联网·硬件架构·硬件工程·pcb工艺
zhengyquan12 小时前
华为HCCDA云技术认证--分布式云架构
分布式·华为·架构·华为云·云计算·华为认证
鸿蒙自习室14 小时前
鸿蒙多线程开发——线程间数据通信对象01
ui·华为·harmonyos·鸿蒙
世界宇宙超级无敌究极特级顶级第一非常谱尼15 小时前
论文阅读——Performance Evaluation of Passive Tag to Tag Communications(一)
论文阅读·物联网·天线·信息与通信