1

OpenHarmony使用Stage模型和FA模型开发分布式应用时的差别

 1 year ago
source link: https://www.51cto.com/article/743111.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

OpenHarmony使用Stage模型和FA模型开发分布式应用时的差别

作者:Haoc_小源同学 2022-12-26 11:24:28
Stage模型中配置文件由FA模型的config.json改为module.json5,同时一些字段名也发生了改变,例如reqPermissions就改为requestPermissions(好像这个区别并不是很起眼,但就是因为之前我有一个朋友在使用Stage模型开发时直接复制了FA模型的请求权限代码。
4919a8059d64fafa616988a90d81f6c10fe82e.png

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

笔者这两个月一直在折腾分布式应用,并且分别基于API8的FA模型以及API9的Stage模型进行了开发,这两天总算是基本开发完了,闲下来总结下这两者的区别,顺便跟大家唠唠开发时踩过的坑

Stage模型中配置文件由FA模型的config.json改为module.json5,同时一些字段名也发生了改变,例如reqPermissions就改为requestPermissions(好像这个区别并不是很起眼,但就是因为之前我有一个朋友在使用Stage模型开发时直接复制了FA模型的请求权限代码,而我一开始也没看出来哪里有问题,因为只差了几个字母,后来我手敲代码才找到了问题所在😂)。

"reqPermissions": [
  {
    "name": "ohos.permission.DISTRIBUTED_DATASYNC"
  }
]

Stage

"requestPermissions": [
  {
    "name": "ohos.permission.DISTRIBUTED_DATASYNC"
  }
]

获取Context

let context = featureAbility.getContext();

Stage

Stage模型中包含多种Context,比较常用的有AbilityContext和在eTS页面中访问Context,更多详见参考资料[1]。

  • AbilityContext

Stage模型下,每个Ability中都包含了一个Context属性。

OpenHarmony使用Stage模型和FA模型开发分布式应用时的差别-开源基础软件社区

在继承Ability的类中通过this.context​就可以获取AbilityContext,从而操作Ability的方法(如startAbility、connectAbility等)。

import Ability from '@ohos.application.Ability'

export default class MainAbility extends Ability {
    onCreate(want, launchParam) {
        this.context.requestPermissionsFromUser(PERMISSIONS)
    }
    onWindowStageCreate(windowStage) {
        let context = this.context;
    }
    ...
};
  • 在eTS页面中访问Context。

getContext(component: Object): Object

获取页面中component所关联的Context对象。

// 获取当前component关联的Context
let context = getContext(this) as any

启动Ability

featureAbility.startAbility({
  want: {
    bundleName: 'com.haoc.distributevideoplayer',
    abilityName: 'com.haoc.distributevideoplayer.MainAbility',
    deviceId: deviceId,
    parameters: {
      isFA: 'FA'
    }
  }
})

Stage

context.startAbility({
  bundleName: 'com.haoc.distributevideoplayer',
  abilityName: 'EntryAbility',
  deviceId: deviceId,
  parameters: {
    isFA: 'FA'
  }
})

1.Stage模型不再使用featureAbility接口,而需要先获取当前Ability的上下文,再由AbilityContext调用startAbility方法。

2.相比FA模型少了一对{}括号。

3.MainAbility改名为EntryAbility,且abilityName不再是由package + Ability name组成。

由于开发时部分接口在API9以上才提供,所以需要将应用API升级到9。但其实API9也提供了FA模型,只需要在API8的基础上进行小部分修改即可,那笔者为何还花费大量精力去折腾Stage模型呢?一个是想体验一下这两者在开发上的差别,另一个是未来将不再主推FA模型,现在学习的成本没有以后的成本高。笔者在开发时还发现许多接口将被废弃,例如Ability,将会用UIAbility代替,不过接口基本上不会有很大改变,都是改个名字、加个参数之类。

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

责任编辑:jianghua 来源: 51CTO 开源基础软件社区

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK