• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
83module.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当前不支持