• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
77module.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