鸿蒙实战:ArkTs 开发一个鸿蒙应用

学习过的 ArkTs 知识点,一步一步开发一个小的鸿蒙应用示例,涉及到  ArkTs 语法、注解 @Entry@Component@state、路由、生命周期、@Prop@Link 、常用组件的使用等等知识点。

要开发一个鸿蒙应用,首先我们需要知道 系统是如何找到页面的启动入口

鸿蒙如何启动应用

在 HarmonyOS 中,应用程序的启动入口 UIAbility,它继承自 Ability,所以我们需要声明一个 EntryAbilityEntryAbility 继承自 UIAbility。HarmonyOS 中的 Ability 类似于 Android 中的 Activity 是应用与用户交互的一个窗口。

我们需要在 module.json5 配置文件中指定 EntryAbility,系统就是靠这个配置来识别启动应用入口。

{  "module": {  ......  "pages": "$profile:main\_pages", // 通过profile下的资源文件配置  "abilities": \[  {  "name": "EntryAbility",  "srcEntry": "./ets/entryability/EntryAbility.ts",  "exported": true,  ......  }  \]  }  
}

配置文件中 pages 标签,在有 UIAbility 的场景下标签不能省略,用来声明路由跳转路径,如果想通过路由的方式,实现页面之间的跳转,需要在 pages 标签指向的文件 $profile:main_pages,添加页面的路径,否则无法跳转。

{  "src": \[  "pages/Index",  "pages/Second"  \]  
}

$profile:main_pages 指向的路径是文件夹 resources/base/profile 下面的配置文件 main_pages.json,其中文件名 (main_pages) 可自定义,和 pages 标签保持一致即可。

另外配置文件中还有一个 exported 标签,exported 标识当前 UIAbility 组件是否可以被其他应用调用。默认值为 false。

  • true :表示可以被其他应用调用

  • false :表示不可以被其他应用调用

如果这个 UIAbility 作为程序的启动入口,应该将 exported 设置为 true,否则启动时会报错。

error: failed to start ability.  
Error while Launching activity

如果这个 UIAbility 不可以被其他应用调用,也不作为程序的启动入口,那么 exported 应该设置为 false。避免带来安全问题。

当 HarmonyOS 应用启动时,系统首先会创建一个 EntryAbility 实例,实例创建完成之后,在进入 Foreground 之前,系统会创建一个 WindowStage 实例,每一个 Ability 实例,都对应一个 WindowStage 实例。

WindowStage 为本地窗口管理器,用于管理窗口相关的内容,例如与界面相关的获焦/失焦、可见/不可见。Ability 的生命周期和 WindowStage 回调对应的关系,如下图所示。

左图表示 UIAbility 的生命周期,每个生命周期分别做什么事,我会在下篇文章中分析,而右图表示 WindowStage 回调。

正如图中所示,在进入 Foreground 之前,系统会调用 onWindowStageCreate() 方法,在这方法中通过 loadContent() 方法设置启动时要加载的页面。

export default class EntryAbility extends UIAbility {  ......  onWindowStageCreate(windowStage: window.WindowStage): void {  windowStage.loadContent('pages/Index', (err, data) \=> {  if (err.code) {  // 页面加载失败处理  return;  }  // 页面加载成功  });  }  onWindowStageDestroy(): void {  // window 被销毁,释放 UI 资源  }  
}

我们在 loadContent() 方法中指定了要加载页面的路径 pages/Index 和一个回调函数,这样系统就会按照我们的配置寻找到要加载的页面。

当页面加载成功之后,接下来就是渲染 UI 了,那么 HarmonyOS 是如何渲染 UI。

如何渲染 UI

ArkTS 通过 struct 声明自定义组件名,使用 @Entry@Component 装饰的自定义组件作为页面的入口。

@Entry  
@Component  
struct Index {  ......  
}

而页面上的 UI 通过 build 方法进行构建,会在页面加载时首先进行渲染。

@Entry  
@Component  
struct Index {  build() {  Text("Hello World)  }  
}

build 方法主要用于构建和返回 UI 布局和组件,它的主要职责是构建应用的 UI,不允许执行业务逻辑或者其他非 UI 的操作。这是为了确保 UI 代码的清晰性和维护性,同时遵循了关注点分离(Separation of Concerns)的原则

这可能有人会有疑问,如果不在 build 方法写非 UI 逻辑,那么数据变化了,怎么更新 UI 呢,这就需要用到注解 @state,在 HarmonyOS 中注解有很多,其中 @state 至关重要。而且注解 @state 在实际开发中用的非常频繁。

注解 @state 主要用于刷新 UI, 当用注解  @state 标记的成员变量内容发生变化时,会自动重新渲染 UI。具体的表现如下图所示。

点击左图上的按钮,会获取数据, 当数据变化时,会自动刷新 UI,结果如右图所示。那么在代码中如何实现呢。

我们可以在代码中,声明一个用注解 @State 标记的成员变量 listItems

@State private listItems: Array<string\> \= \[\];

然后在 build 方法中遍历 listItems 渲染 UI。

 build() {  Column() {  ForEach(this.listItems, (item: string) \=> {  Column() {  Text(item)  }  })  }  }

最后我们在 Button 中绑定 onClick 事件,点击时更新 listItems 数据,当 listItems 数据发生变化时,会自动重新渲染 UI 调用 build 方法刷新布局。

 parseData() {  for (let i \= 0; i < 10; i++) {  this.listItems.push(\` item ${i}\`)  }  }  build() {  Column() {  Button("click me")  .onClick(() \=> {  this.parseData()  })  ForEach(this.listItems, (item: string) \=> {  Column() {  Text(item)  }  })  }  }

为了能让大家更好的学习鸿蒙 (OpenHarmony) 开发技术,这边特意整理了《鸿蒙 (OpenHarmony)开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙 (OpenHarmony)开发学习手册》

入门必看:https://qr21.cn/FV7h05

  1. 应用开发导读(ArkTS)
  2. ……

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门?:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. 构建第一个JS应用
  4. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

仪表板展示|DataEase看中国:历年研究生报考数据分析

背景介绍 在信息时代的浪潮中&#xff0c;研究生教育作为培养高层次专业人才的重要通道&#xff0c;不断吸引着广大毕业生和在职人士的关注。今天我们结合2018年&#xff5e;2024年的研究生报考数据&#xff0c;以数字为镜&#xff0c;深入了解近年来研究生培养态势。 本文将…

YOLOv8改进 | 进阶实战篇 | 利用辅助超推理算法SAHI推理让小目标无所谓遁形(支持视频和图片)

欢迎大家订阅我的专栏一起学习YOLO! 一、本文介绍 本文给大家带来的是进阶实战篇,利用辅助超推理算法SAHI进行推理,同时官方提供的版本中支持视频,我将其进行改造后不仅支持视频同时支持图片的推理方式,SAHI主要的推理场景是针对于小目标检测(检测物体较大的不适用,…

IP详细地理位置查询:技术原理与应用实践

IP地址是互联网上设备的唯一标识&#xff0c;在网络安全、个性化服务等领域具有重要意义。通过IP详细地理位置查询&#xff0c;可以获取到IP地址所在地的具体信息&#xff0c;为网络管理、定位服务等提供支持。IP数据云将深入探讨IP详细地理位置查询的技术原理、应用实践以及相…

Linux——进程替换

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、进程程序替换1、替换原理2、替换函数3、函数解释4、命名理解 二、用例测试1、execl测试2、…

【PX4-AutoPilot教程-TIPS】Gazebo仿真环境昏暗的解决办法即Ubuntu系统安装NVIDIA显卡驱动方法

Gazebo仿真环境昏暗的解决办法即Ubuntu系统安装NVIDIA显卡驱动方法 分析原因手动安装方法&#xff08;推荐&#xff09;自动安装方法检查是否安装成功Gazebo仿真环境前后对比 分析原因 具体原因为&#xff1a;大多数情况是因为显卡性能不足&#xff0c;Gazebo自动关闭了灯光和…

说一下JVM创建对象的流程?

一、类加载检查。 在实例化一个对象的时候&#xff0c;JVM 首先会去检查目标对象是否已经被加载并初始化了。如果没有&#xff0c;JVM 需要立刻去加载目标类&#xff0c;然后调用目标类的构造器完成初始化。然后初始化的过程&#xff0c;主要是对目标类里面的静态变量、成员变…

【CANoe示例分析】EthernetTC8Test

1、工程路径 C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 15.3.89\Ethernet\Test\EthernetTC8Test 在CANoe软件上也可以打开此工程:File|Help|Sample Configurations|Ethernet Testing|TC8Test(Ethernet) 2、示例目的 TC8示例是作者本人使用最多的CANo…

代码随想录day26--贪心基础

什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优 举个例子&#xff1a; 有一堆钞票&#xff0c;可以拿走十张&#xff0c;如果想要达到最大的金额&#xff0c;应该怎么拿&#xff1f; 指定每次拿最大的&#xff0c;最终结果就是拿走最大数额的…

MySQL安装、配置与卸载教程(Windows版)

MySQL是一个关系型数据库管理系统&#xff0c;目前为Oracle旗下产品&#xff0c;它具有开源、体积小、速度快的优点&#xff0c;许多网站使用的都是MySQL数据库。 简单而言&#xff0c;MySQL数据库核心功能就是用来存储数据的。 MySQL数据库分为社区版和商业版&#xff0c;这…

idea将文件加入到SVN

文件右键Subversion->Add to Vcs Settings->Version Control->Confirmation 勾上Add silently ,每次自动添加就不用一个个加了

计算机视觉学习指南(划分为20个大类)

计算机视觉的知识领域广泛而庞杂&#xff0c;涵盖了众多重要的方向和技术。为了更好地组织这些知识&#xff0c;我们需要遵循无交叉无重复&#xff08;Mutually Exclusive Collectively Exhaustive&#xff0c;MECE&#xff09;的原则&#xff0c;并采用循序渐进的方式进行分类…

ajax 如何从服务器上获取数据?

在Web开发中&#xff0c;AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种常用的技术&#xff0c;用于在不重新加载整个页面的情况下&#xff0c;从服务器获取数据并更新网页的某一部分。使用AJAX&#xff0c;你可以创建异步请求&#xff0c;从而提供更快的…

文件上传漏洞--Upload-labs--Pass02--Content-Type绕过

一、什么是 Content-Type 我们在上传文件时利用 Burpsuite 进行抓包&#xff0c;如下图所示&#xff1a; 上传文件后台的源代码可能会对 Content-Type 进行规定&#xff0c;设置白名单 或 黑名单&#xff0c;这时就要利用Content-Type绕过上传含有恶意代码的 php文件。 二、代…

大白话说说Docker容器默认网络模型工作原理

Docker的默认网络模型 —— 桥接模式&#xff08;Bridge&#xff09; 当你不做任何特殊设置时&#xff0c;Docker会使用一种叫做“桥接模式”的网络设置。这就像是给你的容器小房子安装了一个虚拟的桥接网络。这座桥连接着容器和你的电脑&#xff08;宿主机&#xff09;&#…

Spring Boot项目中TaskDecorator的应用实践

一、前言 TaskDecorator是一个执行回调方法的装饰器&#xff0c;主要应用于传递上下文&#xff0c;或者提供任务的监控/统计信息&#xff0c;可以用于处理子线程与主线程间数据传递的问题。 二、开发示例 1.自定义TaskDecorator import org.springframework.core.task.Task…

摄像设备+nginx+rtmp服务器

前言 由于html中的video现在不支持rtmp协议(需要重写播放器框架&#xff0c;flash被一刀切&#xff0c;360浏览器还在支持flash),遂用rtmp作为桥梁,实际是hls协议在html中起作用. 在此推荐一款前端播放器,.ckplayer 简直了,写点页面,一直循环&#xff0c;洗脑神曲 dream it po…

【rust】7、命令行程序实战:std::env、clap 库命令行解析、anyhow 错误库、indicatif 进度条库

文章目录 一、解析命令行参数1.1 简单参数1.2 数据类型解析-手动解析1.3 用 clap 库解析1.4 收尾 二、实现 grep 命令行2.1 读取文件&#xff0c;过滤关键字2.2 错误处理2.2.1 Result 类型2.2.2 UNwraping2.2.3 不需要 panic2.2.4 ? 问号符号2.2.5 提供错误上下文-自定义 Cust…

山海鲸可视化软件:多场景下的数据呈现利器

在当今数据驱动的时代&#xff0c;数据可视化成为了企业和个人不可或缺的工具。作为一个老数据人&#xff0c;本文想借用自己常用山海鲸可视化软件&#xff0c;带大家了解在不同使用场景下数据可视化的应用。山海鲸可视化是一款可以免费编辑、本地化部署的产品&#xff0c;对数…

小程序域名可以使用免费的SSL证书吗?

对于小程序域名而言&#xff0c;选择何种类型的SSL证书主要取决于小程序域名的具体情况。如果小程序域名是单独的域名&#xff0c;那么可以选择最为常见的免费单域名证书&#xff1b;如果小程序是公司主域名的子域名&#xff0c;则可以选择免费的通配符证书&#xff0c;一张证书…

facebook群控如何做?静态住宅ip代理在多账号运营重的作用

在进行Facebook群控时&#xff0c;ip地址的管理是非常重要的&#xff0c;因为Facebook通常会检测ip地址的使用情况&#xff0c;如果发现有异常的使用行为&#xff0c;比如从同一个ip地址频繁进行登录、发布内容或者在短时间内进行大量的活动等等&#xff0c;就会视为垃圾邮件或…