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