OpenHarmony应用开发模型详解
开发环境 IDE: DevEco Studio 3.0 Release(Build Version: 3.0.0.993) SDK:Api Version8和9 Ability模型 Ability分为FA和Stage两种模型,在API 8及其更早版本的应用程序只能使用FA模型进行开发,而从API 9开始,Ability框架引入了Stage模型作为第二种应用框架形态。FA与Stage这两种
开发环境
SDK:Api Version8和9
Ability模型
Ability分为FA和Stage两种模型,在API 8及其更早版本的应用程序只能使用FA模型进行开发,而从API 9开始,Ability框架引入了Stage模型作为第二种应用框架形态。FA与Stage这两种模型在工程目录结构,配置文件以及在应用上下文context能力的运用上有较大区别。
工程结构
FA模型目录结构
└── entry
└── src
└── main
├── ets
| └── MainAbility //应用/服务的入口
| ├── pages //MainAbility包含的页面
| | └── index.ets //pages列表中的第一个页面,即应用的首页入口
| └── app.ets //承载Ability生命周期
├── resources //用于存放应用/服务所用到的资源文件,如图形、多媒体、字符串、布局文件等
| └── base
| ├── element //包括字符串、整型数、颜色、样式等资源的json文件,每个资源均由json格式进行定义
| | └── string.json
| └── media //多媒体文件,如图形、视频、音频等文件,支持的文件格式包括:.png、.gif、.mp3、.mp4等
| └── icon.png
└── config.json
Stage模型目录结构
├── AppScope
| ├── resources
| | └── base
| | ├── element //包括字符串、整型数、颜色、样式等资源的json文件,每个资源均由json格式进行定义
| | | └── string.json
| | └── media //多媒体文件,如图形、视频、音频等文件,支持的文件格式包括:.png、.gif、.mp3、.mp4等
| | └── app_icon.png
| └── app.json5 //应用的全局配置,同一应用的不同.hap文件必须使用相同的应用配置
└── entry //OpenHarmony工程模块,编译构建生成一个Hap包
└── src
└── main
├── ets //用于存放ets源码
| ├── Application //模块的入口
| | └── AbilityStage.ts
| ├── MainAbility //模块对应ability的入口
| | └── MainAbility.ts
| └── pages //模块包含的页面
| └── index.ets
├── resources
| └── base
| ├── element
| | └── string.json
| ├── media
| | └── icon.png
| └── profile
| └── main_pages.json
└── module.json5
配置文件
FA模型(config.json)
config.json 由 app、deviceConfig和module 三个部分组成,缺一不可。配置文件的内部结构说明如下表。
表配置文件的内部结构说明
属性名称 | 含义 | 数据类型 | 是否可缺省 |
---|---|---|---|
app | 表示应用的全局配置信息。同一个应用的不同HAP包的app配置必须保持一致。 | 对象 | 不可缺省 |
deviceConfig | 表示应用在具体设备上的配置信息。 | 对象 | 不可缺省 |
module | 表示HAP包的配置信息。该标签下的配置只对当前HAP包生效。 | 对象 | 不可缺省 |
module对象的内部结构中abilities对象的内部结构说明
属性名称 | 含义 | 数据类型 | 是否可缺省 |
---|---|---|---|
process | 运行应用程序或Ability的进程名称。如果在deviceConfig标记中配置了进程,则应用程序的所有能力都在此进程中运行。您还可以为特定能力设置流程属性,以便该能力可以在此流程中运行。如果此属性设置为与其他应用程序相同的进程名称,则所有这些应用程序可以在同一进程中运行,前提是他们具有相同的联合用户ID和相同的签名。运行OHOS的设备不支持此属性。 | 字符串 | 可缺省,缺省值为空。 |
name | 表示Ability名称。取值可采用反向域名方式表示,由包名和类名组成,如“com.example.myapplication.MainAbility”;也可采用“.”开头的类名方式表示,如“.MainAbility”。 Ability的名称,需在一个应用的范围内保证唯一。该标签仅适用于默认设备、平板、智慧屏、车机、智能穿戴。 说明:在使用DevEco Studio新建项目时,默认生成首个Ability的配置,即“config.json”中“MainAbility”的配置。如使用其他IDE工具,可自定义名称。该标签最大长度为127。 | 字符串 | 不可缺省 |
description | 表示对Ability的描述。取值可以是描述性内容,也可以是对描述性内容的资源索引,以支持多语言。该标签最大长度为255。 | 字符串 | 可缺省,缺省值为空。 |
icon | 表示Ability图标资源文件的索引。取值示例:$media:ability_icon。如果在该Ability的skills属性中,actions的取值包含 “action.system.home”,entities取值中包含“entity.system.home”,则该Ability的icon将同时作为应用的icon。如果存在多个符合条件的Ability,则取位置靠前的Ability的icon作为应用的icon。 说明:应用的“icon”和“label”是用户可感知配置项,需要区别于当前所有已有的应用“icon”或“label”(至少有一个不同)。 | 字符串 | 可缺省,缺省值为空。 |
label | 表示Ability对用户显示的名称。取值可以是Ability名称,也可以是对该名称的资源索引,以支持多语言。如果在该Ability的skills属性中,actions的取值包含 “action.system.home”,entities取值中包含“entity.system.home”,则该Ability的label将同时作为应用的label。如果存在多个符合条件的Ability,则取位置靠前的Ability的label作为应用的label。 说明: 应用的“icon”和“label”是用户可感知配置项,需要区别于当前所有已有的应用“icon”或“label”(至少有一个不同)。该标签为资源文件中定义的字符串的引用,或以"{}"包括的字符串。该标签最大长度为255。 | 字符串 | 可缺省,缺省值为空。 |
uri | 表示Ability的统一资源标识符。该标签最大长度为255。 | 字符串 | 可缺省,对于data类型的Ability不可缺省。 |
launchType | 表示Ability的启动模式,支持“standard”和“singleton”两种模式: standard:表示该Ability可以有多实例。该模式适用于大多数应用场景。 singleton:表示该Ability在所有任务栈中仅可以有一个实例。例如,具有全局唯一性的呼叫来电界面即采用“singleton”模式。该标签仅适用于默认设备、平板、智慧屏、车机、智能穿戴。 | 字符串 | 可缺省,缺省值为“singleton”。 |
visible | 表示Ability是否可以被其他应用调用。 true:可以被其他应用调用。 false:不能被其他应用调用。 | 布尔类型 | 可缺省,缺省值为“false”。 |
permissions | 表示其他应用的Ability调用此Ability时需要申请的权限集合,一个数组元素为一个权限名称。通常采用反向域名格式(最大255字节),取值为系统预定义的权限。 | 字符串数组 | 可缺省,缺省值为空。 |
skills | 表示Ability能够接收的want的特征。 | 对象数组 | 可缺省,缺省值为空。 |
deviceCapability | 表示Ability运行时要求设备具有的能力,采用字符串数组的格式表示。 | 字符串数组 | 可缺省,缺省值为空。 |
metaData | 元数据,参考表1。 | 对象 | 可缺省,缺省值为空。 |
type | 表示Ability的类型。取值范围如下: page:表示基于Page模板开发的FA,用于提供与用户交互的能力。 service:表示基于Service模板开发的PA,用于提供后台运行任务的能力。 data:表示基于Data模板开发的PA,用于对外部提供统一的数据访问抽象。 CA:表示支持其他应用以窗口方式调起该Ability。 | 字符串 | 不可缺省 |
orientation | 表示该Ability的显示模式。该标签仅适用于page类型的Ability。取值范围如下: unspecified:由系统自动判断显示方向。 landscape:横屏模式。 portrait:竖屏模式。 followRecent:跟随栈中最近的应用。 | 字符串 | 可缺省,缺省值为“unspecified”。 |
backgroundModes | 表示后台服务的类型,可以为一个服务配置多个后台服务类型。该标签仅适用于service类型的Ability。取值范围如下: dataTransfer:通过网络/对端设备进行数据下载、备份、分享、传输等业务。 audioPlayback:音频输出业务。 audioRecording:音频输入业务。 pictureInPicture:画中画、小窗口播放视频业务。 voip:音视频电话、VOIP业务。 location:定位、导航业务。 bluetoothInteraction:蓝牙扫描、连接、传输业务。 wifiInteraction:WLAN扫描、连接、传输业务。 screenFetch:录屏、截屏业务。 multiDeviceConnection:多设备互联业务 | 字符串数组 | 可缺省,缺省值为空。 |
grantPermission | 指定是否可以向Ability内任何数据授予权限。 | 布尔值 | 可缺省,缺省值为空。 |
readPermission | 表示读取Ability的数据所需的权限。该标签仅适用于data类型的Ability。取值为长度不超过255字节的字符串。该标签仅适用于默认设备、平板、智慧屏、车机、智能穿戴。 | 字符串 | 可缺省,缺省为空。 |
writePermission | 表示向Ability写数据所需的权限。该标签仅适用于data类型的Ability。取值为长度不超过255字节的字符串。该标签仅适用于默认设备、平板、智慧屏、车机、智能穿戴。 | 字符串 | 可缺省,缺省为空。 |
configChanges | 表示Ability关注的系统配置集合。当已关注的配置发生变更后,Ability会收到onConfigurationUpdated回调。取值范围: mcc:表示IMSI移动设备国家/地区代码(MCC)发生变更。典型场景:检测到SIM并更新MCC。 mnc:IMSI移动设备网络代码(MNC)发生变更。典型场景:检测到SIM并更新MNC。 locale:表示语言区域发生变更。典型场景:用户已为设备文本的文本显示选择新的语言类型。 layout:表示屏幕布局发生变更。典型场景:当前有不同的显示形态都处于活跃状态。 fontSize:表示字号发生变更。典型场景:用户已设置新的全局字号。 orientation:表示屏幕方向发生变更。典型场景:用户旋转设备。 density:表示显示密度发生变更。典型场景:用户可能指定不同的显示比例,或当前有不同的显示形态同时处于活跃状态。 size:显示窗口大小发生变更。 smallestSize:显示窗口较短边的边长发生变更。 colorMode:颜色模式发生变更。 | 字符串数组 | 可缺省,缺省为空。 |
mission | 表示Ability指定的任务栈。该标签仅适用于page类型的Ability。默认情况下应用中所有Ability同属一个任务栈。该标签仅适用于默认设备、平板、智慧屏、车机、智能穿戴。 | 字符串 | 可缺省,缺省为应用的包名。 |
targetAbility | 表示当前Ability重用的目标Ability。该标签仅适用于page类型的Ability。如果配置了targetAbility属性,则当前Ability(即别名Ability)的属性中仅name、icon、label、visible、permissions、skills生效,其它属性均沿用targetAbility中的属性值。目标Ability必须与别名Ability在同一应用中,且在配置文件中目标Ability必须在别名之前进行声明。该标签仅适用于默认设备、平板、智慧屏、车机、智能穿戴。 | 字符串 | 可缺省,缺省值为空。表示当前Ability不是一个别名Ability。 |
multiUserShared | 表示Ability是否支持多用户状态进行共享,该标签仅适用于data类型的Ability。配置为“true”时,表示在多用户下只有一份存储数据。需要注意的是,该属性会使visible属性失效。该标签仅适用于默认设备、平板、智慧屏、车机、智能穿戴。 | 布尔值 | 可缺省,缺省值为“false”。 |
supportPipMode | 表示Ability是否支持用户进入PIP模式(用于在页面最上层悬浮小窗口,俗称“画中画”,常见于视频播放等场景)。该标签仅适用于page类型的Ability。该标签仅适用于默认设备、平板、智慧屏、车机、智能穿戴。 | 布尔值 | 可缺省,缺省值为“false”。 |
formsEnabled | 表示Ability是否支持卡片(forms)功能。该标签仅适用于page类型的Ability。 true:支持卡片能力。 false:不支持卡片能力。 | 布尔值 | 可缺省,缺省值为“false”。 |
forms | 表示服务卡片的属性。该标签仅当formsEnabled为“true”时,才能生效。 | 对象数组 | 可缺省,缺省值为空。 |
srcLanguage | Ability开发语言的类型。 | 字符串 | 可缺省,取值为js或ets |
srcPath | 该标签表示Ability对应的JS组件代码路径 | 字符串 | 可缺省,缺省值为空。 |
uriPermission | 表示该Ability有权访问的应用程序数据。此属性由模式和路径子属性组成。此属性仅对类型提供者的能力有效。运行OHOS的设备不支持此属性。参考表2。 | 对象 | 可缺省,缺省值为空。 |
startWindowIcon | 表示该Ability启动页面图标资源文件的索引。该标签仅适用于page类型的ability。取值示例:$media:icon。 | 字符串 | 可缺省,缺省值为空。 |
startWindowBackground | 表示该Ability启动页面背景颜色资源文件的索引。该标签仅适用于page类型的ability。取值示例:$color:red。 | 字符串 | 可缺省,缺省值为空。 |
removeMissionAfterTerminate | 该标签标识ability销毁后是否从任务列表中移除任务。该标签仅适用于page类型的ability。true表示销毁后移除任务, false表示销毁后不移除任务。 | 布尔值 | 可缺省,缺省值为false。 |
表1 metaData对象的内部结构说明
属性名称 | 含义 | 数据类型 | 是否可缺省 |
---|---|---|---|
parameters | 表示调用Ability时所有调用参数的元信息。每个调用参数的元信息由以下三个标签组成:description、name、type | 对象数组 | 可缺省,缺省值为空 |
results | 表示Ability返回值的元信息。每个返回值的元信息由以下三个标签组成:description、name、type | 对象数组 | 可缺省,缺省值为空。 |
customizeData | 该标签标识父级组件的自定义元信息,Parameters和results在application不可配 | 对象数组 | 可缺省,缺省值为空。 |
表2 uriPermission对象的内部结构说明
属性名称 | 含义 | 数据类型 | 是否可缺省 |
---|---|---|---|
path | uriPermission标识的路径 | 字符串 | 不可缺省 |
mode | uriPeimission的匹配模式 | 字符串 | 可缺省,缺省值为default。 |
abilities示例:
"abilities": [
{
"name": ".MainAbility",
"description": "test main ability",
"icon": "$media:ic_launcher",
"label": "$media:example",
"launchType": "standard",
"orientation": "unspecified",
"permissions": [],
"visible": true,
"skills": [
{
"actions": [
"action.system.home"
],
"entities": [
"entity.system.home"
]
}
],
"configChanges": [
"locale",
"layout",
"fontSize",
"orientation"
],
"type": "page",
"startWindowIcon": "$media:icon",
"startWindowBackground": "$color:red",
"removeMissionAfterTerminate": true
},
{
"name": ".PlayService",
"description": "example play ability",
"icon": "$media:ic_launcher",
"label": "$media:example",
"launchType": "standard",
"orientation": "unspecified",
"visible": false,
"skills": [
{
"actions": [
"action.play.music",
"action.stop.music"
],
"entities": [
"entity.audio"
]
}
],
"type": "service",
"backgroundModes": [
"audioPlayback"
]
},
{
"name": ".UserADataAbility",
"type": "data",
"uri": "dataability://com.example.world.test.UserADataAbility",
"visible": true
}
]
Stage模型(module.json5)
配置文件由app和module这两个部分组成,缺一不可。配置文件的内部结构说明如下表。
表 配置文件的内部结构说明
属性名称 | 含义 | 数据类型 | 是否可缺省 |
---|---|---|---|
app | 表示应用的全局配置信息。同一个应用的不同HAP包的app配置必须保持一致 | 对象 | 否 |
module | 表示HAP包的配置信息。该标签下的配置只对当前HAP包生效 | 对象 | 否 |
module对象的内部结构中abilities对象的内部结构说明
属性 | 含义 | 数据类型 | 是否可缺省 |
---|---|---|---|
name | 该标签标识当前ability的逻辑名,该名称在整个应用要唯一,标签值采用字符串表示(最大长度127个字节)。 | 字符串 | 该标签不可缺省。 |
srcEntrance | 该标签表示ability所对应的js代码路径,标签值为字符串(最长为127字节)。。 | 字符串 | 该标签不可缺省。 |
launchType | 该标签标示ability的启动模式,标签值可选“standard”、“singleton”、“specified”。该标签缺省为"singleton"。standard表示普通多实例,specified表示指定实例,运行时由ability内部业务决定是否创建多实例,singleton表示单实例。 | 字符串 | 可缺省,该标签缺省为"singleton" |
description | 该标签标识ability的描述,标签值是是字符串类型或对描述内容的资源索引,要求采用用资源索引方式,以支持多语言。 | 字符串 | 该标签可缺省,缺省值为空。 |
icon | 该标签标识ability图标,标签值为资源文件的索引。该标签可缺省,缺省值为空。 如果ability被配置为MainElement,该标签必须配置。 | 字符串 | 该标签可缺省,缺省值为空。 如果ability被配置为MainElement,该标签必须配置。 |
permissions | 该标签标识被其它应用的ability调用时需要申请的权限的集合,一个数组元素为一个权限名称。通常采用反向域名格式(最大255字节),取值为系统预定义的权限。 | 字符串数组 | 该标签可缺省,缺省值为空。 |
metadata | 该标签表示ability的元信息 | 数组 | 该标签可缺省,缺省值为空。 |
visible | 该标签标识ability是否可以被其它应用调用,为布尔类型,true表示可以被其它应用调用, false表示不可以被其它应用调用。 | 布尔值 | 该标签可缺省,缺省值为false。 |
continuable | 该标签标识ability是否可以迁移,为布尔类型,true表示可以被迁移, false表示不可以被迁移。 | 布尔值 | 该标签可缺省,缺省值为false。 |
skills | 该标签标识ability能够接收的意图的特征集,为数组格式。 配置规则 : entry包可以配置多个具有入口能力的skills标签(配置了action.system.home和entity.system.home)的ability,其中第一个配置了skills标签的ability中的label和icon作为OpenHarmony服务或应用的label和icon。 OpenHarmony服务的Feature包不能配置具有入口能力的skills标签。 OpenHarmony应用的Feature包可以配置具有入口能力的skills标签。 | 数组 | 该标签可缺省,缺省值为空。 |
backgroundModes | 该标签标识ability长时任务集合。指定用于满足特定类型的长时任务。 长时任务类型有如下 : dataTransfer :通过网络/对端设备进行数据下载、备份、分享、传输等业务。 audioPlayback :音频输出业务。 audioRecording :音频输入业务。 location :定位、导航业务。 bluetoothInteraction :蓝牙扫描、连接、传输业务(穿戴)。 multiDeviceConnection :多设备互联业务。 wifiInteraction :Wifi扫描、连接、传输业务(克隆 多屏)。 voip :音视频电话,VOIP业务。 taskKeeping :计算业务。 | 字符串 | 可缺省,缺省为空。 |
startWindowIcon | 表示该Ability启动页面图标资源文件的索引。取值示例:$media:icon。 | 字符串 | 不可缺省。 |
startWindowBackground | 表示该Ability启动页面背景颜色资源文件的索引。取值示例:$color:red。 | 字符串 | 不可缺省。 |
removeMissionAfterTerminate | 该标签标识ability销毁后是否从任务列表中移除任务。为布尔类型,true表示销毁后移除任务, false表示销毁后不移除任务。 | 布尔值 | 该标签可缺省,缺省值为false。 |
orientation | 表示该ability启动时的方向。该方向的取值范围包括: unspecified: 未指定方向,由系统自动判断显示方向, landscape:横屏, portrait:竖屏, landscape_inverted: 反向横屏, portrait_inverted: 反向竖屏, auto_rotation: 随传感器旋转, auto_rotation_landscape: 传感器横屏旋转,包括了横屏和反向横屏, auto_rotation_portrait: 传感器竖屏旋转,包括了竖屏和反向竖屏, auto_rotation_restricted: 传感器开关打开,方向可随传感器旋转, auto_rotation_landscape_restricted: 传感器开关打开,方向可随传感器旋转为横屏, 包括了横屏和反向横屏, auto_rotation_portrait_restricted: 传感器开关打开,方向随可传感器旋转为竖屏, 包括了横屏和反向横屏, locked: 传感器开关关闭,方向锁定。 | 字符串 | 该标签可缺省,缺省值为unspecified。 |
supportWindowMode | 表示该ability所支持的窗口模式,包含: fullscreen: 全屏模式, split: 分屏模式, floating: 悬浮窗模式。 | 数组 | 该标签可缺省,缺省值为 ["fullscreen", "split", "floating"]。 |
maxWindowRatio | 表示该ability支持的最大的宽高比。 | 数值 | 该标签可缺省,缺省值为平台支持的最大的宽高比。 |
minWindowRatio | 表示该ability支持的最小的宽高比。 | 数值 | 该标签可缺省,缺省值为平台支持的最小的宽高比。 |
maxWindowWidth | 表示该ability支持的最大的窗口宽度,宽度单位为pixl。 | 数值 | 该标签可缺省,缺省值为平台支持的最大的窗口宽度。 |
minWindowWidth | 表示该ability支持的最小的窗口宽度, 宽度单位为pixl。 | 数值 | 该标签可缺省,缺省值为平台支持的最小的窗口宽度。 |
maxWindowHeight | 表示该ability支持的最大的窗口高度, 高度单位为pixl。 | 数值 | 该标签可缺省,缺省值为平台支持的最大的窗口高度。 |
minWindowHeight | 表示该ability支持的最小的窗口高度, 高度单位为pixl。 | 数值 | 该标签可缺省,缺省值为平台支持的最小的窗口高度。 |
excludeFromMissions | 该标签标识ability是否在最近任务列表中显示,仅支持系统应用配置。为布尔类型,true表示不在任务列表中显示,false表示在任务列表中显示。 | 布尔值 | 该标签可缺省,缺省值为false。 |
abilities示例
{
"abilities": [{
"name": "MainAbility",
"srcEntrance": "./ets/login/MyLoginAbility.ts",
"launchType":"standard",
"description": "$string:description_main_ability",
"icon": "$media:icon",
"label": "Login",
"permissions": [],
"metadata": [],
"visible": true,
"continuable": true,
"skills": [{
"actions": ["action.system.home"],
"entities": ["entity.system.home"],
"uris": []
}],
"backgroundModes": [
"dataTransfer",
"audioPlayback",
"audioRecording",
"location",
"bluetoothInteraction",
"multiDeviceConnection",
"wifiInteraction",
"voip",
"taskKeeping"
],
"startWindowIcon": "$media:icon",
"startWindowBackground": "$color:red",
"removeMissionAfterTerminate": true,
"orientation": " ",
"supportWindowMode": ["fullscreen", "split", "floating"],
"maxWindowRatio": 3.5,
"minWindowRatio": 0.5,
"maxWindowWidth": 2560,
"minWindowWidth": 1400,
"maxWindowHeight": 300,
"minWindowHeight": 200,
"excludeFromMissions": false
}]
}
应用上下文
Context是应用中对象的上下文,提供获取应用程序环境信息的能力。
OpenHarmony的应用框架分为FA模型和Stage两种模型。对应存在两套Context机制适配两种应用框架模型,其中application/BaseContext属于通用的Context基类,里面包含一个属性stageMode,用来区分开发模型是FA还是Stage。
只有app/Context中的方法属于FA模型对应的Context。该模式下,应用级别的Context和Ability级别的Context都是该类型的实例,如果在应用级别的Context里面调用了Ability级别的方法,会产生错误。所以开发者需要注意Context实例所代表的实际含义。
除了app/Context之外的Context都属于Stage模型,分别有application/Context、application/ApplicationContext、application/AbilityStageContext、application/ExtensionContext、application/AbilityContext、application/FormExtensionContext等Context。
FA模型的Context
只有app/Context中的方法属于FA模型对应的Context,FA模型只有一个Context定义。
Context中所有的功能都是通过方法来提供的,它提供了一些featureAbility中不存在的方法,相当于featureAbility的一个扩展和补全。
使用说明
Context对象是在featureAbility中创建实例,并通过featureAbility的getContext()接口返回,因此在使用Context时,必须导入@ohos.ability.featureAbility库。
示例
import featureAbility from '@ohos.ability.featureAbility'
// 获取Context并调用相关方法
let context = featureAbility.getContext();
context.getOrCreateLocalDir()
Stage模型的Context
Stage模型下,每个Ability中都包含了一个Context属性,由AbilityContext实现操作Ability的方法(如startAbility、connectAbility等)。
AbilityContext是Ability的上下文环境,继承自Context,Context里面提供了应用的一些基础信息:resourceManager、applicationInfo、cacheDir、area等,还有应用的一些基本方法:createBundleContext等。
AbilityContext模块提供允许访问特定于ability的资源的能力,包括对Ability的启动、停止的设置、获取caller通信接口、拉起弹窗请求用户授权等。
使用说明
在Ability生命周期中使用AbilityContext的功能,需要通过Ability子类实例context获取。
示例
import Ability from '@ohos.application.Ability'
class MainAbility extends Ability {
... ...
onWindowStageCreate(windowStage) {
// 通过子类实例context(后者),获取AbilityContext并调用相关方法
let context = this.context;
}
... ...
}
在UI页面或其他自定义方法页面,可通过全局getContext函数调用AbilityContext相关功能,getContext中的this参数指向当前UI组件名或方法名,作为全局getContext函数的区分。
getContext函数属于Context类型,此时的Context是一个定义上下文的模拟对象。
示例
@Entry
@Component
export struct Index {
private context = getContext(this)
...
aboutToAppear() {
this.context.filesDir
}
}
常见错误使用方式
Stage模型通过globalThis去获取Context
案例
在生命周期中使用globalThis获取Abilitycontext的能力,然后在UI页面使用globalThis去调用Abilitycontext的相关方法,如下实例:
//MainAbility.ts
onWindowStageCreate(windowStage) {
// Main window is created, set main page for this ability
console.log("[Demo] MainAbility onWindowStageCreate")
// 通过globalThis.context调用子类context,获取AbilityContext并调用相关方法
globalThis.context = this.context
windowStage.setUIContent(this.context, "pages/nav", null)
}
//index.ets
@Entry
@Component
struct Index {
aboutToAppear() {
globalThis.context.filesDir
}
build() {
...
}
}
原因
在API8的FA模型下,每个Ability实例有一个js虚拟机实例,所以可以从js引擎的global对象上,获取到一个全局的Ability实例,但是在新的模型(Stage模型)下,整个应用进程共用一个js虚拟机实例,其中可以运行多个Ability实例,这样就不存在一个全局的Ability实例。
如果开发者在新的模型(Stage模型)下,调用的API实现仍然走到了获取全局Ability实例的方法,就可能会发生错误或者崩溃。
FA模型和Stage模型中context功能差异
FA模型AbilityContext API特有接口功能介绍
接口名 | 描述 |
---|---|
getOrCreateLocalDir(callback:AsyncCallback<string>): void; | 获取应用的本地根目录。如果是第一个呼叫,则目录将被创建 |
verifyPermission(permission: string, options?: PermissionOptions): Promise<number>; verifyPermission(permission: string, options: PermissionOptions, callback: verifyPermission(permission: string, callback: AsyncCallback<number>): void; | 验证是否允许对特定功能的特定权限 |
requestPermissionsFromUser(permissions: Array<string>, requestCode: number, resultCallback: AsyncCallback<PermissionRequestResult>): void; requestPermissionsFromUser(permissions: Array<string>, requestCode: number): Promise<PermissionRequestResult>; | 向系统请求某些权限 |
getApplicationInfo(callback: AsyncCallback<ApplicationInfo>): void getApplicationInfo(): Promise<ApplicationInfo>; | 获取当前应用的信息。 |
getBundleName(callback: AsyncCallback<string>): void getBundleName(): Promise<string>; | 获取当前能力的套餐名称 |
getDisplayOrientation(callback: AsyncCallback<DisplayOrientation>): void getDisplayOrientation(): Promise<DisplayOrientation>; | 获取此能力的当前显示方向 |
setDisplayOrientation(orientation: DisplayOrientation, callback: AsyncCallback<void>): void setDisplayOrientation(orientation: DisplayOrientation): Promise<void>; | 设置当前能力的显示方向 |
setShowOnLockScreen(show: boolean, callback: AsyncCallback<void>): void setShowOnLockScreen(show: boolean): Promise<void>; | 设置每当显示锁定屏幕时,是否在锁定屏幕顶部显示此技能,并将该技能保持在激活状态。 |
setWakeUpScreen(wakeUp: boolean, callback: AsyncCallback<void>): void setWakeUpScreen(wakeUp: boolean): Promise<void>; | 设置恢复此能力时是否唤醒屏幕 |
getProcessInfo(callback: AsyncCallback<ProcessInfo>): void getProcessInfo(): Promise<ProcessInfo>; | 获取当前进程的信息,包括进程ID和进程名称 |
getElementName(callback: AsyncCallback<ElementName>): void getElementName(): Promise<ElementName>; | 获取当前能力的ohos.bundle.ElementName对象。此方法仅对Page功能可用 |
getProcessName(callback: AsyncCallback<string>): void getProcessName(): Promise<string>; | 获取当前进程的名称 |
getCallingBundle(callback: AsyncCallback<string>): void getCallingBundle(): Promise<string>; | 获取调用当前能力的能力的捆绑包名称 |
getFilesDir(callback: AsyncCallback<string>): void; getFilesDir(): Promise<string>; | 获取该应用程序在内部存储上的文件目录 |
getCacheDir(callback: AsyncCallback<string>): void; getCacheDir(): Promise<string>; | 取此应用程序在内部存储上的缓存目录 |
getOrCreateDistributedDir(): Promise<string>; getOrCreateDistributedDir(callback: AsyncCallback<string>): void; | 获取能力或应用数据文件的分布式文件路径 |
getAppType(callback: AsyncCallback<string>): void getAppType(): Promise<string>; | 获取应用类型 |
getHapModuleInfo(callback: AsyncCallback<HapModuleInfo>): void getHapModuleInfo(): Promise<HapModuleInfo>; | 获取此应用程序的ModuleInfo对象 |
getAppVersionInfo(callback: AsyncCallback<AppVersionInfo>): void getAppVersionInfo(): Promise<AppVersionInfo>; | 获取应用版本信息 |
getApplicationContext(): Context; | 获取此应用程序的上下文 |
getAbilityInfo(callback: AsyncCallback<AbilityInfo>): void getAbilityInfo(): Promise<AbilityInfo>; | 查看此能力的详细信息 |
isUpdatingConfigurations(callback: AsyncCallback<boolean>): void; isUpdatingConfigurations(): Promise<boolean>; | 检查此能力的配置是否正在更改 |
printDrawnCompleted(callback: AsyncCallback<void>): void; printDrawnCompleted(): Promise<void>; | 通知系统绘制此页面功能所需的时间 |
StageAbilityContext API特有接口功能介绍
接口名 | 描述 |
---|---|
startAbilityByCall(want: Want): Promise<Caller>; | 获取启动能力的调用者对象 |
startAbilityWithAccount(want: Want, accountId: number, callback: AsyncCallback<void>): void; startAbilityWithAccount(want: Want, accountId: number, options: StartOptions, callback: AsyncCallback<void>): void; startAbilityWithAccount(want: Want, accountId: number, options?: StartOptions): Promise<void>; | 启动Ability |
void startAbilityWithAccount(want: Want, accountId: number, callback: AsyncCallback) | 使用帐户启动新能力 |
void startAbilityWithAccount(want: Want, accountId: number, options: StartOptions, callback: AsyncCallback) | 带AccountId启动Ability。 |
void startAbilityForResult(want: Want, callback: AsyncCallback) | 带返回结果启动Ability。 |
void startAbilityForResult(want: Want, options: StartOptions, callback: AsyncCallback) | 带返回结果启动Ability。 |
void startAbilityForResultWithAccount(want: Want, accountId: number, callback: AsyncCallback) | 带返回结果及AccountId启动Ability。 |
void startAbilityForResultWithAccount(want: Want, accountId: number, options: StartOptions, callback: AsyncCallback) | 带返回结果及AccountId启动Ability。 |
void terminateSelf(callback: AsyncCallback) | 销毁当前的Page Ability。 |
void terminateSelfWithResult(parameter: AbilityResult, callback: AsyncCallback) | 带返回结果销毁当前的Page Ability。 |
参考文献
[1]OpenHarmony Ability开发.
更多推荐
所有评论(0)