• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 应用上下文Context使用指导
2
3## Context概述
4
5​        Context是应用中对象的上下文,提供获取应用程序环境信息的能力。
6
7​        OpenHarmony的应用框架分为FA模型和Stage两种模型。对应存在两套Context机制适配两种应用框架模型,其中application/BaseContext属于通用的Context基类,里面包含一个属性stageMode,用来区分开发模型是FA还是Stage。
8
9- FA模型
10  只有app/Context中的方法属于FA模型对应的Context。该模式下,应用级别的Context和Ability级别的Context都是该类型的实例,如果在应用级别的Context里面调用了Ability级别的方法,会产生错误。所以开发者需要注意Context实例所代表的实际含义。
11
12- Stage模型
13  除了app/Context之外的Context都属于Stage模型,分别有application/Contextapplication/ApplicationContextapplication/AbilityStageContextapplication/ExtensionContextapplication/AbilityContextapplication/FormExtensionContext等Context。这些Context的介绍及使用方式将会在[Stage模型的Context详细介绍](#stage模型的context详细介绍)中进行说明。
14
15![contextIntroduction](figures/contextIntroduction.png)
16
17## FA模型的Context详细介绍
18
19​        只有app/Context中的方法属于FA模型对应的Context。
20
21​        FA模型只有一个Context定义。Context中所有的功能都是通过方法来提供的,它提供了一些featureAbility中不存在的方法,相当于featureAbility的一个扩展和补全。
22
23**d.ts声明**
24
25https://gitee.com/openharmony/interface_sdk-js/blob/master/api/app/context.d.ts
26
27**示例**
28
29```javascript
30import featureAbility from '@ohos.ability.featureAbility'
31export default {
32  onCreate() {
33    // 获取context并调用相关方法
34    let context = featureAbility.getContext();
35    context.getBundleName((data, bundleName)=>{
36      console.info("ability bundleName:" + bundleName)
37    });
38    console.info('Application onCreate')
39  },
40  onDestroy() {
41    console.info('Application onDestroy')
42  },
43}
44```
45
46### FA模型Context常用方法介绍
47方法:
48```javascript
49setDisplayOrientation(orientation: bundle.DisplayOrientation, callback: AsyncCallback<void>): void
50setDisplayOrientation(orientation: bundle.DisplayOrientation): Promise<void>;
51```
52简介:设置当前ability的显示方向。
53
54示例:
55```javascript
56import featureAbility from '@ohos.ability.featureAbility'
57import bundle from '@ohos.bundle';
58
59export default {
60  onCreate() {
61    // 获取context并调用相关方法
62    let context = featureAbility.getContext();
63    context.setDisplayOrientation(bundle.DisplayOrientation.LANDSCAPE).then(() => {
64        console.log("Set display orientation.")
65    })
66    console.info('Application onCreate')
67  },
68  onDestroy() {
69    console.info('Application onDestroy')
70  },
71}
72```
73
74## Stage模型的Context详细介绍
75
76​        Stage模型有如下几类Context:
77
78### application/Context
79
80application/Context是基类Context。里面提供了应用的一些基础信息:resourceManager、applicationInfo、cacheDir、area等,还有应用的一些基本方法:createModuleContext等。
81
82**d.ts声明**
83
84https://gitee.com/openharmony/interface_sdk-js/blob/master/api/application/Context.d.ts
85
86### application/ApplicationContext
87
88application/ApplicationContext是应用级别的Context。和基类Context相比,应用级别的Context中提供了监听进程内组件的生命周期的能力,包括registerAbilityLifecycleCallback和unregisterAbilityLifecycleCallback两种方法。
89
90**获取方法**
91
92​        在Ability中通过context.getApplicationContext()方法获取。
93
94**示例**
95
96```javascript
97import Ability from "@ohos.application.Ability";
98
99var lifecycleid;
100
101export default class MainAbility extends Ability {
102    onCreate() {
103        console.log("MainAbility onCreate")
104        let AbilityLifecycleCallback  =  {
105            onAbilityCreate(ability){
106                console.log("AbilityLifecycleCallback onAbilityCreate ability:" + JSON.stringify(ability));
107            },
108            onWindowStageCreate(ability, windowStage){
109                console.log("AbilityLifecycleCallback onWindowStageCreate ability:" + JSON.stringify(ability));
110                console.log("AbilityLifecycleCallback onWindowStageCreate windowStage:" + JSON.stringify(windowStage));
111            },
112            onWindowStageActive(ability, windowStage){
113                console.log("AbilityLifecycleCallback onWindowStageActive ability:" + JSON.stringify(ability));
114                console.log("AbilityLifecycleCallback onWindowStageActive windowStage:" + JSON.stringify(windowStage));
115            },
116            onWindowStageInactive(ability, windowStage){
117                console.log("AbilityLifecycleCallback onWindowStageInactive ability:" + JSON.stringify(ability));
118                console.log("AbilityLifecycleCallback onWindowStageInactive windowStage:" + JSON.stringify(windowStage));
119            },
120            onWindowStageDestroy(ability, windowStage){
121                console.log("AbilityLifecycleCallback onWindowStageDestroy ability:" + JSON.stringify(ability));
122                console.log("AbilityLifecycleCallback onWindowStageDestroy windowStage:" + JSON.stringify(windowStage));
123            },
124            onAbilityDestroy(ability){
125                console.log("AbilityLifecycleCallback onAbilityDestroy ability:" + JSON.stringify(ability));
126            },
127            onAbilityForeground(ability){
128                console.log("AbilityLifecycleCallback onAbilityForeground ability:" + JSON.stringify(ability));
129            },
130            onAbilityBackground(ability){
131                console.log("AbilityLifecycleCallback onAbilityBackground ability:" + JSON.stringify(ability));
132            },
133            onAbilityContinue(ability){
134                console.log("AbilityLifecycleCallback onAbilityContinue ability:" + JSON.stringify(ability));
135            }
136        }
137        // 1.通过context属性获取applicationContext
138        let applicationContext = this.context.getApplicationContext();
139        // 2.通过applicationContext注册监听应用内生命周期
140        lifecycleid = applicationContext.registerAbilityLifecycleCallback(AbilityLifecycleCallback);
141        console.log("registerAbilityLifecycleCallback number: " + JSON.stringify(lifecycleid));
142    },
143    onDestroy() {
144        let applicationContext = this.context.getApplicationContext();
145        applicationContext.unregisterAbilityLifecycleCallback(lifecycleid, (error, data) => {
146            console.log("unregisterAbilityLifecycleCallback success, err: " + JSON.stringify(error));
147        });
148    }
149}
150```
151
152**d.ts声明**
153
154https://gitee.com/openharmony/interface_sdk-js/blob/master/api/application/ApplicationContext.d.ts
155
156### application/AbilityStageContext
157
158application/AbilityStageContext是Hap包级别的Context。和基类Context相比,Hap包级别的Context中多了HapModuleInfo和Configuration两个信息。
159
160**获取方法**
161
162​        可以直接在AbilityStage中通过context属性获取。
163
164**示例**
165
166```javascript
167export default class MyAbilityStage extends AbilityStage {
168  onCreate() {
169    // 属性context就是AbilityStageContext类型的
170    console.log('HapModuleInfo is ' + this.context.currentHapModuleInfo);
171  }
172}
173```
174
175**d.ts声明**
176
177https://gitee.com/openharmony/interface_sdk-js/blob/master/api/application/AbilityStageContext.d.ts
178
179### application/AbilityContext
180
181​        Stage模型下,每个Ability中都包含了一个Context属性。
182
183​        Ability功能主要是处理生命周期,其余操作Ability的方法(如startAbility、connectAbility等)都是在AbilityContext中实现的。
184
185**获取方法**
186
187​        在Ability中通过context属性获取。
188
189**示例**
190
191```javascript
192import Ability from '@ohos.application.Ability'
193
194export default class MainAbility extends Ability {
195    onCreate(want, launchParam) {
196        console.log("[Demo] MainAbility onCreate")
197        globalThis.abilityWant = want;
198    }
199
200    onDestroy() {
201        console.log("[Demo] MainAbility onDestroy")
202    }
203
204    onWindowStageCreate(windowStage) {
205        // Main window is created, set main page for this ability
206        console.log("[Demo] MainAbility onWindowStageCreate")
207
208        // 在这里获取AbilityContext,打印ability的信息
209        let context = this.context;
210        console.log("[Demo] MainAbility bundleName " + context.abilityInfo.bundleName)
211
212        windowStage.loadContent("pages/index", (err, data) => {
213            if (err.code) {
214                console.error('Failed to load the content. Cause:' + JSON.stringify(err));
215                return;
216            }
217            console.info('Succeeded in loading the content. Data: ' + JSON.stringify(data))
218        });
219    }
220
221    onWindowStageDestroy() {
222        // Main window is destroyed, release UI related resources
223        console.log("[Demo] MainAbility onWindowStageDestroy")
224    }
225
226    onForeground() {
227        // Ability has brought to foreground
228        console.log("[Demo] MainAbility onForeground")
229    }
230
231    onBackground() {
232        // Ability has back to background
233        console.log("[Demo] MainAbility onBackground")
234    }
235};
236```
237
238### application/FormExtensionContext
239
240卡片业务相关,点下面链接了解。
241
242​        [FormExtensionContext](../reference/apis/js-apis-inner-application-formExtensionContext.md)
243
244### 在ArkTS页面中访问Context
245
246Stage模型下,在Ability的`onWindowStageCreate`生命周期中,可以通过WindowStage的`SetUIContent`方法加载一个ArkTS页面。在一些场景中,需要在页面内获取Context调用相关API。
247
248**获取方法**
249
250在ArkTS页面中通过以下全局方法获取当前页面关联的Context。
251
252| 接口名                                | 描述                                                         |
253| :------------------------------------ | :----------------------------------------------------------- |
254| getContext(component: Object): Object | 获取页面中component所关联的Context对象。<br/>从API version 9开始,该接口支持在ArkTS卡片中使用。 |
255
256**示例**
257
258```ts
259// MainAbility.ts
260import Ability from '@ohos.application.Ability'
261
262export default class MainAbility extends Ability {
263    onCreate(want, launchParam) {
264        console.log("[Demo] MainAbility onCreate")
265    }
266
267    onDestroy() {
268        console.log("[Demo] MainAbility onDestroy")
269    }
270
271    onWindowStageCreate(windowStage) {
272        // 加载index页面,并传入当前Context
273        windowStage.setUIContent(this.context, "pages/index", null)
274    }
275
276    onWindowStageDestroy() {}
277
278    onForeground() {}
279
280    onBackground() {}
281};
282```
283
284```ts
285// pages/index.ets
286import context from '@ohos.application.context'
287
288type Context = context.Context
289
290@Entry
291@Component
292struct Index {
293    build() {
294        Row() {
295            Column() {
296                Text('GetContext')
297                    .fontSize(50)
298                    .fontWeight(FontWeight.Bold)
299                    .onClick(() => {
300                        // 获取当前component关联的Context
301                        var context : Context = getContext(this) as Context
302                        console.info("CacheDir:" + context.cacheDir)
303                    })
304            }
305            .width('100%')
306        }
307        .height('100%')
308    }
309}
310```
311
312## 常见错误使用方式
313
314**错误1:Stage模型通过globalThis去获取Context**
315
316**原因**
317
318​        应用框架在API9上推出了新的应用模型(Stage模型)。在老的模型(FA模型)下,每个Ability实例有一个js虚拟机实例,所以可以从js引擎的global对象上,获取到一个全局的Ability实例,但是在新的模型(Stage模型)下,整个应用进程共用一个js虚拟机实例,其中可以运行多个Ability实例,这样就不存在一个全局的Ability实例。如果开发者在新的模型(Stage模型)下,调用的API实现仍然走到了获取全局Ability实例的方法,就可能会发生错误或者崩溃。