让我们从Hello World开始
DevEco Studio
Android 开发要使用 Android Studio 开发,HarmonyOS 也提供了一个 DevEco Studio 开发工具,同样是基于 IDEA 开发的,因此功能界面和 Android Studio 大致相同,很容易上手,并且可以从 Import Sample
菜单里选择官方提供的模板库,下载到本地运行。
工具下载地址:HUAWEI DevEco Studio和SDK下载和升级 | 华为开发者联盟
创建项目
点击欢迎界面的 Create Project
,创建新项目的流程也和 Android Studio 类似,这里的 Ability
UI组件类似 Android 中的 Activity
,用于提供UI显示及生命周期回调,这里我们简单的用默认模板创建一个 Demo 项目;
Bundle name
等同于 Android 中的 package name
,项目名、保存位置可以自选,其他配置保持默认就可以了,完成项目创建。
项目结构
待项目创建完成,你就能看到如下的项目目录结构,文件看上去很多,但是我们只需要关注重点部分;
PROJECT_FILE_TREE
Demo/build-profile.json5
项目配置文件,等同于 Android 项目中的settings.gradle.kts
:
{
“app”: {
“signingConfigs”: [], // 签名配置
“compileSdkVersion”: 9, // SDK 版本配置
“compatibleSdkVersion”: 9, // SDK 版本配置
“products”: [
{
“name”: “default”,
“signingConfig”: “default”,
}
]
},
“modules”: [ // 模块配置
{
“name”: “entry”, // 模块名
“srcPath”: “./entry”, // 模块路径
“targets”: [
{
“name”: “default”,
“applyToProducts”: [
“default”
]
}
]
}
]
}
Demo/AppScope
存放全局资源及配置的路径;Demo/AppScope/resources
应用全局资源路径;Demo/AppScope/app.json5
应用配置,定义包名、版本、应用图标、名称等配置:
{
“app”: {
“bundleName”: “com.sample.demo”, // 包名
“vendor”: “example”, // 供应商
“versionCode”: 1000000, // 版本号
“versionName”: “1.0.0”, // 版本名
“icon”: “
m
e
d
i
a
:
a
p
p
i
c
o
n
"
,
/
/
应用图标,此处配置影响应用管理中显示
"
l
a
b
e
l
"
:
"
media:app_icon", // 应用图标,此处配置影响应用管理中显示 "label": "
media:appicon",//应用图标,此处配置影响应用管理中显示"label":"string:app_name” // 应用名,此处配置影响应用管理中显示
}
}
使用的图标:
名称资源:
{
“string”: [
{
“name”: “app_name”,
“value”: “Demo”
}
]
}
在应用管理中显示:
Demo/entry
应用主模块,应用入口,存放代码、资源的路径;Demo/entry/src/main/module.json5
模块配置文件,类似 Android 项目中的AndroidManifest.xml
:
{
“module”: {
“name”: “entry”, // 当前module的名字,module打包成hap后,表示hap的名称,标签值采用字符串表示(最大长度31个字节),该名称在整个应用要唯一
“type”: “entry”, // 表示模块的类型,类型有三种,分别是entry、feature和har
“srcEntry”: “./ets/DemoAbilityStage.ts”, // 模块的入口文件路径,默认没有,需要手动创建,类似 Android 中的 Application
“description”: “
s
t
r
i
n
g
:
m
o
d
u
l
e
d
e
s
c
"
,
/
/
当前模块的描述信息
"
m
a
i
n
E
l
e
m
e
n
t
"
:
"
E
n
t
r
y
A
b
i
l
i
t
y
"
,
/
/
该标签标识
h
a
p
的入口
a
b
i
l
i
t
y
名称或者
e
x
t
e
n
s
i
o
n
名称。只有配置为
m
a
i
n
E
l
e
m
e
n
t
的
a
b
i
l
i
t
y
或者
e
x
t
e
n
s
i
o
n
才允许在服务中心露出
"
d
e
v
i
c
e
T
y
p
e
s
"
:
[
/
/
该标签标识
h
a
p
可以运行在哪类设备上
"
p
h
o
n
e
"
,
"
t
a
b
l
e
t
"
]
,
"
d
e
l
i
v
e
r
y
W
i
t
h
I
n
s
t
a
l
l
"
:
t
r
u
e
,
/
/
该模块是否随应用一起安装
"
i
n
s
t
a
l
l
a
t
i
o
n
F
r
e
e
"
:
f
a
l
s
e
,
/
/
释放支持免安装
"
p
a
g
e
s
"
:
"
string:module_desc", // 当前模块的描述信息 "mainElement": "EntryAbility", // 该标签标识hap的入口ability名称或者extension名称。只有配置为mainElement的ability或者extension才允许在服务中心露出 "deviceTypes": [ // 该标签标识hap可以运行在哪类设备上 "phone", "tablet" ], "deliveryWithInstall": true, // 该模块是否随应用一起安装 "installationFree": false, // 释放支持免安装 "pages": "
string:moduledesc",//当前模块的描述信息"mainElement":"EntryAbility",//该标签标识hap的入口ability名称或者extension名称。只有配置为mainElement的ability或者extension才允许在服务中心露出"deviceTypes":[//该标签标识hap可以运行在哪类设备上"phone","tablet"],"deliveryWithInstall":true,//该模块是否随应用一起安装"installationFree":false,//释放支持免安装"pages":"profile:main_pages”, // ability 中使用的 page 信息配置
“abilities”: [ // ability 配置列表,类似 Android 中的 Activity 列表
{
“name”: “EntryAbility”, // 逻辑名,整个应用要唯一
“srcEntry”: “./ets/entryability/EntryAbility.ts”, // 入口代码路径
“description”: “
s
t
r
i
n
g
:
E
n
t
r
y
A
b
i
l
i
t
y
d
e
s
c
"
,
/
/
描述信息
"
i
c
o
n
"
:
"
string:EntryAbility_desc", // 描述信息 "icon": "
string:EntryAbilitydesc",//描述信息"icon":"media:icon”, // 图标,如果为 MainElement,必填,此处配置影响应用列表显示及任务栈显示
“label”: “
s
t
r
i
n
g
:
E
n
t
r
y
A
b
i
l
i
t
y
l
a
b
e
l
"
,
/
/
标签名,此处配置影响应用列表显示及任务栈显示
"
s
t
a
r
t
W
i
n
d
o
w
I
c
o
n
"
:
"
string:EntryAbility_label", // 标签名,此处配置影响应用列表显示及任务栈显示 "startWindowIcon": "
string:EntryAbilitylabel",//标签名,此处配置影响应用列表显示及任务栈显示"startWindowIcon":"media:icon”, // 启动页图标
“startWindowBackground”: “$color:start_window_background”, // 启动页背景颜色
“exported”: true,
“skills”: [
{
“entities”: [
“entity.system.home”
],
“actions”: [
“action.system.home”
]
}
]
}
]
}
}
使用的图标:
名称资源:
{
“string”: [
{
“name”: “EntryAbility_label”,
“value”: “Ability1”
}
]
}
在桌面显示:
在任务栈显示:
如果有多个 UIAbility
,则配置了 skills
为 entity.system.home
的都会在桌面创建图标:
“skills”: [
{
“entities”: [
“entity.system.home”
],
“actions”: [
“action.system.home”
]
}
]
Demo/entry/src/main/ets
源码文件路径;Demo/entry/src/main/ets/entryability/EntryAbility.ts
UI 组件,类似 Android 中的Activity
;Demo/entry/src/main/resources
资源文件路径;
项目架构及与Android对比
从总体的项目架构来看,HarmonyOS 项目是比较贴近 Android 项目中 Compose + 单Activity 架构的,并且我们在 HarmonyOS 中也能找到一些与 Android 项目对应的关系:
Android | HarmonyOS | ||
---|---|---|---|
settings.gradle.kts | 项目配置文件 | Demo/build-profile.json5 | 项目配置文件,不同的是将应用的签名、SDK版本、多渠道配置移动到了这里 |
build.gradle.kts | 模块配置文件 | Demo/AppScope/app.json5 | 应用配置文件,配置包名、版本、图标、名称 |
AndroidManifest.xml | 清单文件 | Demo/entry/src/main/module.json5 | 模块配置文件,配置应用入口、路由等信息 |
Application | 应用程序入口 | AbilityStage | 应用程序入口 |
Activity | UI组件 | UIAbility | UI组件 |
Navgation | 页面路由 | pages | 页面路由 |
生命周期
在 module.json5
中的 module
节点声明 srcEntry
,我们也能和 Android 应用一样配置一个全局的应用程序入口,拥有类似的生命周期方法回调:
import AbilityStage from ‘@ohos.app.ability.AbilityStage’;
export default class DemoAbilityStage extends AbilityStage {
onCreate() {
// 应用启动回调
}
}
而 HarmonyOS 中的UI组件 UIAbility
也和 Android 中的 Activity
有着类似的生命周期:
import UIAbility from ‘@ohos.app.ability.UIAbility’;
import hilog from ‘@ohos.hilog’;
import window from ‘@ohos.window’;
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
// 组件创建
hilog.info(0x0000, ‘testTag’, ‘%{public}s’, ‘Ability onCreate’);
}
onDestroy() {
// 组件销毁
hilog.info(0x0000, ‘testTag’, ‘%{public}s’, ‘Ability onDestroy’);
}
onWindowStageCreate(windowStage: window.WindowStage) {
// window 创建
// Main window is created, set main page for this ability
hilog.info(0x0000, ‘testTag’, ‘%{public}s’, ‘Ability onWindowStageCreate’);
// 设置布局,显示 ets/pages/Index.ets 的布局
windowStage.loadContent(‘pages/Index’, (err, data) => {
if (err.code) {
hilog.error(0x0000, ‘testTag’, ‘Failed to load the content. Cause: %{public}s’, JSON.stringify(err) ?? ‘’);
return;
}
hilog.info(0x0000, ‘testTag’, ‘Succeeded in loading the content. Data: %{public}s’, JSON.stringify(data) ?? ‘’);
});
}
onWindowStageDestroy() {
// window 销毁
// Main window is destroyed, release UI related resources
hilog.info(0x0000, ‘testTag’, ‘%{public}s’, ‘Ability onWindowStageDestroy’);
}
onForeground() {
// 进入前台
// Ability has brought to foreground
hilog.info(0x0000, ‘testTag’, ‘%{public}s’, ‘Ability onForeground’);
}
onBackground() {
// 进入后台
// Ability has back to background
hilog.info(0x0000, ‘testTag’, ‘%{public}s’, ‘Ability onBackground’);
}
}
HarmonyOS 的 UIAbility
没有 Android 中 Activity
的 onResume
onPause
生命周期回调方法,当然如果需要的话还是有方案可以实现的,需要在 onWindowStageCreate
方法里,通过 windowStage
实现:
onWindowStageCreate(windowStage: window.WindowStage) {
windowStage.on(‘windowStageEvent’, (event) => {
// event 取值为枚举类型 window.WindowStageEventType
if(event === window.WindowStageEventType.ACTIVE) {
// 获取焦点
} else {
// 失去焦点
}
})
}
布局
HarmonyOS 使用 ArkTS 作为开发语言,并且提供 ArkTS UI 组件用于UI布局,就像上面 UIAbility
中显示的布局 ets/pages/Index.ets
:
@Entry // 声明这个组件可作为页面入口,即在 UIAbility 中加载或进行页面跳转
@Component // 声明这是一个UI组件
struct Index {
@State message: string = ‘Hello World’
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年HarmonyOS鸿蒙开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上HarmonyOS鸿蒙开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
siM-1712747185260)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上HarmonyOS鸿蒙开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)
[外链图片转存中…(img-k3mNKc1m-1712747185261)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!