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