文章目录
本文将讨论如下问题
- 鸿蒙应用的工程目录
- Ability 与 Slice
- 鸿蒙应用的运行逻辑
鸿蒙应用工程目录
.grade
:构建工程需要的文件,我们不关心.idea
:DevEco Studio需要的文件,我们不关心build
:将来编译的 .app 文件和 hap 文件存放在这里entry
:代码和布局文件都在这里,我们最关心的部分gradle
:构建工程需要的文件,我们不关心
entry文件夹
com.example.myapplication
:存放Ability文件slice
:存放slice文件resources
:存放布局文件、图片、音乐等多媒体资源config.json
:配置文件
Ability 与 slice
(官方文档:Ability 与 Slice)
Ability
在正式介绍鸿蒙应用运行逻辑之前,我们需要了解 Ability 和 Slice 的相关概念。官方对 Ability 的解释为 “ Ability是应用所具备能力的抽象,,也是应用程序的重要组成部分 ”。下面我们以 QQ 为例来感受一下 Ability 和 Slice:
- 在初次使用 QQ 时,软件会弹出 “ 注册 ” 界面,这表明 QQ 具有
注册
能力(Ability)
- 我们可以下载/上传 QQ 群中的文件,这表明 QQ 具有
存取数据
的能力(Ability)
Slice
通过上面的例子我们不难看出,不管多么复杂的应用,都是由各种 Ability 组合而成的。那什么是 Slice 呢? Ability 与 Slice 的关系又是什么?
Slice的中文含义为 “ 切片 ”,上面我们说到,QQ 具有 “ 注册 ” 能力,在整个注册过程中,我们将在各个界面之间跳转(填手机号码、身份验证、填写验证码、设置密码…),我们就把这里的每一个界面称之为 Slice。不难看出,Ability 与 Slice 的关系为:一个 Ability 是由若干个 Slice 组成的
。
Ability 的分类
在鸿蒙系统中,Ability分为两大类:
Feature Ability
:具有与用户交互的能力,至少有一个 Slice
Atomic Ability
:分为 Service 和 Data 两类,不具有与用户交互的能力,也就没有 Slice
怎样建立 Ability 与 Slice
- 鼠标左键选中
com.example.myapplication
- 鼠标右键 -> New -> Ability,选择想要创建的 Ability 类型,我们选择Empty Page Ability
- 在 Page Name 栏为你创建的 Ability 起个名字
-
注册 Ability,鸿蒙系统要求所有的 Ability 文件都要在
Config.json
中注册- 打开 Config.json 文件
2-7 打开 Config.json 文件
- 找到 abilities 部分
"abilities": [ { "skills": [ //begin { "entities": [ "entity.system.home" ], "actions": [ "action.system.home" ] } ], //end "orientation": "unspecified", "name": "com.example.myapplication.MainAbility", "icon": "$media:icon", "description": "$string:mainability_description", "label": "MyApplication", "type": "page", "launchType": "standard" }, { //把上面 begin ~ end 的内容复制到这里 "orientation": "unspecified", "name": "com.example.myapplication.MainAbility2", "icon": "$media:icon", "description": "$string:mainability2_description", "label": "entry", "type": "page", "launchType": "standard" } ]
- 修改 “actions” 内的内容,可以任取,只要不与其它 Ability 的重复即可
"abilities": [ { "skills": [ { "entities": [ "entity.system.home" ], "actions": [ "action.system.home" ] } ], "orientation": "unspecified", "name": "com.example.myapplication.MainAbility", "icon": "$media:icon", "description": "$string:mainability_description", "label": "MyApplication", "type": "page", "launchType": "standard" }, { "skills": [ { "entities": [ "entity.system.home" ], "actions": [ "action.new" //修改此处的 action ] } ], "orientation": "unspecified", "name": "com.example.myapplication.MainAbility2", "icon": "$media:icon", "description": "$string:mainability2_description", "label": "entry", "type": "page", "launchType": "standard" } ]
- 打开 Config.json 文件
-
我们发现,在 Slice 文件夹下多了一个 Slice 文件
- 此后,每当我们创建一个
Empty Page Ability
, 系统都会在 Slice 文件夹下为我们创建一个对应的 Slice文件,我们所有的代码都将放在 Ability 文件和 Slice 文件中。
鸿蒙应用运行逻辑
经过这么久的铺垫,现在我们来看一看鸿蒙应用究竟是怎样运行的。
我们说过,鸿蒙应用是由若干 Ability 组成的,那应用也应该从某一个 Ability 开始运行,这个 Ability 我们称之为 MainAbility
(注意,MainAbility 是由 Config.json 文件指定的,不一定是名为 MainAbility 的文件)。因为我们没有更改过 Config.json 中的MainAbility 配置,所以系统默认从 MainAbility 开始运行:
MainAbility “ 没有代码 ”,只有一个重写的函数 onStart(),这又是怎么回事呢?想理解这个问题,我们还需要了解一下 Ability 的生命周期。
鸿蒙应用运行流程
- 系统会自动调用 MainAbility 的 onStart() 方法,并通过 setMainRoute() 方法指定接下来启动的 Slice 文件(MainAbilitySlice)
- 系统调用 MainAbilitySlice 的 onStart() 方法,并通过 setUIContent() 指定 xml文件
- 系统读取 xml 文件,并转换成可视化界面
- 下期我们将讨论应用如何与用户进行交互