显示:
在任务栈显示:
如果有多个 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 项目对应的关系:
生命周期
在 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'
build() {
// 声明布局
Row() { // 横向布局
Column() { // 竖向布局
Text(this.message) // 文本控件
.fontSize(50)
.fontWeight(FontWeight.Bold)
}
.width('100%') // 宽度铺满
}
.height('100%') // 高度铺满
}
}
上面是新建项目默认生成的布局,效果是在屏幕中间显示 Hello World 文本。
界面跳转
Pages 跳转
HarmonyOS 生成的项目里,默认只有一个 UIAbility,并通过 windowStage.loadContent 来加载显示布局,因此一种多界面的方式就是编写不同的 Page,在不同的 Page 直接跳转;
首先,我们在 ets/pages 路径下新建一个 Second.ets 文件,并参照 Index.ets 声明布局,并添加按钮用于返回上一级:
import router from '@ohos.router'
@Entry
@Component
struct Second {
@State message: string = 'Second Page'
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
// 添加按钮
Button("点击返回")
.onClick(() => {
// 按钮点击通过 router 返回上一级
router.back()
})
}
.width('100%')
}
.height('100%')
}
}
然后,我们需要在 resources/base/profile/main_pages.json 文件中添加这个界面的声明:
{
"src": [
"pages/Index",
"pages/Second"
]
}
在之前的 Index.ets 布局中添加按钮并配置点击跳转逻辑:
import router from '@ohos.router'
@Entry
@Component
struct Index {
@State message: string = 'Hello World'
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
// 添加按钮
Button("点击跳转")
.onClick(() => {
// 按钮点击通过 router 跳转到 pages/Second
router.pushUrl({
url: "pages/Second"
})
})
}
.width('100%')
}
.height('100%')
}
}
这样通过点击按钮就能进行界面的跳转了。上面创建 Page 的方式推荐在 ets/pages 路径使用 New -> Page 进行创建,会自动生成对应的布局文件和配置,更便捷且不容易出错。
UIAbility 跳转
- 虽然 HarmonyOS 官方提供的模板里面都只有一个 UIAbility,但是它还是支持多 UIAbility 的;
- 同样的在 ets 路径下参照 EntryAbility.ts 创建一个新的 SecondEntryAbility.ts,在 onWindowStageCreate 中加载布局 pages/SecondAblity,在 module.json5 中添加对应的配置即可,这里还是推荐使用 New -> Ability 进行创建;
在 ets/pages/SecondAbility.ets 中修改文本及添加返回按钮:
import common from '@ohos.app.ability.common'
@Preview
@Entry
@Component
struct SecondAbility {
@State message: string = 'Second Ability'
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
Button("点击返回")
.margin({ top: 30 })
.onClick(() => {
// 按钮点击关闭当前 UIAbility
let context = getContext(this) as unknown as common.UIAbilityContext
context.terminateSelf()
})
}
.width('100%')
}
.height('100%')
}
}
然后我们修改 ets/pages/Index.ets 中的代码,在之前的按钮下方添加一个新的按钮点击跳转 SecondEntryAbility:
import common from '@ohos.app.ability.common'
import Want from '@ohos.app.ability.Want'
@Entry
@Component
struct Index {
@State message: string = 'Hello World'
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
Button("点击跳转")
.onClick(() => {
// 按钮点击跳转到 SecondEntryAbility
let context = getContext(this) as unknown as common.UIAbilityContext
let want: Want = {
deviceId: "",
bundleName: "com.sample.demo",
abilityName: "SecondEntryAbility",
}
context.startAbility(want)
})
// 添加按钮
Button("点击跳转Ability")
.onClick(() => {
// 按钮点击跳转到 SecondEntryAbility
let context = getContext(this) as unknown as common.UIAbilityContext
let want: Want = {
deviceId: "",
bundleName: "com.sample.demo",
abilityName: "SecondEntryAbility",
}
context.startAbility(want)
})
}
.width('100%')
}
.height('100%')
}
}
这里我们就要提到 UIAbility 和 Activity 的区别了,虽然他们同样都是UI组件,但是在 HarmonyOS 中,每打开一个 UIAbility,都会在任务栈中单独显示出来;
总结
一路看下来,相信你对 HarmonyOS 项目如何上手已经有了思路,作为 Android 开发者,我在写这篇文章的时候更多的是在寻找 HarmonyOS 和 Android 开发的相似之处,通过这样的对比,我们不需要从头了解 HarmonyOS 开发,就能更快的入手了。
最后,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(Harmony NEXT)资料用来跟着学习是非常有必要的。
这份鸿蒙(Harmony NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(**ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony****多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)**技术知识点。
希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!
如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料
获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料****
鸿蒙(Harmony NEXT)最新学习路线
- HarmonOS基础技能
- HarmonOS就业必备技能
- HarmonOS多媒体技术
- 鸿蒙NaPi组件进阶
- HarmonOS高级技能
- 初识HarmonOS内核
- 实战就业级设备开发
有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。
获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料
《鸿蒙 (OpenHarmony)开发入门教学视频》
《鸿蒙生态应用开发V2.0白皮书》
《鸿蒙 (OpenHarmony)开发基础到实战手册》
OpenHarmony北向、南向开发环境搭建
《鸿蒙开发基础》
- ArkTS语言
- 安装DevEco Studio
- 运用你的第一个ArkTS应用
- ArkUI声明式UI开发
- .……
《鸿蒙开发进阶》
- Stage模型入门
- 网络管理
- 数据管理
- 电话服务
- 分布式应用开发
- 通知与窗口管理
- 多媒体技术
- 安全技能
- 任务管理
- WebGL
- 国际化开发
- 应用测试
- DFX面向未来设计
- 鸿蒙系统移植和裁剪定制
- ……
《鸿蒙进阶实战》
- ArkTS实践
- UIAbility应用
- 网络案例
- ……
获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料
总结
总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。