当前位置:   article > 正文

献给Android开发者的HarmoneyOS入门指南_harmoney开发者

harmoney开发者

前言   

自2023华为开发者大会之后,HarmonyOS 后续版本将不再支持Android应用的说法愈演愈烈,虽然网络上有很多相关的新闻,但大多都是基于 HarmoneyOS NEXT 开发者预览版不支持 Android应用安装做的推测,目前未见华为官方正式发布说明。

也有人说目前的鸿蒙开发工具 DevEco Studio 里面都没有集成 Android SDK,但这也只能说明原生的鸿蒙应用无法安装在 Android 系统上,这个说法尚未定论。

但是 HarmonyOS 的发展是必然的,作为移动端的从业人员,自然不能停滞不前,今天我们就来走进 HarmoneyOS 的世界。

准备及注意   

这篇文章是面向 Android开发者的,因此一些基本的东西我就不再赘述,相关文档可以在华为开发者联盟查看。

  • 以下内容都是基于已经搭建好 HarmonyOS 开发环境(DevEco Studio、HarmoneyOS SDK)

  • DevEco Studio应用签名是和华为账号绑定的,所以开始前需要注册一个华为账号(首次运行失败会有提示)

  • 运行 HarmoneyOS 项目需要一部鸿蒙系统的手机(目前仅Mate 50、60系列手机能正常使用,其它机型需要使用投屏工具进行操作,直接在手机上操作会卡死)

从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,项目名、保存位置可以自选,其他配置保持默认就可以了,完成项目创建。

图片

项目结构

待项目创建完成,你就能看到如下的项目目录结构,文件看上去很多,但是我们只需要关注重点部分。

图片

Demo/build-profile.json5 项目配置文件,等同于 Android 项目中的 settings.gradle.kts:

  1. {
  2. "app": {
  3. "signingConfigs": [], // 签名配置
  4. "compileSdkVersion": 9, // SDK 版本配置
  5. "compatibleSdkVersion": 9, // SDK 版本配置
  6. "products": [
  7. {
  8. "name": "default",
  9. "signingConfig": "default",
  10. }
  11. ]
  12. },
  13. "modules": [ // 模块配置
  14. {
  15. "name": "entry", // 模块名
  16. "srcPath": "./entry", // 模块路径
  17. "targets": [
  18. {
  19. "name": "default",
  20. "applyToProducts": [
  21. "default"
  22. ]
  23. }
  24. ]
  25. }
  26. ]
  27. }
  • Demo/AppScope 存放全局资源及配置的路径;

  • Demo/AppScope/resources 应用全局资源路径;

  • Demo/AppScope/app.json5 应用配置,定义包名、版本、应用图标、名称等配置:

  1. {
  2. "app": {
  3. "bundleName": "com.sample.demo", // 包名
  4. "vendor": "example", // 供应商
  5. "versionCode": 1000000, // 版本号
  6. "versionName": "1.0.0", // 版本名
  7. "icon": "$media:app_icon", // 应用图标,此处配置影响应用管理中显示
  8. "label": "$string:app_name" // 应用名,此处配置影响应用管理中显示
  9. }
  10. }

使用的图标

图片

名称资源

  1. {
  2. "string": [
  3. {
  4. "name": "app_name",
  5. "value": "Demo"
  6. }
  7. ]
  8. }

在应用管理中显示

图片

  • Demo/entry 应用主模块,应用入口,存放代码、资源的路径;

  • Demo/entry/src/main/module.json5 模块配置文件,类似 Android 项目中的 AndroidManifest.xml:

  1. {
  2. "module": {
  3. "name": "entry", // 当前module的名字,module打包成hap后,表示hap的名称,标签值采用字符串表示(最大长度31个字节),该名称在整个应用要唯一
  4. "type": "entry", // 表示模块的类型,类型有三种,分别是entry、feature和har
  5. "srcEntry": "./ets/DemoAbilityStage.ts", // 模块的入口文件路径,默认没有,需要手动创建,类似 Android 中的 Application
  6. "description": "$string:module_desc", // 当前模块的描述信息
  7. "mainElement": "EntryAbility", // 该标签标识hap的入口ability名称或者extension名称。只有配置为mainElement的ability或者extension才允许在服务中心露出
  8. "deviceTypes": [ // 该标签标识hap可以运行在哪类设备上
  9. "phone",
  10. "tablet"
  11. ],
  12. "deliveryWithInstall": true, // 该模块是否随应用一起安装
  13. "installationFree": false, // 释放支持免安装
  14. "pages": "$profile:main_pages", // ability 中使用的 page 信息配置
  15. "abilities": [ // ability 配置列表,类似 Android 中的 Activity 列表
  16. {
  17. "name": "EntryAbility", // 逻辑名,整个应用要唯一
  18. "srcEntry": "./ets/entryability/EntryAbility.ts", // 入口代码路径
  19. "description": "$string:EntryAbility_desc", // 描述信息
  20. "icon": "$media:icon", // 图标,如果为 MainElement,必填,此处配置影响应用列表显示及任务栈显示
  21. "label": "$string:EntryAbility_label", // 标签名,此处配置影响应用列表显示及任务栈显示
  22. "startWindowIcon": "$media:icon", // 启动页图标
  23. "startWindowBackground": "$color:start_window_background", // 启动页背景颜色
  24. "exported": true,
  25. "skills": [
  26. {
  27. "entities": [
  28. "entity.system.home"
  29. ],
  30. "actions": [
  31. "action.system.home"
  32. ]
  33. }
  34. ]
  35. }
  36. ]
  37. }
  38. }

使用的图标:

图片

名称资源:

  1. {
  2. "string": [
  3. {
  4. "name": "EntryAbility_label",
  5. "value": "Ability1"
  6. }
  7. ]
  8. }

显示:

图片

在任务栈显示:

图片

如果有多个 UIAbility,则配置了 skills 为 entity.system.home 的都会在桌面创建图标:

  1. "skills": [
  2. {
  3. "entities": [
  4. "entity.system.home"
  5. ],
  6. "actions": [
  7. "action.system.home"
  8. ]
  9. }
  10. ]
  • 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 应用一样配置一个全局的应用程序入口,拥有类似的生命周期方法回调:

  1. import AbilityStage from '@ohos.app.ability.AbilityStage';
  2. export default class DemoAbilityStage extends AbilityStage {
  3. onCreate() {
  4. // 应用启动回调
  5. }
  6. }

而 HarmonyOS 中的UI组件 UIAbility 也和 Android 中的 Activity 有着类似的生命周期:

  1. import UIAbility from '@ohos.app.ability.UIAbility';
  2. import hilog from '@ohos.hilog';
  3. import window from '@ohos.window';
  4. export default class EntryAbility extends UIAbility {
  5. onCreate(want, launchParam) {
  6. // 组件创建
  7. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  8. }
  9. onDestroy() {
  10. // 组件销毁
  11. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  12. }
  13. onWindowStageCreate(windowStage: window.WindowStage) {
  14. // window 创建
  15. // Main window is created, set main page for this ability
  16. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
  17. // 设置布局,显示 ets/pages/Index.ets 的布局
  18. windowStage.loadContent('pages/Index', (err, data) => {
  19. if (err.code) {
  20. hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
  21. return;
  22. }
  23. hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
  24. });
  25. }
  26. onWindowStageDestroy() {
  27. // window 销毁
  28. // Main window is destroyed, release UI related resources
  29. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  30. }
  31. onForeground() {
  32. // 进入前台
  33. // Ability has brought to foreground
  34. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  35. }
  36. onBackground() {
  37. // 进入后台
  38. // Ability has back to background
  39. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  40. }
  41. }

HarmonyOS 的 UIAbility 没有 Android 中 Activity 的 onResume onPause 生命周期回调方法,当然如果需要的话还是有方案可以实现的,需要在 onWindowStageCreate 方法里,通过 windowStage 实现:

  1. onWindowStageCreate(windowStage: window.WindowStage) {
  2. windowStage.on('windowStageEvent', (event) => {
  3. // event 取值为枚举类型 window.WindowStageEventType
  4. if(event === window.WindowStageEventType.ACTIVE) {
  5. // 获取焦点
  6. } else {
  7. // 失去焦点
  8. }
  9. })
  10. }

布局

HarmonyOS 使用 ArkTS 作为开发语言,并且提供 ArkTS UI 组件用于UI布局,就像上面 UIAbility 中显示的布局 ets/pages/Index.ets:

  1. @Entry // 声明这个组件可作为页面入口,即在 UIAbility 中加载或进行页面跳转
  2. @Component // 声明这是一个UI组件
  3. struct Index {
  4. @State message: string = 'Hello World'
  5. build() {
  6. // 声明布局
  7. Row() { // 横向布局
  8. Column() { // 竖向布局
  9. Text(this.message) // 文本控件
  10. .fontSize(50)
  11. .fontWeight(FontWeight.Bold)
  12. }
  13. .width('100%') // 宽度铺满
  14. }
  15. .height('100%') // 高度铺满
  16. }
  17. }

图片

上面是新建项目默认生成的布局,效果是在屏幕中间显示 Hello World 文本。

界面跳转
Pages 跳转

HarmonyOS 生成的项目里,默认只有一个 UIAbility,并通过 windowStage.loadContent 来加载显示布局,因此一种多界面的方式就是编写不同的 Page,在不同的 Page 直接跳转;

首先,我们在 ets/pages 路径下新建一个 Second.ets 文件,并参照 Index.ets 声明布局,并添加按钮用于返回上一级:

  1. import router from '@ohos.router'
  2. @Entry
  3. @Component
  4. struct Second {
  5. @State message: string = 'Second Page'
  6. build() {
  7. Row() {
  8. Column() {
  9. Text(this.message)
  10. .fontSize(50)
  11. .fontWeight(FontWeight.Bold)
  12. // 添加按钮
  13. Button("点击返回")
  14. .onClick(() => {
  15. // 按钮点击通过 router 返回上一级
  16. router.back()
  17. })
  18. }
  19. .width('100%')
  20. }
  21. .height('100%')
  22. }
  23. }

然后,我们需要在 resources/base/profile/main_pages.json 文件中添加这个界面的声明:

  1. {
  2. "src": [
  3. "pages/Index",
  4. "pages/Second"
  5. ]
  6. }

在之前的 Index.ets 布局中添加按钮并配置点击跳转逻辑:

  1. import router from '@ohos.router'
  2. @Entry
  3. @Component
  4. struct Index {
  5. @State message: string = 'Hello World'
  6. build() {
  7. Row() {
  8. Column() {
  9. Text(this.message)
  10. .fontSize(50)
  11. .fontWeight(FontWeight.Bold)
  12. // 添加按钮
  13. Button("点击跳转")
  14. .onClick(() => {
  15. // 按钮点击通过 router 跳转到 pages/Second
  16. router.pushUrl({
  17. url: "pages/Second"
  18. })
  19. })
  20. }
  21. .width('100%')
  22. }
  23. .height('100%')
  24. }
  25. }

这样通过点击按钮就能进行界面的跳转了。上面创建 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 中修改文本及添加返回按钮:

  1. import common from '@ohos.app.ability.common'
  2. @Preview
  3. @Entry
  4. @Component
  5. struct SecondAbility {
  6. @State message: string = 'Second Ability'
  7. build() {
  8. Row() {
  9. Column() {
  10. Text(this.message)
  11. .fontSize(50)
  12. .fontWeight(FontWeight.Bold)
  13. Button("点击返回")
  14. .margin({ top: 30 })
  15. .onClick(() => {
  16. // 按钮点击关闭当前 UIAbility
  17. let context = getContext(this) as unknown as common.UIAbilityContext
  18. context.terminateSelf()
  19. })
  20. }
  21. .width('100%')
  22. }
  23. .height('100%')
  24. }
  25. }

然后我们修改 ets/pages/Index.ets 中的代码,在之前的按钮下方添加一个新的按钮点击跳转 SecondEntryAbility:

  1. import common from '@ohos.app.ability.common'
  2. import Want from '@ohos.app.ability.Want'
  3. @Entry
  4. @Component
  5. struct Index {
  6. @State message: string = 'Hello World'
  7. build() {
  8. Row() {
  9. Column() {
  10. Text(this.message)
  11. .fontSize(50)
  12. .fontWeight(FontWeight.Bold)
  13. Button("点击跳转")
  14. .onClick(() => {
  15. // 按钮点击跳转到 SecondEntryAbility
  16. let context = getContext(this) as unknown as common.UIAbilityContext
  17. let want: Want = {
  18. deviceId: "",
  19. bundleName: "com.sample.demo",
  20. abilityName: "SecondEntryAbility",
  21. }
  22. context.startAbility(want)
  23. })
  24. // 添加按钮
  25. Button("点击跳转Ability")
  26. .onClick(() => {
  27. // 按钮点击跳转到 SecondEntryAbility
  28. let context = getContext(this) as unknown as common.UIAbilityContext
  29. let want: Want = {
  30. deviceId: "",
  31. bundleName: "com.sample.demo",
  32. abilityName: "SecondEntryAbility",
  33. }
  34. context.startAbility(want)
  35. })
  36. }
  37. .width('100%')
  38. }
  39. .height('100%')
  40. }
  41. }

这里我们就要提到 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学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号