0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙开发:订阅系统环境变量的变化

jf_46214456 ? 来源:jf_46214456 ? 作者:jf_46214456 ? 2024-06-11 21:56 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

订阅系统环境变量的变化

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

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

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

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

  • [使用ApplicationContext订阅回调]
  • [在AbilityStage组件容器中订阅回调]
  • [在UIAbility组件中订阅回调]
  • [在ExtensionAbility组件中订阅回调]
  • 发前请熟悉鸿蒙开发指导文档 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

使用ApplicationContext订阅回调

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

  1. 使用ApplicationContext.on(type: 'environment', callback: EnvironmentCallback)方法,应用程序可以通过在非应用组件模块中订阅系统环境变量的变化来动态响应这些变化。例如,使用该方法在页面中监测系统语言的变化。
    import common from '@ohos.app.ability.common';
    import EnvironmentCallback from '@ohos.app.ability.EnvironmentCallback';
    import { BusinessError } from '@ohos.base';
    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}`);
          }
        }
        try {
          this.callbackId = applicationContext.on('environment', environmentCallback);
        } catch (err) {
          let code = (err as BusinessError).code;
          let message = (err as BusinessError).message;
          hilog.error(DOMAIN_NUMBER, TAG, `Failed to register applicationContext. Code is ${code}, message is ${message}`);
        };
      }
    
      // 页面展示
      build() {
        //...
      }
    }
    
  2. 在资源使用完成之后,可以通过调用ApplicationContext.off(type: 'environment', callbackId: number)方法释放相关资源。
    import common from '@ohos.app.ability.common';
    import { BusinessError } from '@ohos.base';
    import hilog from '@ohos.hilog';
    
    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
    
      unsubscribeConfigurationUpdate() {
        let applicationContext = this.context.getApplicationContext();
        try {
           applicationContext.off('environment', this.callbackId);
        } catch (err) {
           let code = (err as BusinessError).code;
           let message = (err as BusinessError).message;
           hilog.error(DOMAIN_NUMBER, TAG, `Failed to unregister applicationContext. Code is ${code}, message is ${message}`);
        };
    
      }
    
      // 页面展示
      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]对象获取最新的系统环境配置信息。
搜狗高速浏览器截图20240326151450.png

说明:
HarmonyOSOpenHarmony鸿蒙文档籽料:mau123789是v直接拿
当使用回调方法订阅系统环境变量的变化时,该回调方法会随着ExtensionAbility的生命周期而存在,在ExtensionAbility销毁时一并销毁。

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

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

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

export default class EntryFormAbility extends FormExtensionAbility {
  onConfigurationUpdate(config: Configuration) {
    hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onConfigurationUpdate:' + JSON.stringify(config));
  }

  // ...
}

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 变量
    +关注

    关注

    0

    文章

    614

    浏览量

    29012
  • 组件
    +关注

    关注

    1

    文章

    533

    浏览量

    18468
  • 鸿蒙
    +关注

    关注

    60

    文章

    2643

    浏览量

    44234
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【HarmonyOS 5】金融应用开发鸿蒙组件实践

    原生鸿蒙操作系统星河版,面向开发者开放申请,余承东宣布鸿蒙生态设备数达 8 亿台;建设银行、邮储银行等完成鸿蒙原生应用 Beta 版本
    的头像 发表于 07-11 18:20 ?341次阅读
    【HarmonyOS 5】金融应用<b class='flag-5'>开发</b><b class='flag-5'>鸿蒙</b>组件实践

    【HarmonyOS 5】鸿蒙中的UIAbility详解(二)

    【HarmonyOS 5】鸿蒙中的UIAbility详解(二) ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言 今天我们继续深入讲解
    的头像 发表于 07-11 18:17 ?325次阅读
    【HarmonyOS 5】<b class='flag-5'>鸿蒙</b>中的UIAbility详解(二)

    飞凌嵌入式ElfBoard ELF 1板卡-uboot常用命令之环境变量命令

    作为环境变量的初始值,uboot运行过程中用到的环境变量,都是内存中的环境变量,用户可以使用saveenv指令将内存中的环境变量重新写入存储介质(启动介质)中,下次重启
    发表于 05-22 11:28

    【贝启科技BQ3568HM开源鸿蒙开发板深度试用报告】系统镜像编译和烧录

    从贝启开源社区: BQ3568HM开源鸿蒙系统主板资料汇总帖-开源鸿蒙技术交流-Bearkey-开源社区 ,可以获取 贝启科技BQ3568HM开源鸿蒙
    发表于 03-16 10:53

    AIGC入门及鸿蒙入门

    、小巧、功能强大等特点,能够在物联网时代为用户提供更加便捷、高效的服务。 2. 开发环境搭建: 下载并安装DevEco Studio,这是华为官方为鸿蒙系统开发提供的集成
    发表于 01-13 10:32

    USB 一线通监控副屏

    环境搭建环境变量配置为了提高一些编译的速度,选择了在Linux系统下进行开发,在Linux上开发N947需要先安装e
    的头像 发表于 12-07 01:10 ?435次阅读
    USB 一线通监控副屏

    鸿蒙Flutter实战:10-常见问题集合

    initializing the Dart VM 依次执行以下操作 设置环境变量 export FLUTTER_STORAGE_BASE_URL=https
    发表于 10-23 17:05

    鸿蒙Flutter实战:07混合开发

    。 其优点是主项目开发者可以不关注Flutter实现,不需要安装配置Flutter开发环境,缺点是无法及时修改Flutter代码,也不存在热重载。 ## 2.基于源码 通过源码依赖的当时,在原生
    发表于 10-23 16:00

    Linux环境变量配置方法

    Linux上环境变量配置分为设置永久变量和临时变量两种。环境变量设置方法同时要考虑环境Shell类型,不同类型的SHELL设置临时
    的头像 发表于 10-23 13:39 ?798次阅读

    鸿蒙Flutter实战:02-Windows环境搭建踩坑指南

    环境搭建 1. 下载Flutter SDK,配置环境变量 鸿蒙 Flutter SDK 需要在 Gitee 下载。目前建议下载 dev 分支代码。 需要配置以下用户变量 注意
    发表于 10-22 15:05

    Xilinx设计工具怎么设置环境变量

    如果您不确定如何设置环境变量,尝试"1" 或 "TRUE"。
    的头像 发表于 10-22 13:32 ?668次阅读

    鸿蒙Flutter实战:01-搭建开发环境

    ; 如果要适配ios,需要安装Xcode Mac 安装(推荐) 环境变量配置 # Flutter Mirror export PUB_HOSTED_URL=https
    发表于 10-21 19:35

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-开发环境搭建之交叉编译

    不同的cpu的对应的可执行的二进制文件。交叉编译链安装建立交叉编译环境又可分为安装SDK(其中包含了交叉编译工具链)和设置交叉编译环境变量。SDK路径:EF1开发板资料包/06-常用工具/06-1 编译
    发表于 09-30 09:36

    飞凌嵌入式ElfBoard ELF 1板卡-开发环境搭建之交叉编译

    不同的cpu的对应的可执行的二进制文件。交叉编译链安装建立交叉编译环境又可分为安装SDK(其中包含了交叉编译工具链)和设置交叉编译环境变量。SDK路径:EF1开发板资料包/06-常用工具/06-1 编译
    发表于 09-29 09:51

    基于ArkTS语言的OpenHarmony APP应用开发:公共事件的订阅和发布

    1、程序介绍 本示例主要展示了公共事件相关的功能,实现了一个检测用户部分行为的应用。 具体而言,本案例实现了如下几个公共事件功能: 通过订阅系统公共事件,实现对用户操作行为(亮灭屏、断联网)的监测
    发表于 09-18 13:16