积分584 / 贡献0

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

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

Laval社区小助手 显示全部楼层 发表于 2024-6-6 16:26:36

开发环境

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

Logo欢迎加入LAVAL社区

社区规范:仅讨论OpenHarmony相关问题。

已加入社区

本内容已收录至专栏 《学堂》查看更多专栏内容

205篇内容

OpenHarmony应用构建工具Hvigor的构建流程

前言 OpenHarmony 应用和服务使用 Hvigor 作为工程的构建工具。 上一篇文章 hvigor的基本用法 介绍了 Hvigor 的基本用法和配置。本篇文章将介绍 Hvigor 的构建流程,通过修改脚本配置使 Hvigor 执行自定义任务。 Hvigor 的构建流程 加载命令行参数和环境变量; 初始化项目结构,创建 Project 和 Module 实例; 配置项目插件和任务流;

1091

小~Q · 2023-06-08 14:15:54

OpenHarmony应用权限管理

基本概念 默认情况下,应用只能访问有限的系统资源。但某些情况下,应用为了扩展功能的诉求,需要访问额外的系统或其他应用的数据(包括用户个人数据)、功能。系统或应用也必须以明确的方式对外提供接口来共享其数据或功能。OpenHarmony提供了一种访问控制机制来保证这些数据或功能不会被不当或恶意使用,即应用权限。 应用权限保护的对象可以分为数据和功能: 数据包含了个人数据(如照片、通讯录、日历、位

140

4

小~Q · 2023-06-08 15:19:38

更多推荐

2023-2024年度OpenHarmony Mvp From Laval社区2023-2024年度OpenHarmony Mvp From Laval社区avatarLaval社区

OpenHarmony开机动画流程一丶环境 源码版本:OpenHarmony 4.1 Release 板子型号:RK3568(dayu200) 二丶开机动画启动流程 在了解开机动画流程,我们先熟悉一下OpenHarmony的启动流程,简单的定义一下,分为四个阶段,如下图所示: Stage-BootloadeavatarLaval社区

声望值规则声望值&成长等级avatarLaval社区

  • 浏览量78
  • 点赞
  • 收藏
  • 19

所有评论(19)

发表

BlueDoorZ1

1

回复

2023-11-07

BlueDoorZ1

1

回复

2023-11-06

BlueDoorZ1

1

回复

2023-11-05

BlueDoorZ1

1

回复

2023-11-05

BlueDoorZ1

1

回复

2023-11-04

BlueDoorZ1

1

回复

2023-11-04

BlueDoorZ1

1

回复

2023-11-03

BlueDoorZ1

1

回复

2023-11-03

BlueDoorZ1

1

回复

2023-11-02

BlueDoorZ1

1

回复

2023-11-02

查看更多评论

### 小~Q

@weixin_39441050

私信

已为社区贡献46条内容

玩转Laval社区

玩转小瓦AI答声望值规则发文和提问

活动日历查看更多

直播时间 2024-05-25 14:00:00

回放中设备开发分论坛-OpenHarmony开发者大会2024Laval社区小助手

直播时间 2024-05-25 09:00:00

回放中主论坛 - OpenHarmony开发者大会2024Laval社区小助手

直播时间 2024-05-25 15:52:00

回放中应用框架分论坛-OpenHarmony开发者大会2024深圳城市开发者社区小助理

直播时间 2024-05-25 15:35:00

回放中高性能应用开发-OpenHarmony开发者大会2024imsodiffcult

直播时间 2024-05-25 15:30:00

回放中分布式应用开发-OpenHarmony 开发者大会2024阿萌啊

运营活动

社区排行榜

昨日

上周

上个月

1

自衬。

总声望值:28 增长声望值:18

2

sclwork

总声望值:13 增长声望值:3

3

Kx_Kevin

总声望值:19 增长声望值:3

4

huanghl365

总声望值:4 增长声望值:3

5

T.Dowin

总声望值:12 增长声望值:3

6

瀰漫

总声望值:10 增长声望值:3

7

weixin_50679737

总声望值:9 增长声望值:3

8

昊昊850

总声望值:1 增长声望值:1

9

huangyehui

总声望值:1 增长声望值:1

10

fourany

总声望值:1 增长声望值:1

11

Brooke.xu

总声望值:1 增长声望值:1

12

ljs_coding

总声望值:1 增长声望值:1

13

fighter_water

总声望值:1 增长声望值:1

14

li123508

总声望值:1 增长声望值:1

15

dfghijok1223

总声望值:1 增长声望值:1

16

弯弯月牙儿

总声望值:1 增长声望值:1

17

笨笨择一向上向善

总声望值:1 增长声望值:1

18

盘古遗族

总声望值:1 增长声望值:1

19

hahahha11233

总声望值:1 增长声望值:1

20

whwshiyuan

总声望值:1 增长声望值:1

21

Fox...

总声望值:1 增长声望值:1

22

sanguoxue

总声望值:1 增长声望值:1

23

qq_36167470

总声望值:1 增长声望值:1

24

zzy_Gorden

总声望值:1 增长声望值:1

25

m0_68398282

总声望值:1 增长声望值:1

26

lp5921

总声望值:1 增长声望值:1

27

lezhiliu

总声望值:1 增长声望值:1

28

oy_2002

总声望值:1 增长声望值:1

29

qq_37775646

总声望值:1 增长声望值:1

30

weixin_41709386

总声望值:1 增长声望值:1

31

a怀念那青春

总声望值:1 增长声望值:1

32

BG.????

总声望值:1 增长声望值:1

33

qq_40555632

总声望值:1 增长声望值:1

34

qq_39041188

总声望值:1 增长声望值:1

35

鹏在天

总声望值:1 增长声望值:1

36

qq_35218385

总声望值:1 增长声望值:1

37

h454036111

总声望值:1 增长声望值:1

38

weixin_40685444

总声望值:1 增长声望值:1

39

weixin_40010764

总声望值:1 增长声望值:1

40

Super_zh

总声望值:1 增长声望值:1

41

weixin_57555866

总声望值:1 增长声望值:1

42

虚情假意先生

总声望值:1 增长声望值:1

43

buptwei

总声望值:1 增长声望值:1

44

时间就是金钱,效率就是生命。

总声望值:1 增长声望值:1

45

qq_37002753

总声望值:1 增长声望值:1

46

白丨非白丨即白

总声望值:1 增长声望值:1

47

qq_35804427

总声望值:1 增长声望值:1

48

liusiyun123321

总声望值:1 增长声望值:1

49

LABRYANT24

总声望值:1 增长声望值:1

50

卷到不能卷_Man

总声望值:1 增长声望值:1

51

aptxwang

总声望值:1 增长声望值:1

52

m0_66664806

总声望值:1 增长声望值:1

53

weixin_40717927

总声望值:1 增长声望值:1

54

qq_21709259

总声望值:1 增长声望值:1

55

哦豁,码giao

总声望值:1 增长声望值:1

目录

无用

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

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

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

返回顶部