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/Context、application/ApplicationContext、application/AbilityStageContext、application/ExtensionContext、application/AbilityContext、application/FormExtensionContext等Context。这些Context的介绍及使用方式将会在[Stage模型的Context详细介绍](#stage模型的context详细介绍)中进行说明。 14 15 16 17## FA模型的Context详细介绍 18 19 只有app/Context中的方法属于FA模型对应的Context。 20 21 FA模型只有一个Context定义。Context中所有的功能都是通过方法来提供的,它提供了一些featureAbility中不存在的方法,相当于featureAbility的一个扩展和补全。 22 23**d.ts声明** 24 25 https://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 80 application/Context是基类Context。里面提供了应用的一些基础信息:resourceManager、applicationInfo、cacheDir、area等,还有应用的一些基本方法:createModuleContext等。 81 82**d.ts声明** 83 84 https://gitee.com/openharmony/interface_sdk-js/blob/master/api/application/Context.d.ts 85 86### application/ApplicationContext 87 88 application/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 154 https://gitee.com/openharmony/interface_sdk-js/blob/master/api/application/ApplicationContext.d.ts 155 156### application/AbilityStageContext 157 158 application/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 177 https://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实例的方法,就可能会发生错误或者崩溃。