• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 获取/设置环境变量
2
3<!--Kit: Ability Kit-->
4<!--Subsystem: Ability-->
5<!--Owner: @wkljy; @xuzhihao666-->
6<!--Designer: @li-weifeng2-->
7<!--Tester: @lixueqing513-->
8<!--Adviser: @huipeizi-->
9
10环境变量涵盖了所有可能影响应用运行时的环境配置信息,包括应用可指定的内部环境变量(字体大小、外观、语言等)和应用可感知的外部环境变量(屏幕方向等)。
11
12通常条件下,环境变量会跟随系统设置变化。
13
14## 使用场景
15|  场景   |  说明       |  约束限制  | 场景举例   |
16|------------|-------------------|-------------|-----------------|
17| [获取环境变量](#获取环境变量) | 开发者可以使用[getConfigurationSync](../reference/apis-localization-kit/js-apis-resource-manager.md#getconfigurationsync10)主动获取当前环境变量,包括深浅色模式、屏幕方向、语言地区、屏幕密度、设备类型等。        | 当前仅支持同步获取,使用方式参考[ResourceManager.getConfigurationSync](../reference/apis-localization-kit/js-apis-resource-manager.md#getconfigurationsync10)。  |应用运行过程中,可以主动获取当前应用深浅色模式,以更新用户界面显示。  |
18| [设置环境变量](#设置环境变量) | 当前仅支持应用自定义字体大小、深浅色、语言。<br>- [设置字体大小](#设置字体大小)<br>- [设置深浅色模式](#设置深浅色模式)<br>- [设置应用语言](#设置应用语言) |  当应用设置环境变量后,应用将无法通过订阅感知到对应的环境变量在系统中的变化。   |  应用自定义字体大小,以提升用户体验。 |
19| [订阅环境变量](#订阅环境变量) | 通过订阅环境变量,及时感知系统环境变化 。支持订阅的环境变量包括语言、深浅色、屏幕方向等,详见参见[Configuration](../reference/apis-ability-kit/js-apis-app-ability-configuration.md)。                   |    - 如果开发者将环境变量配置为不跟随系统变化(即[configuration标签](../quick-start/app-configuration-file.md#configuration标签)中的对应字段取值为“nonFollowSystem”),应用将无法通过订阅感知对应的环境变量在系统中的变化。<br>- 应用订阅环境变量后,当应用处于后台时,环境变量发生变更,应用将无法实时收到订阅通知。相关通知推送会被延迟处理,待应用切换回前台时,才会收到订阅通知。 | 当用户旋转设备屏幕时,应用可以通过订阅环境变量感知环境变化重新布局用户界面,以适应屏幕方向和尺寸。 |
20
21
22## 获取环境变量
23
24开发者可以使用[getConfigurationSync](../../application-dev/reference/apis-localization-kit/js-apis-resource-manager.md#getconfigurationsync10)主动获取当前[环境变量](../../application-dev/reference/apis-localization-kit/js-apis-resource-manager.md#configuration),包括深浅色模式、屏幕方向、语言地区、屏幕密度、设备类型等,对应用程序作出相应处理,提供更好的用户体验。
25
26  ```ts
27  import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
28
29  export default class EntryAbility extends UIAbility {
30    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
31      try {
32        let value = this.context.resourceManager.getConfigurationSync();
33        // 屏幕方向
34        let direction = value.direction;
35        // 语言文字国家地区
36        let locale = value.locale;
37      } catch (error) {
38        console.error("getConfigurationSync error is " + error);
39      }
40    }
41  }
42  ```
43
44## 设置环境变量
45
46支持应用自定义的环境变量包括[字体大小](#设置字体大小)、[深浅色模式](#设置深浅色模式)、[应用语言](#设置应用语言),其他环境变量(例如屏幕方向等)均不支持直接设置。
47
48### 设置字体大小
49
50应用字体大小默认不跟随系统变化,开发者可以通过将[configuration标签](../quick-start/app-configuration-file.md#configuration标签)中fontSizeScale的值配置为followSystem,使得应用字体大小跟随系统变化。
51
52开发者可以使用[setFontSizeScale](../reference/apis-ability-kit/js-apis-inner-application-applicationContext.md#applicationcontextsetfontsizescale13)设置应用字体大小。设置后,应用字体将不跟随系统变化,不再支持订阅系统字体大小变化。
53
54```ts
55import { UIAbility } from '@kit.AbilityKit';
56import { window } from '@kit.ArkUI';
57
58export default class MyAbility extends UIAbility {
59  onWindowStageCreate(windowStage: window.WindowStage) {
60    windowStage.loadContent('pages/Index', (err, data) => {
61      if (err.code) {
62        return;
63      }
64    });
65    let applicationContext = this.context.getApplicationContext();
66    applicationContext.setFontSizeScale(2);
67  }
68}
69```
70
71### 设置深浅色模式
72
73应用深浅色模式默认跟随系统。开发者可以自定义应用或组件的深浅色模式。
74
75配置生效的优先级为:UIAbility/UIExtensionAbility的深浅色模式 > 应用的深浅色模式 > 系统的深浅色模式。
76
77- **设置应用的深浅色模式:** 使用ApplicationContext的[setColorMode](../reference/apis-ability-kit/js-apis-inner-application-applicationContext.md#applicationcontextsetcolormode11)接口,可以设置应用深浅色模式。
78
79    ```ts
80    import { UIAbility, ConfigurationConstant } from '@kit.AbilityKit';
81    import { hilog } from '@kit.PerformanceAnalysisKit';
82    import { window } from '@kit.ArkUI';
83
84    export default class MyAbility extends UIAbility {
85      onWindowStageCreate(windowStage: window.WindowStage) {
86        windowStage.loadContent('pages/Index', (err, data) => {
87          if (err.code) {
88            hilog.error(0x0000, 'testTag', 'Failed to load the content.');
89            return;
90          }
91          let applicationContext = this.context.getApplicationContext();
92          applicationContext.setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_DARK);
93        });
94      }
95    }
96    ```
97
98- **设置UIAbility的深浅色模式:** 使用UIAbilityContext的[setColorMode](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#setcolormode18),可以设置UIAbility的深浅色模式。
99
100    ```ts
101    import { UIAbility, ConfigurationConstant } from '@kit.AbilityKit';
102    import { hilog } from '@kit.PerformanceAnalysisKit';
103    import { window } from '@kit.ArkUI';
104
105    export default class MyAbility extends UIAbility {
106      onWindowStageCreate(windowStage: window.WindowStage) {
107        windowStage.loadContent('pages/Index', (err, data) => {
108          if (err.code) {
109            hilog.error(0x0000, 'testTag', 'Failed to load the content.');
110            return;
111          }
112          let uiAbilityContext = this.context;
113          uiAbilityContext.setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_DARK);
114        });
115      }
116    }
117    ```
118
119- **设置UIExtensionAbility的深浅色模式:** 使用UIExtensionContext的[setColorMode](../reference/apis-ability-kit/js-apis-inner-application-uiExtensionContext.md#setcolormode18),可以设置UIExtensionAbility的深浅色模式。
120
121    ```ts
122    // UIExtensionAbility不支持三方应用直接继承,故以派生类ShareExtensionAbility举例说明。
123    import { ShareExtensionAbility, ConfigurationConstant } from '@kit.AbilityKit';
124
125    export default class MyAbility extends ShareExtensionAbility {
126      onForeground() {
127        let uiExtensionContext = this.context;
128        uiExtensionContext.setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_DARK);
129      }
130    }
131    ```
132
133### 设置应用语言
134
135应用语言默认跟随系统语言变化。开发者可以使用[setLanguage](../reference/apis-ability-kit/js-apis-inner-application-applicationContext.md#applicationcontextsetlanguage11)设置应用语言。设置后,不再支持订阅系统语言变化。
136
137```ts
138import { UIAbility } from '@kit.AbilityKit';
139import { hilog } from '@kit.PerformanceAnalysisKit';
140import { window } from '@kit.ArkUI';
141
142export default class MyAbility extends UIAbility {
143  onWindowStageCreate(windowStage: window.WindowStage) {
144    windowStage.loadContent('pages/Index', (err, data) => {
145      if (err.code) {
146        hilog.error(0x0000, 'testTag', 'Failed to load the content.');
147        return;
148      }
149      let applicationContext = this.context.getApplicationContext();
150      applicationContext.setLanguage('zh-cn');
151    });
152  }
153}
154```
155
156## 订阅环境变量
157
158系统配置的变化通常由“设置”中的选项或“控制中心”中的图标触发。订阅环境变量变化,可以使应用程序更加智能地响应系统环境变化,从而提供更好的用户体验。查看当前支持订阅变化的环境变量,请参见[Configuration](../reference/apis-ability-kit/js-apis-app-ability-configuration.md)。
159
160基于当前的应用模型,可以通过以下几种方式来实现订阅环境变量的变化。
161
162- [使用ApplicationContext订阅回调](#使用applicationcontext订阅回调)
163- [在AbilityStage组件管理器中订阅回调](#在abilitystage组件管理器中订阅回调)
164- [在UIAbility组件中订阅回调](#在uiability组件中订阅回调)
165- [在ExtensionAbility组件中订阅回调](#在extensionability组件中订阅回调)
166
167### 使用ApplicationContext订阅回调
168
169[ApplicationContext](../reference/apis-ability-kit/js-apis-inner-application-applicationContext.md)提供了注册回调函数以订阅环境变量的变化,并且可以通过调用相应的方法来撤销该回调。这有助于在资源不再需要时释放相关资源,从而提高系统的可靠性和性能。
170
1711. 使用[on](../reference/apis-ability-kit/js-apis-inner-application-applicationContext.md#applicationcontextonenvironment)方法,应用程序可以通过在非应用组件模块中订阅环境变量的变化来动态响应这些变化。例如,使用该方法在页面中监测系统语言的变化。
172
173    ```ts
174    import { common, EnvironmentCallback, Configuration } from '@kit.AbilityKit';
175    import { hilog } from '@kit.PerformanceAnalysisKit';
176    import { BusinessError } from '@kit.BasicServicesKit';
177
178    const TAG: string = '[MyAbility]';
179    const DOMAIN_NUMBER: number = 0xFF00;
180
181    @Entry
182    @Component
183    struct Index {
184      private context = this.getUIContext().getHostContext() as common.UIAbilityContext;
185      private callbackId: number = 0; // 注册订阅系统环境变化的ID
186
187      subscribeConfigurationUpdate(): void {
188        let systemLanguage: string | undefined = this.context.config.language; // 获取系统当前语言
189
190        // 1.获取ApplicationContext
191        let applicationContext = this.context.getApplicationContext();
192
193        // 2.通过applicationContext订阅环境变量变化
194        let environmentCallback: EnvironmentCallback = {
195          onConfigurationUpdated(newConfig: Configuration) {
196            hilog.info(DOMAIN_NUMBER, TAG, `onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`);
197            if (systemLanguage !== newConfig.language) {
198              hilog.info(DOMAIN_NUMBER, TAG, `systemLanguage from ${systemLanguage} changed to ${newConfig.language}`);
199              systemLanguage = newConfig.language; // 将变化之后的系统语言保存,作为下一次变化前的系统语言
200            }
201          },
202          onMemoryLevel(level) {
203            hilog.info(DOMAIN_NUMBER, TAG, `onMemoryLevel level: ${level}`);
204          }
205        }
206        try {
207          this.callbackId = applicationContext.on('environment', environmentCallback);
208        } catch (err) {
209          let code = (err as BusinessError).code;
210          let message = (err as BusinessError).message;
211          hilog.error(DOMAIN_NUMBER, TAG, `Failed to register applicationContext. Code is ${code}, message is ${message}`);
212        }
213      }
214
215      // 页面展示
216      build() {
217        //...
218      }
219    }
220    ```
221
2222. 在资源使用完成之后,可以通过调用[off](../reference/apis-ability-kit/js-apis-inner-application-applicationContext.md#applicationcontextoffenvironment-1)方法释放相关资源。
223
224    ```ts
225    import { common } from '@kit.AbilityKit';
226    import { hilog } from '@kit.PerformanceAnalysisKit';
227    import { BusinessError } from '@kit.BasicServicesKit';
228
229    const TAG: string = '[MyAbility]';
230    const DOMAIN_NUMBER: number = 0xFF00;
231
232    @Entry
233    @Component
234    struct Index {
235      private context = this.getUIContext().getHostContext() as common.UIAbilityContext;
236      private callbackId: number = 0; // 注册订阅系统环境变化的ID
237
238      unsubscribeConfigurationUpdate() {
239        let applicationContext = this.context.getApplicationContext();
240        try {
241          applicationContext.off('environment', this.callbackId);
242        } catch (err) {
243          let code = (err as BusinessError).code;
244          let message = (err as BusinessError).message;
245          hilog.error(DOMAIN_NUMBER, TAG, `Failed to unregister applicationContext. Code is ${code}, message is ${message}`);
246        }
247      }
248
249      // 页面展示
250      build() {
251        //...
252      }
253    }
254    ```
255
256### 在AbilityStage组件管理器中订阅回调
257
258使用[AbilityStage.onConfigurationUpdate()](../reference/apis-ability-kit/js-apis-app-ability-abilityStage.md#onconfigurationupdate)回调方法订阅环境变量的变化。当环境变量发生变化时,会调用该回调方法。在该方法中,通过[Configuration](../reference/apis-ability-kit/js-apis-app-ability-configuration.md)对象获取最新的环境变量信息。可以进行相应的界面适配等操作,从而提高系统的灵活性和可维护性。
259
260> **说明:**
261>
262> - DevEco Studio默认工程中未自动生成[AbilityStage](../reference/apis-ability-kit/js-apis-app-ability-abilityStage.md),AbilityStage文件的创建请参见[AbilityStage开发步骤](abilitystage.md#开发步骤)。
263> - 当使用回调方法订阅系统环境变量的变化时,该回调方法会随着AbilityStage的生命周期而存在,在Module销毁时一并销毁。
264
265例如,在[AbilityStage.onConfigurationUpdate()](../reference/apis-ability-kit/js-apis-app-ability-abilityStage.md#onconfigurationupdate)回调方法中实现监测系统语言的变化。
266
267```ts
268import { AbilityStage, Configuration } from '@kit.AbilityKit';
269import { hilog } from '@kit.PerformanceAnalysisKit';
270
271const TAG: string = '[MyAbilityStage]';
272const DOMAIN_NUMBER: number = 0xFF00;
273
274let systemLanguage: string | undefined; // 系统当前语言
275
276export default class MyAbilityStage extends AbilityStage {
277  onCreate(): void {
278    systemLanguage = this.context.config.language; // Module首次加载时,获取系统当前语言
279    hilog.info(DOMAIN_NUMBER, TAG, `systemLanguage is ${systemLanguage}`);
280    //...
281  }
282
283  onConfigurationUpdate(newConfig: Configuration): void {
284    hilog.info(DOMAIN_NUMBER, TAG, `onConfigurationUpdate, language: ${newConfig.language}`);
285    hilog.info(DOMAIN_NUMBER, TAG, `onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`);
286
287    if (systemLanguage !== newConfig.language) {
288      hilog.info(DOMAIN_NUMBER, TAG, `systemLanguage from ${systemLanguage} changed to ${newConfig.language}`);
289      systemLanguage = newConfig.language; // 将变化之后的系统语言保存,作为下一次变化前的系统语言
290    }
291  }
292}
293```
294
295### 在UIAbility组件中订阅回调
296
297[UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md)组件提供了[UIAbility.onConfigurationUpdate()](../reference/apis-ability-kit/js-apis-app-ability-ability.md#abilityonconfigurationupdate)回调方法用于订阅环境变量的变化。当环境变量发生变化时,会调用该回调方法。在该方法中,通过[Configuration](../reference/apis-ability-kit/js-apis-app-ability-configuration.md)对象获取最新的环境变量信息,而无需重启UIAbility。
298
299> **说明:**
300>
301> - 当应用通过回调方法订阅环境变量变化时,该订阅会随着所在UIAbility的生命周期持续有效。一旦UIAbility被销毁,之前注册的所有回调订阅将自动失效,同时应用将不会再收到订阅的回调信息。
302> - 如果使用该接口监听屏幕方向变化,需要在module.json5配置文件的[abilities标签](../quick-start/module-configuration-file.md#abilities标签)中将orientation字段配置为auto_rotation。
303
304例如,在[onConfigurationUpdate()](../reference/apis-ability-kit/js-apis-app-ability-ability.md#abilityonconfigurationupdate)回调方法中实现监测系统语言的变化。
305
306```ts
307import { AbilityConstant, Configuration, UIAbility, Want } from '@kit.AbilityKit';
308import { hilog } from '@kit.PerformanceAnalysisKit';
309
310const TAG: string = '[EntryAbility]';
311const DOMAIN_NUMBER: number = 0xFF00;
312
313let systemLanguage: string | undefined; // 系统当前语言
314
315export default class EntryAbility extends UIAbility {
316  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
317    systemLanguage = this.context.config.language; // UIAbility实例首次加载时,获取系统当前语言
318    hilog.info(DOMAIN_NUMBER, TAG, `systemLanguage is ${systemLanguage}`);
319  }
320
321  onConfigurationUpdate(newConfig: Configuration): void {
322    hilog.info(DOMAIN_NUMBER, TAG, `onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`);
323
324    if (systemLanguage !== newConfig.language) {
325      hilog.info(DOMAIN_NUMBER, TAG, `systemLanguage from ${systemLanguage} changed to ${newConfig.language}`);
326      systemLanguage = newConfig.language; // 将变化之后的系统语言保存,作为下一次变化前的系统语言
327    }
328  }
329  // ...
330}
331```
332
333### 在ExtensionAbility组件中订阅回调
334
335[ExtensionAbility](../reference/apis-ability-kit/js-apis-app-ability-extensionAbility.md)组件提供了[onConfigurationUpdate()](../reference/apis-ability-kit/js-apis-app-ability-ability.md#abilityonconfigurationupdate)回调方法用于订阅环境变量的变化。当环境变量发生变化时,会调用该回调方法。在该方法中,通过[Configuration](../reference/apis-ability-kit/js-apis-app-ability-configuration.md)对象获取最新的环境变量信息。
336
337> **说明:**
338>
339> 当应用通过回调方法订阅环境变量变化时,该订阅会随着所在ExtensionAbility的生命周期持续有效。一旦ExtensionAbility被销毁,之前注册的所有回调订阅将自动失效,同时应用将不会再收到订阅的回调信息。
340
341以[FormExtensionAbility](../reference/apis-form-kit/js-apis-app-form-formExtensionAbility.md)为例说明。例如,在[onConfigurationUpdate()](../reference/apis-form-kit/js-apis-app-form-formExtensionAbility.md#formextensionabilityonconfigurationupdate)回调方法中实现环境变量的变化。
342
343```ts
344import { FormExtensionAbility } from '@kit.FormKit';
345import { Configuration } from '@kit.AbilityKit';
346import { hilog } from '@kit.PerformanceAnalysisKit';
347
348const TAG: string = '[EntryAbility]';
349const DOMAIN_NUMBER: number = 0xFF00;
350
351export default class EntryFormAbility extends FormExtensionAbility {
352  onConfigurationUpdate(newConfig: Configuration) {
353    hilog.info(DOMAIN_NUMBER, TAG, '[EntryFormAbility] onConfigurationUpdate:' + JSON.stringify(newConfig));
354  }
355  // ...
356}
357```
358