1# 订阅系统环境变量的变化 2 3系统环境变量是指:在应用程序运行期间,终端设备的系统设置(例如系统的语言环境、屏幕方向等)发生变化。 4 5开发者通过订阅系统环境变化,可以使应用程序及时感知这种变化,并作出相应处理,从而提供更好的用户体验。例如,用户更改系统语言设置时,应用程序可以自动根据新的语言设置更新用户界面的语言;当用户将设备旋转到横屏或者竖屏时,应用程序可以重新布局用户界面,以适应屏幕方向和尺寸。 6 7系统配置的变化通常由“设置”中的选项或“控制中心”中的图标触发。订阅系统环境变量变化,可以使应用程序更加智能地响应系统环境变化,从而提供更好的用户体验。查看当前支持订阅变化的系统环境变量,请参见[Configuration](../reference/apis/js-apis-app-ability-configuration.md)。 8 9基于OpenHarmony应用模型,可以通过以下几种方式来实现订阅系统环境变量的变化。 10 11- [使用ApplicationContext订阅回调](#使用applicationcontext订阅回调) 12- [在AbilityStage组件容器中订阅回调](#在abilitystage组件容器中订阅回调) 13- [在UIAbility组件中订阅回调](#在uiability组件中订阅回调) 14- [在ExtensionAbility组件中订阅回调](#在extensionability组件中订阅回调) 15 16## 使用ApplicationContext订阅回调 17 18[ApplicationContext](../reference/apis/js-apis-inner-application-applicationContext.md)提供了注册回调函数以订阅系统环境变量的变化,并且可以通过调用相应的方法来撤销该回调。这有助于在资源不再需要时释放相关资源,从而提高系统的可靠性和性能。 19 201. 使用`ApplicationContext.on(type: 'environment', callback: EnvironmentCallback)`方法,应用程序可以通过在非应用组件模块中订阅系统环境变量的变化来动态响应这些变化。例如,使用该方法在页面中监测系统语言的变化。 21 22 ```ts 23 import common from '@ohos.app.ability.common'; 24 25 @Entry 26 @Component 27 struct Index { 28 private context = getContext(this) as common.UIAbilityContext; 29 private callbackId: number; // 注册订阅系统环境变化的ID 30 31 subscribeConfigurationUpdate() { 32 let systemLanguage: string = this.context.config.language; // 获取系统当前语言 33 34 // 1.获取ApplicationContext 35 let applicationContext = this.context.getApplicationContext(); 36 37 // 2.通过applicationContext订阅环境变量变化 38 let environmentCallback = { 39 onConfigurationUpdated(newConfig) { 40 console.info(`onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`); 41 42 if (this.systemLanguage !== newConfig.language) { 43 console.info(`systemLanguage from ${systemLanguage} changed to ${newConfig.language}`); 44 systemLanguage = newConfig.language; // 将变化之后的系统语言保存,作为下一次变化前的系统语言 45 } 46 }, 47 onMemoryLevel(level) { 48 console.info(`onMemoryLevel level: ${level}`); 49 } 50 } 51 52 this.callbackId = applicationContext.on('environment', environmentCallback); 53 } 54 55 // 页面展示 56 build() { 57 ... 58 } 59 } 60 ``` 61 622. 在资源使用完成之后,可以通过调用`ApplicationContext.off(type: 'environment', callbackId: number)`方法释放相关资源。 63 64 ```ts 65 import common from '@ohos.app.ability.common'; 66 67 @Entry 68 @Component 69 struct Index { 70 private context = getContext(this) as common.UIAbilityContext; 71 private callbackId: number; // 注册订阅系统环境变化的ID 72 73 unsubscribeConfigurationUpdate() { 74 let applicationContext = this.context.getApplicationContext(); 75 applicationContext.off('environment', this.callbackId); 76 } 77 78 // 页面展示 79 build() { 80 ... 81 } 82 } 83 ``` 84 85## 在AbilityStage组件容器中订阅回调 86 87使用[AbilityStage.onConfigurationUpdate()](../reference/apis/js-apis-app-ability-abilityStage.md#abilitystageonconfigurationupdate)回调方法订阅系统环境变量的变化。当系统环境变量发生变化时,会调用该回调方法。在该方法中,通过[Configuration](../reference/apis/js-apis-app-ability-configuration.md)对象获取最新的系统环境配置信息。可以进行相应的界面适配等操作,从而提高系统的灵活性和可维护性。 88 89> **说明:** 90> 91> - DevEco Studio默认工程中未自动生成AbilityStage,AbilityStage文件的创建请参见[AbilityStage组件容器](abilitystage.md)。 92> - 当使用回调方法订阅系统环境变量的变化时,该回调方法会随着[AbilityStage](../reference/apis/js-apis-app-ability-abilityStage.md)的生命周期而存在,在Module销毁时一并销毁。 93 94例如,在[AbilityStage.onConfigurationUpdate()](../reference/apis/js-apis-app-ability-abilityStage.md#abilitystageonconfigurationupdate)回调方法中实现监测系统语言的变化。 95 96```ts 97import AbilityStage from '@ohos.app.ability.AbilityStage'; 98 99let systemLanguage: string; // 系统当前语言 100 101export default class MyAbilityStage extends AbilityStage { 102 onCreate() { 103 systemLanguage = this.context.config.language; // Module首次加载时,获取系统当前语言 104 console.info(`systemLanguage is ${systemLanguage} `); 105 } 106 107 onConfigurationUpdate(newConfig) { 108 console.info(`onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`); 109 110 if (systemLanguage !== newConfig.language) { 111 console.info(`systemLanguage from ${systemLanguage} changed to ${newConfig.language}`); 112 systemLanguage = newConfig.language; // 将变化之后的系统语言保存,作为下一次变化前的系统语言 113 } 114 } 115} 116``` 117 118## 在UIAbility组件中订阅回调 119 120UIAbility组件提供了`UIAbility.onConfigurationUpdate()`回调方法用于订阅系统环境变量的变化。当系统环境变量发生变化时,会调用该回调方法。在该方法中,通过[Configuration](../reference/apis/js-apis-app-ability-configuration.md)对象获取最新的系统环境配置信息,而无需重启UIAbility。 121 122> **说明:** 123> 124> 当使用回调方法订阅系统环境变量的变化时,该回调方法会随着UIAbility的生命周期而存在,在UIAbility销毁时一并销毁。 125 126例如,在`onConfigurationUpdate()`回调方法中实现监测系统语言的变化。 127 128```ts 129import UIAbility from '@ohos.app.ability.UIAbility'; 130 131let systemLanguage: string; // 系统当前语言 132 133export default class EntryAbility extends UIAbility { 134 onCreate(want, launchParam) { 135 systemLanguage = this.context.config.language; // UIAbility实例首次加载时,获取系统当前语言 136 console.info(`systemLanguage is ${systemLanguage} `); 137 } 138 139 onConfigurationUpdate(newConfig) { 140 console.info(`onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`); 141 142 if (systemLanguage !== newConfig.language) { 143 console.info(`systemLanguage from ${systemLanguage} changed to ${newConfig.language}`); 144 systemLanguage = newConfig.language; // 将变化之后的系统语言保存,作为下一次变化前的系统语言 145 } 146 } 147 148 ... 149} 150``` 151 152## 在ExtensionAbility组件中订阅回调 153 154ExtensionAbility组件提供了`onConfigurationUpdate()`回调方法用于订阅系统环境变量的变化。当系统环境变量发生变化时,会调用该回调方法。在该方法中,通过[Configuration](../reference/apis/js-apis-app-ability-configuration.md)对象获取最新的系统环境配置信息。 155 156> **说明:** 157> 158> 当使用回调方法订阅系统环境变量的变化时,该回调方法会随着ExtensionAbility的生命周期而存在,在ExtensionAbility销毁时一并销毁。 159 160以FormExtensionAbility为例说明。例如,在`onConfigurationUpdate()`回调方法中实现系统环境变量的变化。 161 162```ts 163import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility'; 164 165export default class EntryFormAbility extends FormExtensionAbility { 166 onConfigurationUpdate(newConfig) { 167 console.info(`newConfig is ${JSON.stringify(newConfig)}`); 168 } 169 170 ... 171} 172``` 173