2024年鸿蒙最全写给Android开发者的HarmonyOS入门指南(3),2024年最新步伐 ...

打印 上一主题 下一主题

主题 866|帖子 866|积分 2598

深知大多数步伐员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技能故步自封!



既有适合小白学习的零基础资料,也有适合3年以上履历的小同伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比力多,这里只是将部门目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲蹊径、讲解视频,并且后续会持续更新
需要这份系统化的资料的朋友,可以戳这里获取


  • 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 项目对应的关系:
AndroidHarmonyOSsettings.gradle.kts项目设置文件Demo/build-profile.json5项目设置文件,不同的是将应用的签名、SDK版本、多渠道设置移动到了这里build.gradle.kts模块设置文件Demo/AppScope/app.json5应用设置文件,设置包名、版本、图标、名称AndroidManifest.xml清单文件Demo/entry/src/main/module.json5模块设置文件,设置应用入口、路由等信息Application应用步伐入口AbilityStage应用步伐入口ActivityUI组件UIAbilityUI组件Navgation页面路由pages页面路由 生命周期

在 module.json5 中的 module 节点声明 srcEntry,我们也能和 Android 应用一样设置一个全局的应用步伐入口,拥有雷同的生命周期方法回调:
  1. import AbilityStage from '@ohos.app.ability.AbilityStage';
  2. export default class DemoAbilityStage extends AbilityStage {
  3.    
  4.     onCreate() {
  5.         // 应用启动回调
  6.     }
  7. }
复制代码
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 文本,更多组件可参考组件参考(基于ArkTS的声明式开发范式。
界面跳转

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. **深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
  26. ![](https://i-blog.csdnimg.cn/blog_migrate/1e210328c1ebf43f08d3b6c5f5c13b48.png)
  27. ![img](https://img-blog.csdnimg.cn/img_convert/e1688fd9be704965ef8b48bd54f45750.png)
  28. ![img](https://img-blog.csdnimg.cn/img_convert/8c8b470c4dec8fb69974946d2a030a88.png)
  29. **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**
  30. **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
  31. **[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**
  32. **深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
  33. ![](https://i-blog.csdnimg.cn/blog_migrate/1e210328c1ebf43f08d3b6c5f5c13b48.png)
  34. [外链图片转存中...(img-xkEiEKI7-1715730546509)]
  35. [外链图片转存中...(img-r0h2rgMg-1715730546509)]
  36. **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**
  37. **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
  38. **[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表