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