• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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