积分582 / 贡献0

提问0答案被采纳0文章52

[经验分享] OpenHarmony应用开发模型详解 原创

Laval社区小助手 显示全部楼层 发表于 2024-3-6 14:27:31

开发环境

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这两种模型在工程目录结构,配置文件以及在应用上下文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开发. https://gitee.com/openharmony/docs/tree/master/zh-cn/application-dev/ability

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部