解决方案

手把手教你开发第一个HarmonyOS (鸿蒙)移动应用

seo靠我 2023-09-23 08:37:04

⼀、移动应⽤开发的介绍

移动应⽤开发:

AndroidIOSHarmonyOS (鸿蒙)

⼆、HarmonyOS介绍

文档概览-HarmonyOS应用开发官网

2.1 系统的定义

2.1.1 系统的定位

HarmoSEO靠我nyOS有三⼤特征:

搭载该操作系统的设备在系统层⾯融为⼀体、形成超级终端,让设备的硬件能⼒可以弹性 扩展,实现设备之间 硬件互助,资源共享。 对消费者⽽⾔,HarmonyOS能够将⽣活场景中的各类终端SEO靠我进⾏能⼒整合,实现不同终端 设备之间的快速连接、能⼒互助、资源共享,匹配合适的设备、提供流畅的全场景体验。⾯向开发者,实现⼀次开发,多端部署。 对应⽤开发者⽽⾔,HarmonyOS采⽤了多种分布式技术SEO靠我,使应⽤开发与不同终端设备的 形态差异⽆关,从⽽让开发者能够聚焦上层业务逻辑,更加便捷、⾼效地开发应⽤。⼀套操作系统可以满⾜不同能⼒的设备需求,实现统⼀OS,弹性部署。 对设备开发者⽽⾔,HarmonSEO靠我yOS采⽤了组件化的设计⽅案,可根据设备的资源能⼒和业 务特征灵活裁剪,满⾜不同形态终端设备对操作系统的要求。

2.1.2 系统架构

内核层:提供⼿机操作系统的基础能⼒。HarmonyOS采⽤多内核的系统SEO靠我设计,基于 Linux内核、LiteOS,使⽤了Linux的微内核(使⽤了Linux的最简功 能) Linux内核: ⼿机操作系统的内核LiteOS内核:智能硬件的内核系统服务层:HarmonyOS的SEO靠我核⼼能⼒集合,这些能⼒是有系统本身决定的,为我们应⽤ 开发提供了服务调⽤功能。系统服务层提供的能⼒是可以被我们开发的应⽤进⾏调⽤的。框架层:为HarmonyOS的应⽤开发提供了不同语⾔程序调⽤的接⼝

2SEO靠我.2 鸿蒙发展史

2.2.1 “鸿蒙”

盘古开天辟地——⼀⽚混沌(鸿蒙时代) ⽴志要在⼿机系统的国产化道路上开天辟地

2.2.2 发展史

2012年,华为开始规划智能操作系统“鸿蒙”2019年5⽉,华为申请“SEO靠我鸿蒙”商标2019年5⽉17⽇,发布鸿蒙系统2019年8⽉,鸿蒙正式版发布,实⾏开源2020年9⽉,鸿蒙2.0(beta)2021年6⽉2⽇晚上,华为线上发布HarmonyOS 2.0---⼿机

2.3SEO靠我 鸿蒙与安卓的区别

2.3.1 内核

安卓:基于Linux的内核设计,对Linux的依赖很⼤(也就是说Android操作系统⼤多数功能都 是依赖Linux)鸿蒙:采⽤了多内核设计,Linux内核+LiteSEO靠我OS内核,操作系统最⼩限度的依赖Linux内核

2.3.2 运⾏效率

安卓:应⽤的运⾏是基于虚拟机的 (Java---JDK编译器---字节码---虚拟机---操作系统)

鸿蒙:⽅⾈编译器 (Java---SEO靠我-⽅⾈编译器---机器码---操作系统)

据说, 鸿蒙系统运⾏效率相较于安卓提升了50%+

2.4 技术特性 与 系统安全

2.4.1 技术特性

硬件互助,资源共享⼀次开发,多端部署统⼀OS,弹性部署

2.4.SEO靠我2 系统安全

正确的⼈:⾼效安全的⽤户身份识别正确的设备:设备的识别正确的使⽤数据:数据的安全

三、第⼀个鸿蒙应⽤

3.1 开发准备

3.1.1 开发环境搭建(Java)

安装JDK、配置环境变量下载安装DevSEO靠我Eco Studio集成开发环境(基于Idea开发的专⻔⽤于鸿蒙应⽤开发的IDE)

下载地址

华为操作系统DevEco Studio和SDK下载与升级 | HarmonyOS开发者

安装

运行安装包点击NexSEO靠我t选择安装目录创建桌面快捷方式开始安装

运行DevEco Studio

第一次启动开发环境会下载鸿蒙开发所需要的SDK 双击桌⾯快捷⽅式,打开DevEco Studio开始使⽤选择SDK⽬SEO靠我录点击Next进⼊下⼀步选择Accept,点击Next开始下载SDK点击Finish完成下载,开始使⽤

3.1.2 注册华为帐号

注册_华为帐号 (huawei.com)

3.2 创建鸿蒙应⽤

3.3 鸿蒙应SEO靠我⽤⽬录结构

3.4 运⾏项⽬

3.4.1 启动鸿蒙模拟器

Tools—Device Manager在弹出的窗⼝装点击 Login 按钮,登录华为帐号启动⼀个模拟器

3.5 鸿蒙应⽤的启动流程

3.5.1 conSEO靠我fig.json

config.json 是鸿蒙应⽤的主配置⽂件

app 配置 :定义当前应⽤的唯⼀标识 bundleName应用的唯一标识(一般包名用公司名+应用名称)version 应⽤的版本moduSEO靠我le 配置: ⽤于声明当前应⽤的信息(包、主类、主界⾯、功能模块声明、适配设 备类型等等)

mainAbility声明当前应用启动时默认加载的Ability

deviceType声明当前应用适配的设备类型SEO靠我

abilities 声明当前应⽤中每个ability的配置信息

创建一个ability那么在config.json中会自动生成对应的ability的配置信息。

3.5.2 应⽤启动流程

启动鸿蒙应⽤加载coSEO靠我nfig.json⽂件,根据 mainAbility 配置加载启动应⽤的主界⾯

"mainAbility": "com.example.myapplication.demo01.MainAbility"SEO靠我

执⾏MainAbility的 onStart ⽅法

MainAbility是⼀个显示界⾯的容器,在onStart⽅法中通过调⽤ setMainRoute ⽅法来指 定当前界⾯容器中显示的视图界⾯

// aSEO靠我bility相当于一个容器(或者说是浏览器窗口), // 在容器里面通过填充一个视图slice(html中的body)来展示。 // MainAbilitySlice就SEO靠我是⼀个界⾯ super.setMainRoute(MainAbilitySlice.class.getName());

执⾏MainAbilitySlice中的 onStart 完成界⾯SEO靠我的渲染

slice是⼀个界⾯,界⾯中显示什么视图,就是通过onstart⽅法来加载渲染的

3.5.3 你好,世界哪里来的

$string : 表示引用的一sing,表示要去string文件中寻找键值对,如图SEO靠我寻找key为:mainability_HelloWorld 的值。

四、Ability框架

4.1 Ability介绍

Ability是应⽤所具备能⼒的抽象,也是应⽤程序的重要组成部分。⼀个应⽤可以具备多种SEO靠我能⼒

(即可以包含多个Ability),HarmonyOS⽀持应⽤以Ability为单位进⾏部署。

Ability可以分为 FA(Feature Ability) 和PA (Particle AbilitSEO靠我y) 两种类型,每种类型为

开发者提供了不同的模板,以便实现不同的业务功能。

FA⽀持Page Ability:

Page模板是FA唯⼀⽀持的模板,⽤于提供与⽤户交互的能⼒。⼀个Page实例可以包含⼀

组相关SEO靠我⻚⾯,每个⻚⾯⽤⼀个AbilitySlice实例表示。

​ 

PA⽀持Service Ability和Data Ability:

Service模板:⽤于提供后台运⾏任务的能⼒。Data模板:⽤于对外部提供统SEO靠我⼀的数据访问抽象。

4.2 PageAbility

4.2.1PageAbility简介

⼀个PageAbility相当于⼀个⻚⾯的容器(浏览器窗⼝),⼀个AbilitySlice相当于显示在容器

中的⼀个⻚SEO靠我⾯(HTML)

Page模板(以下简称“Page”)是FA唯⼀⽀持的模板,⽤于提供与⽤户交互的能⼒。⼀个Page可以由⼀个或多个AbilitySlice构成,AbilitySlice是指应⽤的单个⻚⾯及SEO靠我其控制逻辑的总和(相当于⼀个HTML⽂件)。在⼀个Abiliy种可以包含多个Slice

商品管理: ProductAbility(PageAbility):goods-list.html ProductSEO靠我ListSlicegoods-detail.html ProductDetailSlice

4.2.2 创建AbilitySlice

AbilitySlice创建slice包中

创建步骤:

创建⼀个类继承 oSEO靠我hos.aafwk.ability.AbilitySlice 类

public class MainAbilitySlice2 extends AbilitySlice {}

在 resources/baSEO靠我se/layout ⽬录下创建布局⽂件

<?xml version="1.0" encoding="utf-8"?> <DirectionalLayoutxmlns:ohos="httpSEO靠我://schemas.huawei.com/res/ohos"ohos:height="match_parent"ohos:width="match_parent"ohos:orientation="SEO靠我vertical"><Textohos:height="match_content"ohos:width="match_content"ohos:text="这是测试⽂本"ohos:text_coloSEO靠我r="#ff0000"ohos:text_size="40vp"></Text> </DirectionalLayout>

在创建的 AbilitySlice 类中重写 onStart SEO靠我⽅法,调⽤setUIContent⽅法加载布局⽂件

通过 ResourceTable 加载resouces⽬录下的资源

public class MainAbilitySlice2 extends AbiSEO靠我litySlice {@Overrideprotected void onStart(Intent intent) {super.onStart(intent);//定义slice视图组件(Java,SEO靠我XML)//setUIContent(int); 加载应⽤的 布局⽂件(xml) 作为当前slice的视图setUIContent(ResourceTable.Layout_ability_main_SEO靠我slice2);} }

4.2.3 PageAbility⽣命周期

⼀个Page中可以包含多个Slice,但是只能同时显示⼀个slice,如何设置PageAbility默认

显示的sliceSEO靠我

在⼀个Page Ability中提供了多个声明周期⽅法,这些⽅法在当前PageAbility加载的不同

阶段会⾃定调⽤

说明

INACTIVE状态是一种短暂存在的状态,可理解为“激活中”。

public cSEO靠我lass MainAbility extends Ability {/*** 当系统⾸次创建当前PageAbility实例时,⾃动调⽤onstart⽅法。也就是说对于⼀个Page⽽⾔,onStart⽅SEO靠我法只会执⾏⼀次*/public void onStart(Intent intent) {super.onStart(intent);super.setMainRoute(MainAbilitySliSEO靠我ce2.class.getName());System.out.println("--------------onStart");}/*** 当前Page进⼊active状态进⼊到⼿机前台获取焦点时,SEO靠我会触发onActive⽅法的执⾏*/protected void onActive() {super.onActive();System.out.println("--------------onAcSEO靠我tive");}/*** 当前PageAbility失去焦点(⻚⾯切⼊到后台、切换到其他Page),触发onInactive⽅法的执⾏*/protected void onInactive() {suSEO靠我per.onInactive();System.out.println("--------------onInactive");}/*** 当前PageAbility切换到后台,不可⻅时,触发onBaSEO靠我ckground执⾏*/protected void onBackground() {super.onBackground();System.out.println("--------------onSEO靠我Background");}/*** 当PageAbility从后台不可⻅状态(⻚⾯在后台、但是没销毁)切换到前台可⻅状态时触发 onForeground执⾏*/protected void onFoSEO靠我reground(Intent intent) {super.onForeground(intent);System.out.println("--------------onForeground")SEO靠我;}/*** 当前Page销毁时,触发onStop的执⾏*/protected void onStop() {super.onStop();System.out.println("----------SEO靠我----onStop");} }

4.2.4 Slice的两种渲染方式

Slice相当于一个网页,Slice中显示的视图是通过组件来声明的,Slice中的组件加载支持两种方式:

Java代码SEO靠我xml布局文件

onStart方法:在Slice实例创建时执行,用于载入当前Slice的视图组件,在onStart方法中通过调用setUIContext来加载视图组件

setUIContext方法提供了2SEO靠我个重载:

setUIContext(int):通过布局⽂件的ID,加载resources/base/layout⽬录下的布局⽂件

完成⻚⾯的渲染

setUIContext(ComponentContaineSEO靠我r) :通过加载⼀个使⽤Java代码创建的组件完成⻚⾯

的渲染

XML****⽅式渲染

创建布局⽂件:ability_main_slice2.xml

<?xml version="1.0" encoding=SEO靠我"utf-8"?> <DirectionalLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:height="matcSEO靠我h_parent"ohos:width="match_parent"ohos:orientation="vertical"><Textohos:height="match_content"ohos:wSEO靠我idth="match_content"ohos:text="这是测试文本"ohos:text_color="#ff0000"ohos:text_size="40vp"></Text></DirectSEO靠我ionalLayout>

在Slice的onStart⽅法中加载布局⽂件:

每创建一个布局文件(或者说每个资源都会创建一个ID)都会生成一个ID,所以布局文件调用的是setUIContext(int)方法SEO靠我

@Override protected void onStart(Intent intent) {super.onStart(intent);// 定义slice视图组件(java,xSEO靠我ml)// setUIContent(int); 加载应用的 布局文件(xml)作为当前slice的试图super.setUIContent(ResourceTable.Layout_ability_SEO靠我main_slice2); }

Java⽅式渲染

使⽤Java代码创建组件,渲染到slice中

public class MainAbilitySlice2 extends AbilitySSEO靠我lice {@Overrideprotected void onStart(Intent intent) {super.onStart(intent);// 定义slice视图组件(java,xml)SEO靠我// setUIContent(int); 加载应用的 布局文件(xml)作为当前slice的试图 // super.setUIContent(ResourceTable.LayoutSEO靠我_ability_main_slice2);// ComponentContainer(组件容器)DirectionalLayout directionalLayout = new DirectionSEO靠我alLayout(this);directionalLayout.setOrientation(Component.DRAG_VERTICAL);// Component(组件)Text text =SEO靠我 new Text(this);text.setText("Hello Boys");text.setHeight(40);text.setTextSize(40);// 将组件放到组件容器中direSEO靠我ctionalLayout.addComponent(text);// 将组件容器渲染到slice中setUIContent(directionalLayout);} }

4.2.5 ASEO靠我bilitySlice间导航

⼀个PageAbility可以包含多个Slice,同⼀时刻只能显示⼀个Slice,但是可以在不同的

Slice之间进⾏跳转——AbilitySlice间的导航

在MainAbiSEO靠我litySlice中添加按钮,并监听按钮的点击事件(略 参考4.3)

创建SecondAbilitySlice(略)

<?xml version="1.0" encoding="utf-8"?> SEO靠我 <DirectionalLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:height="match_parent"ohos:SEO靠我width="match_parent"ohos:orientation="vertical"><!-- 将图片文件存到resource/base/media目录 PS:文件的名字不要用数字开头,因为SEO靠我名字会作为变量名 --><Imageohos:height="match_content"ohos:width="match_parent"ohos:image_src="$media:cat"></SEO靠我Image></DirectionalLayout> public class SecondAbilitySlice extends AbilitySlice {@Overrideprotected SEO靠我void onStart(Intent intent) {super.onStart(intent);this.setUIContent(ResourceTable.Layout_ability_seSEO靠我cond);} }

在MainAbilitySlice中监听按钮的点击事件,导航到SecondAbilitySlice

public class MainAbilitySlice exteSEO靠我nds AbilitySlice {@Overridepublic void onStart(Intent intent) {super.onStart(intent);// 在当前slice中渲染试SEO靠我图组件有2中方式:// 1. 基于Java代码的渲染// 2. 基于xml标签渲染,例如: super.setUIContent(ResourceTable.Layout_ability_main);SEO靠我super.setUIContent(ResourceTable.Layout_ability_main);// 1. 获取id=btn1的按钮组件Button btn1 = (Button) thiSEO靠我s.findComponentById(ResourceTable.Id_btn1);// 2.设置按钮事件监听MainAbilitySlice _this = this;// a.创建事件监听器CoSEO靠我mponent.ClickedListener clickedListener = new Component.ClickedListener() {@Overridepublic void onClSEO靠我ick(Component component) {//挑转到SecondAbilitySlice// 从this指代的当前slice跳转到new的slice中_this.present(new SeSEO靠我condAbilitySlice(), new Intent());}};// b.设置组件的事件监听btn1.setClickedListener(clickedListener);}}

简化版本

puSEO靠我blic class MainAbilitySlice extends AbilitySlice {@Overridepublic void onStart(Intent intent) {superSEO靠我.onStart(intent);// 在当前slice中渲染试图组件有2中方式:// 1. 基于Java代码的渲染// 2. 基于xml标签渲染,例如: super.setUIContent(ResSEO靠我ourceTable.Layout_ability_main);super.setUIContent(ResourceTable.Layout_ability_main);// 1. 获取id=btnSEO靠我1的按钮组件Button btn1 = (Button) this.findComponentById(ResourceTable.Id_btn1);// //b.设置组件的事件监听 PS:简化成laSEO靠我mbda表达示// PS:简化成lambda表达式 因为listener要实现onclick方法 // btn1.setClickedListener(clickedListener-SEO靠我>{ // present(new SecondAbilitySlice(), new Intent() ); // });// b.设置组件的事件监听 因为只有一个方SEO靠我法,可以省略大括号btn1.setClickedListener(clickedListener -> present(new SecondAbilitySlice(), new Intent()))SEO靠我;}}

4.2.6 Slice之间的传值问题

使⽤Intent对象实现slice间的传值

MainAbilitySlice

public class MainAbilitySlice extends AbilSEO靠我itySlice {@Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResoSEO靠我urceTable.Layout_ability_main);// 1. 获取id=btn1的按钮组件Button btn1 = (Button) this.findComponentById(ResSEO靠我ourceTable.Id_btn1);// b.设置组件的事件监听 btn1.setClickedListener(clickedListener -> {// 在跳转之前的slice将需要传递的数SEO靠我据设置到Intent对象中Intent intent1 = new Intent();intent1.setParam("productId", "101");present(new SecondAbSEO靠我ilitySlice(), intent1);});} }

SecondAbilitySlice

public class SecondAbilitySlice extends AbiliSEO靠我tySlice {@Overrideprotected void onStart(Intent intent) {super.onStart(intent);this.setUIContent(ResSEO靠我ourceTable.Layout_ability_second);// 在跳转后的slice的onStart方法中,从intent对象中获取数据if (intent != null) {// 因为iSEO靠我ntent.getParam()返回的是IntentParams, 所以先获取IntentParams然后再获取值IntentParams params = intent.getParams();StSEO靠我ring productId = (String) params.getParam("productId");// 获取到id=text1的文本组件Text text = (Text) findComSEO靠我ponentById(ResourceTable.Id_text1);// 将获取到的商品ID设置到text文本组件text.setText(productId);}} }

4.3 组件SEO靠我的事件监听

4.3.1 在MainAbilitySlice布局文件添加按钮

<?xml version="1.0" encoding="utf-8"?> <DirectionalLayouSEO靠我txmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:height="match_parent"ohos:width="match_parent"oSEO靠我hos:alignment="center"ohos:orientation="vertical"><Imageohos:height="match_content"ohos:width="matchSEO靠我_content"ohos:image_src="$media:icon"></Image><Textohos:id="$+id:text_helloworld"ohos:height="match_SEO靠我content"ohos:width="match_content"ohos:background_element="$graphic:background_ability_main"ohos:laySEO靠我out_alignment="horizontal_center"ohos:text="$string:mainability_HelloWorld"ohos:text_size="40vp"/><BSEO靠我uttonohos:id="$+id:btn1"ohos:height="match_content"ohos:width="match_parent"ohos:padding="5vp"ohos:tSEO靠我ext="点我试试!"ohos:text_size="40vp"ohos:background_element="#a0b0c0"></Button></DirectionalLayout>

当我们在BSEO靠我utton使用$+id:btn1时,这个组件就会在ResourceTable中产生一个唯一标识

4.3.2 监听按钮的点击事件

在加载布局文件的Slice类中,获取按钮组件,设置点击事件的监听器

packaSEO靠我ge com.example.myapplicationdemo01.slice;import com.example.myapplicationdemo01.ResourceTable; SEO靠我 import ohos.aafwk.ability.AbilitySlice; import ohos.aafwk.content.Intent; import SEO靠我ohos.agp.components.Button; import ohos.agp.components.Component;public class MainAbilitySliSEO靠我ce extends AbilitySlice {@Overridepublic void onStart(Intent intent) {super.onStart(intent);// 在当前slSEO靠我ice中渲染试图组件有2中方式:// 1. 基于Java代码的渲染// 2. 基于xml标签渲染,例如: super.setUIContent(ResourceTable.Layout_abilitySEO靠我_main);super.setUIContent(ResourceTable.Layout_ability_main);// 1. 获取id=btn1的按钮组件Button btn = (ButtoSEO靠我n) this.findComponentById(ResourceTable.Id_btn1);// 2.设置按钮事件监听// a.创建事件监听器Component.ClickedListener SEO靠我clickedListener = new Component.ClickedListener(){@Overridepublic void onClick(Component component) SEO靠我{System.out.println("--------触发了点击事件");}};// b.设置组件的事件监听btn.setClickedListener(clickedListener);} SEO靠我 }

可以使用同一个监听器监听多个组件的事件,如果点击不同的组件执行的业务不同,则可以通过组件判断来执行不同的业务

// 1. 获取id=btn1的按钮组件 Button btnSEO靠我1 = (Button) this.findComponentById(ResourceTable.Id_btn1); Button btn2 = (Button) this.findSEO靠我ComponentById(ResourceTable.Id_btn2);// 2.设置按钮事件监听 // a.创建事件监听器 Component.ClickedLisSEO靠我tener clickedListener = new Component.ClickedListener(){@Overridepublic void onClick(Component compoSEO靠我nent) {// Component参数 表示监听的组件if (component == btn1) {System.out.println("--------aaa");} else if (coSEO靠我mponent == btn2) {System.out.println("~~~~~~~~bbb");}} }; // b.设置组件的事件监听 btnSEO靠我1.setClickedListener(clickedListener);// 输出aaa btn2.setClickedListener(clickedListener);// 输SEO靠我出bbb
“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2