1# 应用模型常见问题 2 3## 如何获取设备横竖屏的状态变化通知 4 5适用于:OpenHarmony 3.2 Beta5 API 9 6 7**问题现象** 8 9当设备发生横竖屏变化时,开发者应如何获取到变化的事件通知? 10 11**解决措施** 12 13使用UIAbility.onConfigurationUpdate\(\)回调方法订阅系统环境变量的变化(包括语言,颜色模式,屏幕方向等)。 14 15**参考文档** 16 17[订阅系统环境变量的变化](../application-models/subscribe-system-environment-variable-changes.md#在uiability组件中订阅回调) 18 19## 点击服务卡片如何跳转至指定的页面 20 21适用于:OpenHarmony 3.2 Beta5 API 9 22 23**解决措施** 24 25参考文档,配置卡片事件,指定需要跳转的目标Ability,然后在目标UIAbility的onWindowStageCreate\(\)中调用loadContent跳转至指定的page页面。 26 27**参考链接** 28 29[开发卡片事件](../application-models/arkts-ui-widget-configuration.md) 30 31## 如何在Stage模型中创建后台服务 32 33适用于:Openharmony 3.2 Beta5 34 35**问题现象** 36 37Stage模型中的ServiceExtensionAbility是系统接口,第三方应用不支持调用,如何在Stage模型中如何创建后台服务? 38 39**解决措施** 40 41Stage模型可通过后台任务实现该功能。 42 43**参考链接** 44 45[后台任务](../task-management/background-task-overview.md) 46 47## FA和Stage模型中,应用是否可以创建并指定UIAbility运行在哪个进程 48 49适用于:Openharmony 3.2 Beta5 API 9 50 51**解决措施** 52 53FA和Stage模型中,应用可以创建进程并指定UIAbility运行在某个进程。 54 55- FA模型 56 57 FA模型支持多进程,默认情况下,同一应用的所有组件均在相同进程中运行,且大多数应用都不应该改变这一点。但是如果应用自身业务需要某个组件独立进程运行,可在config配置文件中配置;配置清单中,ability标签的process子标签可指定该组件在哪个进程中运行,应用可以设置通过该属性使每个组件均在各自的进程中运行,但process子标签仅支持系统应用配置,三方应用配置不生效。 58 59- Stage模型 60 61 Stage模型支持多进程:Stage模型的进程模型由系统定义,三方应用不能配置多进程;如果需要自定义配置独立进程,需要申请特殊权限;配置清单中,module标签的process子标签可指定该Hap下Ability在哪个进程中运行,应用可以设置通过该属性使每个Hap的Ability组件均在各自的进程中运行。如果不配置,进程名默认为包名。 62 63 64## Stage模型与FA模型在进程内对象共享方面有哪些差异 65 66适用于:Openharmony 3.2 Beta5 API 9 67 68**解决措施** 69 70- Stage模型中,多个应用组件共享同一个ArkTS引擎实例,因此在Stage模型中,应用组件之间可以方便的共享对象和状态,同时减少复杂应用运行对内存的占用。 71- FA模型中,每个应用组件独享一个ArkTS引擎实例。Stage模型作为主推的应用模型,开发者通过它能够更加便利地开发出分布式场景下的复杂应用。 72 73**参考链接** 74 75[UIAbility组件与UI的数据同步](../application-models/uiability-data-sync-with-ui.md) 76 77## 如何使用AbilityStage的生命周期函数 78 79适用于:Openharmony 3.2 Beta5 API 9 80 81**解决措施** 82 83在module.json5里的module中加上srcEntry字段"srcEntry": "./ets/myabilitystage/MyAbilityStage.ts"。 84 85**参考链接** 86 87[AbilityStage组件容器](../application-models/abilitystage.md) 88 89 90## 多实例场景下当前Ability调用terminateSelf后,桌面最近任务列表如何设置不保留快照 91 92适用于:Openharmony 3.2 Beta5 API 9 93 94**解决措施** 95 96可在module.json5配置文件中配置removeMissionAfterTerminate为true。 97 98## 通过startAbility\(\)方法无法启动UIAbility实例 99 100适用于:Openharmony 3.2 Beta5 API 9 101 102**解决措施** 103 104- 如果是通过startAbility的方式拉起,检查want中abilityName字段是否携带了bundleName做前缀,如果有,请删除。 105- 检查MainAbility.ts文件中onWindowStageCreate方法配置的Ability首页文件是否在main\_pages.json中有定义,如果没有定义,请补齐。SDK和OpenHarmony SDK系统推荐同一天的版本。 106 107## 调用方法的时候,方法内部的this变成了undefined 108 109适用于:Openharmony 3.2 Beta5 API 9 110 111**解决措施** 112 113方式一:在调用方法的时候加上.bind\(this\); 114 115方式二:使用箭头函数。 116 117## 启动UIAbility时报错:must have required property 'startWindowIcon' 118 119适用于:Openharmony 3.2 Beta5 API 9 120 121**解决措施** 122 123UIAbility配置中缺少startWindowIcon属性配置,需要在module.json5中abilities中配置startWindowIcon。 124 125**代码示例** 126 127``` 128{ 129 "module": { 130 // do something 131 "abilities": [{ 132 // do something 133 "startWindowIcon": "$media:space", 134 "startWindowBackground": "$color:white", 135 }] 136 } 137} 138``` 139 140**参考链接** 141 142[Stage模型配置文件](../quick-start/module-configuration-file.md) 143 144## Stage模型是否推荐使用globalThis获取Context 145 146适用于:Openharmony 3.2 Beta5 API 9 147 148不推荐,Stage模型使用globalThis去获取Context是错误的使用方式。 149 150在Stage模型中,整个应用进程共用一个js虚拟机实例,其中可以运行多个Ability实例,共用一个global对象。在同一个js虚拟机内的不同的Ability中使用globalThis获取Context,存在被覆盖从而发生错误的风险。 151 152**参考链接** 153 154[UIAbility组件与UI的数据同步](../application-models/uiability-data-sync-with-ui.md) 155 156## 部署HAP时上报安装内容过大错误 157 158适用于:Openharmony 3.2 Beta5 API 9 159 160**问题现象** 161 162部署hap时,上报如下错误: 163 164Failure\[INSTALL\_FAILED\_SIZE\_TOO\_LARGE\] error while deploying hap? 165 166**解决措施** 167 168将其拆分为多个HAP即可解决。 169 170## 调用方使用startAbilityForResult时,被调用方如何返回数据 171 172适用于:Openharmony 3.2 Beta5 API 9 173 174**解决措施** 175 176被调用方使用AbilityContext.terminateSelfWithResult方法,销毁被调用方ability,传递参数给startAbilityForResult回调函数。 177 178**参考链接** 179 180[启动应用内的UIAbility并获取返回结果](../application-models/uiability-intra-device-interaction.md) 181 182 183## 如何获取系统时间戳 184 185适用于:Openharmony 3.2 Beta5 API 9 186 187**解决措施** 188 189在Openharmony中使用@ohos.systemDateTime的getCurrentTime来获取系统系统时间和时区。 190 191**代码示例** 192 193使用@ohos.systemDateTime接口: 194 195 ``` 196 try { 197 systemDateTime.getCurrentTime(true, (error, time) => { 198 if (error) { 199 console.info(`Failed to get currentTime. message: ${error.message}, code: ${error.code}`); 200 return; 201 } 202 console.info(`Succeeded in getting currentTime : ${time}`); 203 }); 204 } catch(e) { 205 console.info(`Failed to get currentTime. message: ${e.message}, code: ${e.code}`); 206 } 207 ``` 208 209 210**参考链接** 211 212[系统时间、时区](../reference/apis/js-apis-system-date-time.md#systemdatetimegetcurrenttime) 213 214## 如何获取当前应用程序缓存目录 215 216适用于:Openharmony 3.2 Beta5 API 9 217 218**解决措施** 219 220在Openharmony中使用Context.cacheDir获取应用程序的缓存目录。 221 222**参考链接** 223 224[cacheDir](../application-models/application-context-stage.md#获取应用文件路径) 225 226## 服务卡片生命周期回调函数在哪个js文件中调用 227 228适用于:Openharmony 3.2 Beta5 API 9 229 230**解决措施** 231 232新建卡片时会生成一个FormAblity.ts文件,其中包含卡片对应的生命周期。 233 234参考链接 235 236[FormExtensionAbility](../reference/apis/js-apis-app-form-formExtensionAbility.md) 237 238## 使用ServiceExtensionAbility和DataShareExtensionAbility的相关接口后DevEco Studio无法编译 239 240适用于:Openharmony 3.2 Beta5 API 9 241 242**问题现象** 243 244使用ServiceExtensionAbility和DataShareExtensionAbility的相关接口后,DevEco Studio报错无法编译。 245 246**问题原因** 247 248当前SDK类型有: 249 250- public-sdk : 面向应用开发者提供,不包含需要使用系统权限的系统接口。 251- full-sdk : 面向OEM厂商提供,包含了需要使用系统权限的系统接口。 252 253DevEco Studio默认下载是public-sdk。 254 255**解决措施** 256 257三方应用不支持开发ServiceExtensionAbility和DataShareExtensionAbility。若开发系统应用,请[下载full-sdk](../faqs/full-sdk-switch-guide.md)。 258 259## 如何获取应用级别的temp路径和files路径 260 261适用于:OpenHarmony 3.2 Beta5 262 263**解决措施** 264 265通过应用上下文context获取。如:this.context.getApplicationContext.tempDir来获取temp路径;this.context.getApplicationContext.filesDir来获取files路径。 266 267**参考链接** 268 269[获取应用文件路径](../application-models/application-context-stage.md#获取应用文件路径) 270 271## terminateSelf方法销毁当前应用之后并没有在后台任务列表中删除 272 273适用于:OpenHarmony 3.2 Beta5 274 275**解决措施** 276 277在当前应用对应UIAbility的module.json5配置文件中,配置abilities标签的removeMissionAfterTerminate字段,设置为true即为销毁应用的同时删除应用快照记录,缺省值为false。 278 279**参考链接** 280 281[module.json5配置文件](../quick-start/module-configuration-file.md) 282 283## Stage模型下开发的应用如何拉起 FA 模型开发的应用 284 285适用于:OpenHarmony 3.2 Beta 5,API 9 286 287**问题现象** 288 289已在stage模型下的应用如何拉起FA模型 290 291**解决措施** 292 293该功能目前已支持,具体实现可参考如下代码: 294 295示例: 296 297``` 298let want = { 299 deviceId: "", // deviceId为空表示本设备 300 bundleName: "com.example.myapplication", 301 abilityName: "EntryAbility", 302 moduleName: "Module1", // moduleName非必选 303 parameters: { // 自定义信息 304 }, 305} 306// context为意图拉起的FA模型的AbilityContext 307context.startAbility(want).then(() => { 308 ... 309}).catch((err) => { 310 ... 311}) 312``` 313 314## 原子化服务是否可以全程使用js实现 315 316适用于:Openharmony 3.2 Beta5 API 9 317 318**解决措施** 319 320目前新建的卡片的目录结构都是css+hml+json,不能完全靠js实现,事件的触发和参数的传递都可以在json文件里面处理。 321 322## FA卡片上架后在用户的服务中心展示时可否触发生命周期,从而实现用户没有打开过FA应用的情况下获取到用户的登录信息 323 324适用于:OpenHarmony 3.2 Beta 5 API 9 325 326**问题现象** 327 328FA卡片的生命周期以及信息显示 329 330**解决措施** 331 332服务卡片在添加卡片后就触发了onCreate\(\)生命周期,在不启用app的情况下也可以显示相关的用户信息-静默登录,但服务卡片目前要在app安装之后手动添加。 333 334## JS/ArkTS跳转到其他应用时报错“\[c4d4d3492eb8531, 0, 0\] ContextDeal::startAbility fetchAbilities failed” 335 336适用于:OpenHarmony 3.2 Beta5 API 9 337 338**问题现象** 339 340JS/ArkTS跳转时, startAbility报错 341 342**解决措施** 343 344一般用startAbility,实现如下: 345 346``` 347import featureAbility from '@ohos.ability.featureAbility' 348function onStartRemoteAbility() { 349console.info('onStartRemoteAbility begin'); 350let params; 351let wantValue = { 352 bundleName: 'ohos.samples.etsDemo', 353 abilityName: 'ohos.samples.etsDemo.RemoteAbility', 354 deviceId: getRemoteDeviceId(), 355 parameters: params 356}; 357console.info('onStartRemoteAbility want=' + JSON.stringify(wantValue)); 358featureAbility.startAbility({ 359 want: wantValue 360}).then((data) => { 361console.info('onStartRemoteAbility finished, ' + JSON.stringify(data)); 362}); 363console.info('onStartRemoteAbility end'); 364} 365``` 366 367**参考链接** 368 369可参考[启动本地PageAbility](../application-models/start-local-pageability.md)。 370 371## 如何通过卡片点击实现业务登录场景 372 373适用于: OpenHarmony 3.2 Beta5 API 9 374 375**解决措施** 376 377可以先创建FA模型的卡片,步骤如下: 378 3791. 实现卡片生命周期接口 380 3812. 配置卡片配置文件 382 3833. 卡片信息的持久化 384 3854. 卡片数据交互 386 3875. 开发卡片页面 388 3896. 开发卡片事件:通过点击卡片拉起响应的Ability后,通过Ability来实现业务登录场景 390 391**参考链接** 392 393[FA卡片开发指导](../application-models/widget-development-fa.md) 394 395## 如何跳转到设置中应用详情页面 396 397适用于:OpenHarmony 3.2 Beta5 API 9 398 399**解决措施** 400 401参考如下代码实现,示例: 402 403``` 404this.context.startAbility( 405{ 406 action: "action.settings.app.info", 407 parameters: { "settingsParamBundleName": "your app bundlename" } 408}) 409``` 410 411## stage模型,@Component组件内如何获取UIAbilityContext 412 413适用于:OpenHarmony 3.2 Beta5 API9 414 415**解决措施** 416 417可以通过UIAbility. Context获取。 418 419**代码示例** 420 421``` 422import common from '@ohos.app.ability.common'; 423 424@Entry 425@Component 426struct AbilityContextTest { 427 // abilityContext 428 @State UIAbilityInfo: string = '获取 abilityInfo' 429 UIAbilityContext: common.UIAbilityContext 430 431 aboutToAppear() { 432 // getContext获取Context,转为abilityContext 433 this.UIAbilityContext = getContext(this) as common.UIAbilityContext 434 } 435 436 build() { 437 Row() { 438 Column({ space: 20 }) { 439 Text(this.UIAbilityInfo) 440 .fontSize(20) 441 .onClick(() => { 442 this.UIAbilityInfo = JSON.stringify(this.UIAbilityContext.abilityInfo) 443 console.log(`ContextDemo abilityInfo = ${this.UIAbilityInfo}`) 444 }) 445 } 446 .width('100%') 447 } 448 .height('100%') 449 } 450} 451``` 452 453## 后台长时任务启动失败 454 455适用于:OpenHarmony 3.2 Release API9 456 457**问题现象** 458 459调用featureAbility.startAbility\(\)接口启动ServiceAbility,在ServiceAbility中启动后台长时任务报错,错误信息:\{"code":201,"message":"BussinessError 201: Permission denied."\} 460 461**解决措施** 462 463启动后台长时任务需要在module.json5文件中配置长时任务权限ohos.permission.KEEP\_BACKGROUND\_RUNNING、同时为需要使用长时任务的ability声明相应的后台模式类型。 464 465``` 466"module": { 467 "abilities": [ 468 { 469 "backgroundModes": [ 470 "dataTransfer", 471 "location" 472 ], // 后台模式类型 473 } 474 ], 475 "requestPermissions": [ 476 { 477 "name": "ohos.permission.KEEP_BACKGROUND_RUNNING" // 长时任务权限 478 } 479 ] 480} 481``` 482 483**参考链接** 484 485[ServiceAbility组件配置-后台模式类型](../application-models/serviceability-configuration.md) 486 487[长时任务权限](../security/permission-list.md#ohospermissionkeep_background_running) 488 489[长时任务开发指导](../task-management/continuous-task.md) 490 491## FA卡片如何进行数据交互 492 493适用于:OpenHarmony SDK 3.2 Beta 5 API9 494 495卡片通过postCardAction接口触发和提供方的交互,在提供方中通过updateForm方法更新数据。 496 497**参考链接** 498 499[服务卡片开发指导](../application-models/widget-development-fa.md) 500 501## 系统是否支持在桌面上创建应用的快捷入口,直接打开指定页面? 502 503适用于:OpenHarmony SDK 4.0 Release API10 504 505当前不支持