0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙開發(fā):訂閱系統(tǒng)環(huán)境變量的變化

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-06-11 21:56 ? 次閱讀

訂閱系統(tǒng)環(huán)境變量的變化

系統(tǒng)環(huán)境變量是指:在應(yīng)用程序運(yùn)行期間,終端設(shè)備的系統(tǒng)設(shè)置(例如系統(tǒng)的語言環(huán)境、屏幕方向等)發(fā)生變化。

開發(fā)者通過訂閱系統(tǒng)環(huán)境變化,可以使應(yīng)用程序及時(shí)感知這種變化,并作出相應(yīng)處理,從而提供更好的用戶體驗(yàn)。例如,用戶更改系統(tǒng)語言設(shè)置時(shí),應(yīng)用程序可以自動根據(jù)新的語言設(shè)置更新用戶界面的語言;當(dāng)用戶將設(shè)備旋轉(zhuǎn)到橫屏或者豎屏?xí)r,應(yīng)用程序可以重新布局用戶界面,以適應(yīng)屏幕方向和尺寸。

系統(tǒng)配置的變化通常由“設(shè)置”中的選項(xiàng)或“控制中心”中的圖標(biāo)觸發(fā)。訂閱系統(tǒng)環(huán)境變量變化,可以使應(yīng)用程序更加智能地響應(yīng)系統(tǒng)環(huán)境變化,從而提供更好的用戶體驗(yàn)。查看當(dāng)前支持訂閱變化的系統(tǒng)環(huán)境變量,請參見[Configuration]。

基于當(dāng)前的應(yīng)用模型,可以通過以下幾種方式來實(shí)現(xiàn)訂閱系統(tǒng)環(huán)境變量的變化。

  • [使用ApplicationContext訂閱回調(diào)]
  • [在AbilityStage組件容器中訂閱回調(diào)]
  • [在UIAbility組件中訂閱回調(diào)]
  • [在ExtensionAbility組件中訂閱回調(diào)]
  • 發(fā)前請熟悉鴻蒙開發(fā)指導(dǎo)文檔 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

使用ApplicationContext訂閱回調(diào)

[ApplicationContext]提供了注冊回調(diào)函數(shù)以訂閱系統(tǒng)環(huán)境變量的變化,并且可以通過調(diào)用相應(yīng)的方法來撤銷該回調(diào)。這有助于在資源不再需要時(shí)釋放相關(guān)資源,從而提高系統(tǒng)的可靠性和性能。

  1. 使用ApplicationContext.on(type: 'environment', callback: EnvironmentCallback)方法,應(yīng)用程序可以通過在非應(yīng)用組件模塊中訂閱系統(tǒng)環(huán)境變量的變化來動態(tài)響應(yīng)這些變化。例如,使用該方法在頁面中監(jiān)測系統(tǒng)語言的變化。
    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; // 注冊訂閱系統(tǒng)環(huán)境變化的ID
    
      subscribeConfigurationUpdate(): void {
        let systemLanguage: string | undefined = this.context.config.language; // 獲取系統(tǒng)當(dāng)前語言
    
        // 1.獲取ApplicationContext
        let applicationContext = this.context.getApplicationContext();
    
        // 2.通過applicationContext訂閱環(huán)境變量變化
        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; // 將變化之后的系統(tǒng)語言保存,作為下一次變化前的系統(tǒng)語言
            }
          },
          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. 在資源使用完成之后,可以通過調(diào)用ApplicationContext.off(type: 'environment', callbackId: number)方法釋放相關(guān)資源。
    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; // 注冊訂閱系統(tǒng)環(huán)境變化的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組件容器中訂閱回調(diào)

使用[AbilityStage.onConfigurationUpdate()]回調(diào)方法訂閱系統(tǒng)環(huán)境變量的變化。當(dāng)系統(tǒng)環(huán)境變量發(fā)生變化時(shí),會調(diào)用該回調(diào)方法。在該方法中,通過[Configuration]對象獲取最新的系統(tǒng)環(huán)境配置信息??梢赃M(jìn)行相應(yīng)的界面適配等操作,從而提高系統(tǒng)的靈活性和可維護(hù)性。

說明:

  • DevEco Studio默認(rèn)工程中未自動生成AbilityStage,AbilityStage文件的創(chuàng)建請參見[AbilityStage組件容器]。
  • 當(dāng)使用回調(diào)方法訂閱系統(tǒng)環(huán)境變量的變化時(shí),該回調(diào)方法會隨著[AbilityStage]的生命周期而存在,在Module銷毀時(shí)一并銷毀。

例如,在[AbilityStage.onConfigurationUpdate()]回調(diào)方法中實(shí)現(xiàn)監(jiān)測系統(tǒng)語言的變化。

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; // 系統(tǒng)當(dāng)前語言

export default class MyAbilityStage extends AbilityStage {
  onCreate(): void {
    systemLanguage = this.context.config.language; // Module首次加載時(shí),獲取系統(tǒng)當(dāng)前語言
    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; // 將變化之后的系統(tǒng)語言保存,作為下一次變化前的系統(tǒng)語言
    }
  }
}

在UIAbility組件中訂閱回調(diào)

UIAbility組件提供了UIAbility.onConfigurationUpdate()回調(diào)方法用于訂閱系統(tǒng)環(huán)境變量的變化。當(dāng)系統(tǒng)環(huán)境變量發(fā)生變化時(shí),會調(diào)用該回調(diào)方法。在該方法中,通過[Configuration]對象獲取最新的系統(tǒng)環(huán)境配置信息,而無需重啟UIAbility。

說明:

當(dāng)使用回調(diào)方法訂閱系統(tǒng)環(huán)境變量的變化時(shí),該回調(diào)方法會隨著UIAbility的生命周期而存在,在UIAbility銷毀時(shí)一并銷毀。

例如,在onConfigurationUpdate()回調(diào)方法中實(shí)現(xiàn)監(jiān)測系統(tǒng)語言的變化。

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; // 系統(tǒng)當(dāng)前語言

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    systemLanguage = this.context.config.language; // UIAbility實(shí)例首次加載時(shí),獲取系統(tǒng)當(dāng)前語言
    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; // 將變化之后的系統(tǒng)語言保存,作為下一次變化前的系統(tǒng)語言
    }
  }
  // ...
}

在ExtensionAbility組件中訂閱回調(diào)

ExtensionAbility組件提供了onConfigurationUpdate()回調(diào)方法用于訂閱系統(tǒng)環(huán)境變量的變化。當(dāng)系統(tǒng)環(huán)境變量發(fā)生變化時(shí),會調(diào)用該回調(diào)方法。在該方法中,通過[Configuration]對象獲取最新的系統(tǒng)環(huán)境配置信息。
搜狗高速瀏覽器截圖20240326151450.png

說明:
HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿
當(dāng)使用回調(diào)方法訂閱系統(tǒng)環(huán)境變量的變化時(shí),該回調(diào)方法會隨著ExtensionAbility的生命周期而存在,在ExtensionAbility銷毀時(shí)一并銷毀。

以FormExtensionAbility為例說明。例如,在onConfigurationUpdate()回調(diào)方法中實(shí)現(xiàn)系統(tǒng)環(huán)境變量的變化。

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));
  }

  // ...
}

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    609

    瀏覽量

    28290
  • 組件
    +關(guān)注

    關(guān)注

    1

    文章

    499

    瀏覽量

    17774
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2295

    瀏覽量

    42635
收藏 人收藏

    評論

    相關(guān)推薦

    Linux環(huán)境變量配置方法

    Linux上環(huán)境變量配置分為設(shè)置永久變量和臨時(shí)變量兩種。環(huán)境變量設(shè)置方法同時(shí)要考慮環(huán)境Shell類型,不同類型的SHELL設(shè)置臨時(shí)
    的頭像 發(fā)表于 10-23 13:39 ?60次閱讀

    鴻蒙Flutter實(shí)戰(zhàn):02-Windows環(huán)境搭建踩坑指南

    環(huán)境搭建 1. 下載Flutter SDK,配置環(huán)境變量 鴻蒙 Flutter SDK 需要在 Gitee 下載。目前建議下載 dev 分支代碼。 需要配置以下用戶變量 注意
    發(fā)表于 10-22 15:05

    Xilinx設(shè)計(jì)工具怎么設(shè)置環(huán)境變量

    如果您不確定如何設(shè)置環(huán)境變量,嘗試"1" 或 "TRUE"。
    的頭像 發(fā)表于 10-22 13:32 ?86次閱讀

    鴻蒙Flutter實(shí)戰(zhàn):01-搭建開發(fā)環(huán)境

    ; 如果要適配ios,需要安裝Xcode Mac 安裝(推薦) 環(huán)境變量配置 # Flutter Mirror export PUB_HOSTED_URL=https
    發(fā)表于 10-21 19:35

    請問ENV設(shè)置環(huán)境變量怎么保存?

    我按照手冊設(shè)置好了環(huán)境變量 可是如果重啟一下env窗口 剛剛設(shè)置的又清掉了 請問下有沒有人知道怎么保存這個(gè)環(huán)境變量
    發(fā)表于 07-09 06:24

    utuntu環(huán)境下,ESP32和ESP8266設(shè)置環(huán)境變量時(shí)有沖突,怎樣兼容呢?

    ubuntu環(huán)境下,ESP32和ESP8266同時(shí)開發(fā),設(shè)置環(huán)境變量PATH時(shí)遇到疑問,如下: export PATH=\"$HOME/esp/xtensa-esp32-elf/bin
    發(fā)表于 06-28 11:10

    Linux系統(tǒng)中設(shè)置環(huán)境變量的方法和技巧

    在Linux中環(huán)境變量是一種保存有關(guān)系統(tǒng)環(huán)境配置的信息的對象。它們被廣泛用于存儲有關(guān)系統(tǒng)操作的信息比如路徑、文件名等。通過合理配置環(huán)境變量
    的頭像 發(fā)表于 02-01 11:09 ?1590次閱讀
    Linux<b class='flag-5'>系統(tǒng)</b>中設(shè)置<b class='flag-5'>環(huán)境變量</b>的方法和技巧

    嵌入式學(xué)習(xí)-ElfBoard ELF 1板卡-配置環(huán)境變量永久生效的方法

    手冊中提供的配置環(huán)境變量的方法僅臨時(shí)生效,如果出現(xiàn)更換終端的情況,需要重新配置環(huán)境變量,這樣就比較麻煩。下面提供一種配置環(huán)境變量永久生效的方法,省去多次執(zhí)行環(huán)境變量的步驟:1.vi打開
    發(fā)表于 01-17 15:19

    Linux環(huán)境變量配置方法

    想必大家平時(shí)工作中也會配置Linux的環(huán)境變量,但是可能也僅僅是為解決某些工具的運(yùn)行環(huán)境,對于Linux環(huán)境變量本身的配置學(xué)問還沒深入了解。今天浩道跟大家分享Linux環(huán)境變量的硬核干
    的頭像 發(fā)表于 01-04 09:51 ?462次閱讀

    ros怎么設(shè)置環(huán)境變量

    設(shè)置ROS環(huán)境變量是使用ROS的重要步驟之一。本文將詳細(xì)介紹如何設(shè)置ROS環(huán)境變量,包括什么是環(huán)境變量、為什么要設(shè)置ROS環(huán)境變量、如何設(shè)置ROS環(huán)
    的頭像 發(fā)表于 12-28 13:52 ?1784次閱讀

    python環(huán)境變量的配置pip

    Python環(huán)境變量的配置和使用是每個(gè)Python開發(fā)者都需要了解和掌握的基本技能之一。在本文中,我們將詳細(xì)介紹如何正確配置Python環(huán)境變量,并展示一些常見問題的解決方法。我們將從環(huán)境變量
    的頭像 發(fā)表于 12-15 15:41 ?2237次閱讀

    如何配置jdk的環(huán)境變量

    配置JDK的環(huán)境變量是在操作系統(tǒng)中設(shè)置一些路徑,以便能夠在命令提示符或終端中全局運(yùn)行Java開發(fā)工具。這樣,您可以在任何位置運(yùn)行Java程序。 以下是一步一步的指南來配置JDK的環(huán)境變量
    的頭像 發(fā)表于 12-06 15:07 ?728次閱讀

    idea要配置java環(huán)境變量

    環(huán)境變量的步驟及其重要性。 在開始之前,我們先了解一下環(huán)境變量的概念。環(huán)境變量是操作系統(tǒng)定義的一些值,用于指定操作系統(tǒng)及其應(yīng)用程序如何運(yùn)行。
    的頭像 發(fā)表于 12-06 14:02 ?679次閱讀

    pycharm怎么配置python環(huán)境變量

    正確的 Python 環(huán)境變量是非常重要的,因?yàn)樗鼤绊懙巾?xiàng)目的運(yùn)行和依賴包的安裝。本文將詳細(xì)介紹如何在 PyCharm 中配置 Python 環(huán)境變量。 PyCharm 支持在全局和項(xiàng)目級別配置
    的頭像 發(fā)表于 11-29 14:56 ?2589次閱讀

    安裝python怎么添加到環(huán)境變量

    Python是一種簡單易學(xué)的腳本語言,廣泛應(yīng)用于開發(fā)各種類型的應(yīng)用程序。為了在Windows操作系統(tǒng)上使用Python的命令行工具,需要將Python添加到系統(tǒng)環(huán)境變量中。本文將向您
    的頭像 發(fā)表于 11-23 16:40 ?2709次閱讀