faqs-ability.md 14.4 KB
Newer Older
Z
zengyawen 已提交
1
# 应用模型常见问题
Z
zengyawen 已提交
2

Z
zengyawen 已提交
3
## 如何获取设备横竖屏的状态变化通知
Z
zengyawen 已提交
4

Z
zengyawen 已提交
5
适用于:OpenHarmony 3.2 Beta5 API 9
Z
zengyawen 已提交
6

Z
zengyawen 已提交
7
**问题现象**
Z
zengyawen 已提交
8

Z
zengyawen 已提交
9
当设备发生横竖屏变化时,开发者应如何获取到变化的事件通知?
Z
zengyawen 已提交
10

Z
zengyawen 已提交
11
**解决措施**
Z
zengyawen 已提交
12

Z
zengyawen 已提交
13
使用UIAbility.onConfigurationUpdate\(\)回调方法订阅系统环境变量的变化(包括语言,颜色模式,屏幕方向等)。
Z
zengyawen 已提交
14

Z
zengyawen 已提交
15
**参考文档**
16

Z
zengyawen 已提交
17
[订阅系统环境变量的变化](../application-models/subscribe-system-environment-variable-changes.md#在uiability组件中订阅回调)
18

Z
zengyawen 已提交
19
## 点击服务卡片如何跳转至指定的页面
20

Z
zengyawen 已提交
21
适用于:OpenHarmony 3.2 Beta5 API 9
22

Z
zengyawen 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
**解决措施**

参考文档,配置卡片事件,指定需要跳转的目标Ability,然后在目标UIAbility的onWindowStageCreate\(\)中调用loadContent跳转至指定的page页面。

**参考链接**

[开发卡片事件](../application-models/arkts-ui-widget-configuration.md)

## 如何在Stage模型中创建后台服务

适用于:Openharmony 3.2 Beta5

**问题现象**

Stage模型中的ServiceExtensionAbility是系统接口,第三方应用不支持调用,如何在Stage模型中如何创建后台服务?

**解决措施**

Stage模型可通过后台任务实现该功能。

**参考链接**

[后台任务](../task-management/background-task-overview.md)

## FA和Stage模型中,应用是否可以创建并指定UIAbility运行在哪个进程

适用于:Openharmony 3.2 Beta5 API 9

**解决措施**

FA和Stage模型中,应用可以创建进程并指定UIAbility运行在某个进程。

-   FA模型

    FA模型支持多进程,默认情况下,同一应用的所有组件均在相同进程中运行,且大多数应用都不应该改变这一点。但是如果应用自身业务需要某个组件独立进程运行,可在config配置文件中配置;配置清单中,ability标签的process子标签可指定该组件在哪个进程中运行,应用可以设置通过该属性使每个组件均在各自的进程中运行,但process子标签仅支持系统应用配置,三方应用配置不生效。

-   Stage模型

    Stage模型支持多进程:Stage模型的进程模型由系统定义,三方应用不能配置多进程;如果需要自定义配置独立进程,需要申请特殊权限;配置清单中,module标签的process子标签可指定该Hap下Ability在哪个进程中运行,应用可以设置通过该属性使每个Hap的Ability组件均在各自的进程中运行。如果不配置,进程名默认为包名。


## Stage模型与FA模型在进程内对象共享方面有哪些差异

适用于:Openharmony 3.2 Beta5 API 9

**解决措施**

-   Stage模型中,多个应用组件共享同一个ArkTS引擎实例,因此在Stage模型中,应用组件之间可以方便的共享对象和状态,同时减少复杂应用运行对内存的占用。
-   FA模型中,每个应用组件独享一个ArkTS引擎实例。Stage模型作为主推的应用模型,开发者通过它能够更加便利地开发出分布式场景下的复杂应用。
72

Z
zengyawen 已提交
73
**参考链接**
Z
zengyawen 已提交
74

Z
zengyawen 已提交
75
[UIAbility组件与UI的数据同步](../application-models/uiability-data-sync-with-ui.md)
Z
zengyawen 已提交
76

Z
zengyawen 已提交
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
## 如何使用AbilityStage的生命周期函数

适用于:Openharmony 3.2 Beta5 API 9

**解决措施**

在module.json5里的module中加上srcEntry字段"srcEntry": "./ets/myabilitystage/MyAbilityStage.ts"。

**参考链接**

[AbilityStage组件容器](../application-models/abilitystage.md)


## 多实例场景下当前Ability调用terminateSelf后,桌面最近任务列表如何设置不保留快照

适用于:Openharmony 3.2 Beta5 API 9

**解决措施**

可在module.json5配置文件中配置removeMissionAfterTerminate为true。

## 通过startAbility\(\)方法无法启动UIAbility实例

适用于:Openharmony 3.2 Beta5 API 9

**解决措施**

-   如果是通过startAbility的方式拉起,检查want中abilityName字段是否携带了bundleName做前缀,如果有,请删除。
-   检查MainAbility.ts文件中onWindowStageCreate方法配置的Ability首页文件是否在main\_pages.json中有定义,如果没有定义,请补齐。SDK和OpenHarmony SDK系统推荐同一天的版本。

## 调用方法的时候,方法内部的this变成了undefined

适用于:Openharmony 3.2 Beta5 API 9

**解决措施**

方式一:在调用方法的时候加上.bind\(this\)
Z
zengyawen 已提交
114 115 116

方式二:使用箭头函数。

Z
zengyawen 已提交
117
## 启动UIAbility时报错:must have required property 'startWindowIcon'
Z
zengyawen 已提交
118

Z
zengyawen 已提交
119
适用于:Openharmony 3.2 Beta5 API 9
Z
zengyawen 已提交
120

Z
zengyawen 已提交
121
**解决措施**
Z
zengyawen 已提交
122

Z
zengyawen 已提交
123
UIAbility配置中缺少startWindowIcon属性配置,需要在module.json5中abilities中配置startWindowIcon。
Z
zengyawen 已提交
124

Z
zengyawen 已提交
125
**代码示例**
126

Z
zengyawen 已提交
127 128 129 130 131 132 133 134 135 136 137 138 139
```
{
  "module": {
    // do something
    "abilities": [{
      // do something
      "startWindowIcon": "$media:space",
      "startWindowBackground": "$color:white",
    }]
  }
}
```

Z
zengyawen 已提交
140
**参考链接**
Z
zengyawen 已提交
141

Z
zengyawen 已提交
142
[Stage模型配置文件](../quick-start/module-configuration-file.md)
Z
zengyawen 已提交
143

Z
zengyawen 已提交
144
## Stage模型是否推荐使用globalThis获取Context
Z
zengyawen 已提交
145

Z
zengyawen 已提交
146
适用于:Openharmony 3.2 Beta5 API 9
147

Z
zengyawen 已提交
148
不推荐,Stage模型使用globalThis去获取Context是错误的使用方式。
149

Z
zengyawen 已提交
150
在Stage模型中,整个应用进程共用一个js虚拟机实例,其中可以运行多个Ability实例,共用一个global对象。在同一个js虚拟机内的不同的Ability中使用globalThis获取Context,存在被覆盖从而发生错误的风险。
151

Z
zengyawen 已提交
152
**参考链接**
153

Z
zengyawen 已提交
154
[UIAbility组件与UI的数据同步](../application-models/uiability-data-sync-with-ui.md)
155

Z
zengyawen 已提交
156
## 部署HAP时上报安装内容过大错误
157

Z
zengyawen 已提交
158
适用于:Openharmony 3.2 Beta5 API 9
159

Z
zengyawen 已提交
160
**问题现象**
161

Z
zengyawen 已提交
162
部署hap时,上报如下错误:
163

Z
zengyawen 已提交
164
Failure\[INSTALL\_FAILED\_SIZE\_TOO\_LARGE\] error while deploying hap?
165

Z
zengyawen 已提交
166
**解决措施**
167

Z
zengyawen 已提交
168
将其拆分为多个HAP即可解决。
169

Z
zengyawen 已提交
170
## 调用方使用startAbilityForResult时,被调用方如何返回数据
171

Z
zengyawen 已提交
172
适用于:Openharmony 3.2 Beta5 API 9
173

Z
zengyawen 已提交
174
**解决措施**
175

Z
zengyawen 已提交
176
被调用方使用AbilityContext.terminateSelfWithResult方法,销毁被调用方ability,传递参数给startAbilityForResult回调函数。
177

Z
zengyawen 已提交
178
**参考链接**
179

Z
zengyawen 已提交
180
[启动应用内的UIAbility并获取返回结果](../application-models/uiability-intra-device-interaction.md)
181 182


Z
zengyawen 已提交
183
## 如何获取系统时间戳
184

Z
zengyawen 已提交
185
适用于:Openharmony 3.2 Beta5 API 9
186

Z
zengyawen 已提交
187
**解决措施**
188

Z
zengyawen 已提交
189
在Openharmony中使用@ohos.systemDateTime的getCurrentTime来获取系统系统时间和时区。
190

Z
zengyawen 已提交
191
**代码示例**
192

Z
zengyawen 已提交
193
使用@ohos.systemDateTime接口:
194

Z
zengyawen 已提交
195 196 197 198 199 200 201 202 203 204 205 206 207
    ```
    try {
      systemDateTime.getCurrentTime(true, (error, time) => {
        if (error) {
          console.info(`Failed to get currentTime. message: ${error.message}, code: ${error.code}`);
          return;
        }
        console.info(`Succeeded in getting currentTime : ${time}`);
      });
    } catch(e) {
      console.info(`Failed to get currentTime. message: ${e.message}, code: ${e.code}`);
    }
    ```
208 209


Z
zengyawen 已提交
210
**参考链接**
211

Z
zengyawen 已提交
212
[系统时间、时区](../reference/apis/js-apis-system-date-time.md#systemdatetimegetcurrenttime)
213

Z
zengyawen 已提交
214
## 如何获取当前应用程序缓存目录
215

Z
zengyawen 已提交
216
适用于:Openharmony 3.2 Beta5 API 9
217

Z
zengyawen 已提交
218
**解决措施**
219

Z
zengyawen 已提交
220
在Openharmony中使用Context.cacheDir获取应用程序的缓存目录。
221

Z
zengyawen 已提交
222
**参考链接**
223

Z
zengyawen 已提交
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
[cacheDir](../application-models/application-context-stage.md#获取应用开发路径)

## 服务卡片生命周期回调函数在哪个js文件中调用

适用于:Openharmony 3.2 Beta5 API 9

**解决措施**

新建卡片时会生成一个FormAblity.ts文件,其中包含卡片对应的生命周期。

参考链接

[FormExtensionAbility](../reference/apis/js-apis-app-form-formExtensionAbility.md)

## 使用ServiceExtensionAbility和DataShareExtensionAbility的相关接口后DevEco Studio无法编译

适用于:Openharmony 3.2 Beta5 API 9

**问题现象**

使用ServiceExtensionAbility和DataShareExtensionAbility的相关接口后,DevEco Studio报错无法编译。

**问题原因**

当前SDK类型有:

-   public-sdk : 面向应用开发者提供,不包含需要使用系统权限的系统接口。
-   full-sdk : 面向OEM厂商提供,包含了需要使用系统权限的系统接口。

DevEco Studio默认下载是public-sdk。

**解决措施**

Z
zengyawen 已提交
257
三方应用不支持开发ServiceExtensionAbility和DataShareExtensionAbility。若开发系统应用,请[下载full-sdk](../faqs/full-sdk-switch-guide.md)
Z
zengyawen 已提交
258 259 260 261 262 263 264 265 266 267 268 269 270

## 如何获取应用级别的temp路径和files路径

适用于:OpenHarmony 3.2 Beta5 

**解决措施**

通过应用上下文context获取。如:this.context.getApplicationContext.tempDir来获取temp路径;this.context.getApplicationContext.filesDir来获取files路径。

**参考链接**

[获取应用开发路径](../application-models/application-context-stage.md#获取应用开发路径)

Z
zengyawen 已提交
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
## terminateSelf方法销毁当前应用之后并没有在后台任务列表中删除

适用于:OpenHarmony 3.2 Beta5

**解决措施**

在当前应用对应UIAbility的module.json5配置文件中,配置abilities标签的removeMissionAfterTerminate字段,设置为true即为销毁应用的同时删除应用快照记录,缺省值为false。

**参考链接**

[module.json5配置文件](../quick-start/module-configuration-file.md)

## Stage模型下开发的应用如何拉起 FA 模型开发的应用

适用于:OpenHarmony 3.2 Beta 5,API 9

**问题现象**

已在stage模型下的应用如何拉起FA模型

**解决措施**

该功能目前已支持,具体实现可参考如下代码:

示例:

```
let want = {
    deviceId: "", // deviceId为空表示本设备
    bundleName: "com.example.myapplication",
    abilityName: "EntryAbility",
    moduleName: "Module1", // moduleName非必选
    parameters: { // 自定义信息
    },
}
// context为意图拉起的FA模型的AbilityContext
context.startAbility(want).then(() => {
    ...
}).catch((err) => {
    ...
})
```

## 原子化服务是否可以全程使用js实现

适用于:Openharmony 3.2 Beta5 API 9

**解决措施**

目前新建的卡片的目录结构都是css+hml+json,不能完全靠js实现,事件的触发和参数的传递都可以在json文件里面处理。
Z
zengyawen 已提交
321 322 323 324

## FA卡片上架后在用户的服务中心展示时可否触发生命周期,从而实现用户没有打开过FA应用的情况下获取到用户的登录信息  

适用于:OpenHarmony 3.2 Beta 5 API 9
325

Z
zengyawen 已提交
326
**问题现象**
327

Z
zengyawen 已提交
328
FA卡片的生命周期以及信息显示
329

Z
zengyawen 已提交
330
**解决措施**
331

Z
zengyawen 已提交
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
服务卡片在添加卡片后就触发了oncreat\(\)生命周期,在不启用app的情况下也可以显示相关的用户信息-静默登录,但服务卡片目前要在app安装之后手动添加。

## JS/ArkTS跳转到其他应用时报错“\[c4d4d3492eb8531, 0, 0\] ContextDeal::startAbility fetchAbilities failed”

适用于:OpenHarmony 3.2 Beta5 API 9

**问题现象**

JS/ArkTS跳转时, startAbility报错

**解决措施**

一般用startAbility,实现如下:

```
import featureAbility from '@ohos.ability.featureAbility'
function onStartRemoteAbility() {
console.info('onStartRemoteAbility begin');
let params;
let wantValue = {
    bundleName: 'ohos.samples.etsDemo',
    abilityName: 'ohos.samples.etsDemo.RemoteAbility',
    deviceId: getRemoteDeviceId(),
    parameters: params
};
console.info('onStartRemoteAbility want=' + JSON.stringify(wantValue));
featureAbility.startAbility({
    want: wantValue
}).then((data) => {
console.info('onStartRemoteAbility finished, ' + JSON.stringify(data));
});
console.info('onStartRemoteAbility end');
}
```

**参考链接**

可参考[启动本地PageAbility](../application-models/start-local-pageability.md)
370

Z
zengyawen 已提交
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
## 如何通过卡片点击实现业务登录场景

适用于: OpenHarmony 3.2 Beta5  API 9

**解决措施**

可以先创建FA模型的卡片,步骤如下:

1. 实现卡片生命周期接口

2. 配置卡片配置文件

3. 卡片信息的持久化

4. 卡片数据交互
386

Z
zengyawen 已提交
387
5. 开发卡片页面
388

Z
zengyawen 已提交
389 390 391 392 393 394 395 396 397 398 399 400 401
6. 开发卡片事件:通过点击卡片拉起响应的Ability后,通过Ability来实现业务登录场景

**参考链接**

[FA卡片开发指导](../application-models/widget-development-fa.md)

## 如何跳转到设置中应用详情页面 

适用于:OpenHarmony 3.2 Beta5  API 9

**解决措施**

参考如下代码实现,示例:
402 403

```
Z
zengyawen 已提交
404 405 406 407 408
this.context.startAbility(
{
  action: "action.settings.app.info",
  parameters: { "settingsParamBundleName": "your app bundlename" }
})
409 410
```

Z
zengyawen 已提交
411
## stage模型,@Component组件内如何获取UIAbilityContext 
412

Z
zengyawen 已提交
413
适用于:OpenHarmony 3.2 Beta5 API9
414

Z
zengyawen 已提交
415
**解决措施**
416

Z
zengyawen 已提交
417
可以通过UIAbility. Context获取。
418

Z
zengyawen 已提交
419
**代码示例**
420

Z
zengyawen 已提交
421
```
Z
zengyawen 已提交
422
import common from '@ohos.app.ability.common';
Z
zengyawen 已提交
423 424 425 426 427

@Entry
@Component
struct AbilityContextTest {
  // abilityContext
Z
zengyawen 已提交
428 429
  @State UIAbilityInfo: string = '获取 abilityInfo'
  UIAbilityContext: common.UIAbilityContext
Z
zengyawen 已提交
430 431

  aboutToAppear() {
Z
zengyawen 已提交
432 433
    // getContext获取Context,转为abilityContext
    this.UIAbilityContext = getContext(this) as common.UIAbilityContext
Z
zengyawen 已提交
434
  }
435

Z
zengyawen 已提交
436 437 438
  build() {
    Row() {
      Column({ space: 20 }) {
Z
zengyawen 已提交
439
        Text(this.UIAbilityInfo)
Z
zengyawen 已提交
440
          .fontSize(20)
Z
zengyawen 已提交
441 442 443
          .onClick(() => {
            this.UIAbilityInfo = JSON.stringify(this.UIAbilityContext.abilityInfo)
            console.log(`ContextDemo abilityInfo = ${this.UIAbilityInfo}`)
Z
zengyawen 已提交
444 445 446 447 448 449 450 451
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}
```
Z
zengyawen 已提交
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486

## 后台长时任务启动失败

适用于:OpenHarmony 3.2 Release API9

**问题现象**

调用featureAbility.startAbility\(\)接口启动ServiceAbility,在ServiceAbility中启动后台长时任务报错,错误信息:\{"code":201,"message":"BussinessError 201: Permission denied."\}

**解决措施**

启动后台长时任务需要在module.json5文件中配置长时任务权限ohos.permission.KEEP\_BACKGROUND\_RUNNING、同时为需要使用长时任务的ability声明相应的后台模式类型。

```
"module": {
    "abilities": [
        {
            "backgroundModes": [
            "dataTransfer",
            "location"
            ], // 后台模式类型
        }
    ],
    "requestPermissions": [
        {
            "name": "ohos.permission.KEEP_BACKGROUND_RUNNING"  // 长时任务权限
        }
    ]
}
```

**参考链接**

[ServiceAbility组件配置-后台模式类型](../application-models/serviceability-configuration.md)

Z
zengyawen 已提交
487
[长时任务权限](../security/permission-list.md#ohospermissionkeep_background_running)
Z
zengyawen 已提交
488 489 490 491 492 493 494 495 496 497 498 499

[长时任务开发指导](../task-management/continuous-task-dev-guide.md#基于stage模型)

## FA卡片如何进行数据交互

适用于:OpenHarmony SDK 3.2 Beta 5 API9

卡片通过postCardAction接口触发和提供方的交互,在提供方中通过updateForm方法更新数据。

**参考链接**

[服务卡片开发指导](../application-models/widget-development-fa.md)