基于鸿蒙系统的刷题app开发

您所在的位置:网站首页 鸿蒙系统基于什么开发的软件 基于鸿蒙系统的刷题app开发

基于鸿蒙系统的刷题app开发

2023-06-17 10:44| 来源: 网络整理| 查看: 265

目        录

1  前言... 1

1.1  课题背景... 1

1.2  鸿蒙技术特性... 2

1.3  鸿蒙与安卓的区别... 3

2  鸿蒙应用开发概述... 3

2.1  鸿蒙应用开发类别... 3

2.2  鸿蒙应用基本组成... 3

2.3  开发环境:HUAWEI DevEco Studio 3.1. 7

2.4  开发框架... 7

2.4.1  Java UI框架... 8

2.4.2  方舟开发框架... 9

2.5  远程模拟调试与真机调试... 10

3  华为鸿蒙应用端的设计... 14

3.1  华为鸿蒙应用功能设计... 14

3.2  UI界面的实现... 17

3.3  应用核心方法... 19

3.3.1  题库与答案的导入... 19

3.3.2  AbilitySlice跳转... 20

3.3.3  弹窗框的设计... 21

3.4  本地应用功能的实现... 23

3.4.1  题库中的题目和选项文本的显示的实现... 23

3.4.2  上一题和下一题的题目在一个页面的内容切换的实现... 24

3.4.3  用户选择的选项的答案进行判断... 24

3.4.4  初始创建题库和答案文件... 25

3.4.5  整体功能的逻辑的实现... 25

4  总结与展望... 26

参考文献... 27

1  前言 1.1  课题背景

我国拥有最大的智能手机市场,也是全世界最大的智能手机生产国,然而,移动终端设备(智能手机、平板电脑等)的操作系统(Operating System,OS)却长时间为谷歌的安卓系统、苹果的IOS系统所垄断(陶善才,2021)。近年国际局势复杂多变,一些西方国家开始对我国科技企业进行打压、制裁。华为由于其先进的5G技术及芯片研发而成为重点打击对象:2019年,美国开始陆续限制华为的芯片制造、终端操作系统的使用。以华为作为代表的国内企业急需在软硬件上实现自主,冲破封锁(Ruipeng Gao etal,2021)。

2019年8月推出了鸿蒙系统(HarmonyOS),已进入公众的视野有2年多了。宏观看,鸿蒙系统的面世,是一次在高端技术上打破相关国家对我国的制约,打破了国产操作系统弱势局面(毛烁,2021)。对于华为来说,鸿蒙诞生的意义并不仅仅是打破国外操作系统“卡脖子”,代替其他操作系统这么简单。华为终端BG CEO余承东表示:鸿蒙的“自我要求”是打破设备之间的墙——它可以同时支持大屏、可穿戴、车机、音箱、手表、手机以及PC等多元设备,并称其为“下一代操作系统”——面向物联网时代的系统(石夏德,2020)。

2021年6月,华为推出了HarmonyOS 2.0 (鸿蒙2.0),并将OpenHarmony(鸿蒙系统基础能力)完全捐赠予原子开源基金会,宣告了鸿蒙正式进入大规模的应用阶段,硬件厂商和开发者可调用OpenHarmony的部分或所有能力进行硬件产品系统的开发,如家居、手表、手机等设备的系统。

2022年11月4号,华为开发者大会 HDC2022 上,华为推出了Harmonyos 3.1版本。此版本主推ArkTS开发语言,ArkTS API 的数量也将达到了一万多,其中主要的API能力包括声明式UI能力以及全新的Stage模型。Harmonyos 3.1版本中的声明式UI能力新增了:1、声明式2D/3D绘制能力 2、布局能力提升 3、组件能力提升 4、多设备交互事件归一。Stage模型的重点特性有1、重新定义应用运行规则,根本上解决后台抢占资源问题 2、逻辑与 UI解耦,应用异常恢复与应用跨设备迁移逻辑归一 3、多设备应用模型归一,更利于应用一次开发多端部署。除以上关键特性外,本次 HarmonyOS 3.1还将在安全基础能力、网络管理、包管理、测试框架、文件管理等都有不同程度的更新或增强(IT之家,2022)。

作为新一代面向物联网的操作系统,它具有许多独特优势,其改进的跨平台功能、支持多场景应用、可以在各种设备和平台上使用、可以满足消费者对低延迟和强安全性需求的特点,使其具有广阔的应用前景(李艳,2019)。然而,应用生态是当下鸿蒙最大的阻碍:目前华为手机端鸿蒙OS仍然需要接入AOSP(Android Open Source Project,安卓开放源代码项目)来对现有的安卓应用进行兼容运行以应对应用生态与用户体验问题,这一做法的原因在于当下原生鸿蒙应用数量较少,应用生态亟需完善,特别是需要更多体现鸿蒙系统特点的具有实用性与特色的应用。因此开发能体现上述特点的鸿蒙应用,对于完善鸿蒙生态、扩大鸿蒙系统影响力有着重要意义。

1.2  鸿蒙技术特性

(1) 硬件互助,资源共享

鸿蒙技术支持多种设备之间的硬件互助、资源共享,其中的核心技术包括分布式软总线、分布式数据管理、分布式任务调度、分布式设备虚拟化等。

a.分布式软件总线:多种终端设备(手机、平板、智能穿戴、智慧屏、车机等)分布式设通信基座,分布式数据管理和分布式任务调度的基础,为设备之间的互联互通提供了统一的分布式通信能力,为设备之间的无感发现和零等待传输创造了条件。

b.分布式数据管理:基于分布式软总线的能力,实现应用程序数据和用户数据的分布式管理。用户数据不再与单一物理设备绑定,多个设备的应用数据实现同步管理业务逻辑与数据存储分离。

c.分布式任务调度:基干分布式软总线、分布式数据管理等技术特性,构建统一的分布式任务管理,实现多设备间的能力互助,例如跨设备的远程启动、控制、任务迁移等功能。

d.分布式设备虚拟化:实现不同设备的硬件资源整合、设备管理、设备处理,以一个终端为核心,可以让用户的业务在不同的设备上流转,充分发挥不同设备的硬件优势。

(2)一次开发,多端部署

鸿蒙为各种设备提供了统一的集成开发环境、API及固定的框架(程序框架、Ability框架以及UI框架),UI框架支持使用多种不同(ArkTS、JS、Java)语言进行开发,可以在多种不同设备上显示不同的UI效果,支持软件应用开发过程中多终端的业务逻辑和界面逻辑进行复用,能够实现一次开发、多端部署,提升开发效率。

(3)统一OS,弹性部署

对鸿蒙开发者而言,一套操作系统可以满足多种设备需求。鸿蒙系统采用了通过组件化和小型化的设计方案,支持多种终端设备按需弹性部署,可以根据硬件的形态和需求,选择所需要的组件,还可以根据设备的硬件资源能力和业务特征,选择配置组件的功能集,还可以通过编译链关系去自动生成组件化的依赖关系,满足不同形态终端设备对操作系统的要求(华为,2023)。

以上这些技术特性造就了鸿蒙作为物联网系统与安卓、IOS等传统操作系统的区别,即多设备作为一个整体为用户提供比单设备更加高效、沉浸的体验(刘小芬,2021)。本设计也运用了鸿蒙的这些特性来进行开发,以展现鸿蒙应用的亮点。

1.3  鸿蒙与安卓的区别

鸿蒙操作系统是基于linux的微内核设计,而安卓系统是基于linux的宏内核设计的。微内核仅包括了操作系统必要的功能模块,其中的任务管理、内存分配具有最高权限,其他模块不具有最高权限;而宏内核包括了操作系统绝大多数的功能和模块,而且这些功能和模块都具有最高的权限。其中的缺陷就是只要一个模块出错,整个系统就会崩溃,这也就是安卓系统容易崩溃的原因,而鸿蒙系统的其他模块出现问题,对于整个系统的运行是没有阻碍的。

安卓应用的运行是基于虚拟机的,这是因为它不能与系统底层直接进行通信活动,

而鸿蒙的新研发的方舟编译器编译出来的软件都可以直接与系统底层进行通信,所以鸿蒙系统加编译器将取代虚拟机。所以安卓的运行过程是java---DK编译器---字节码---虚拟机---操作系统,而鸿蒙的运行过程是java----方舟编译器---机器码---操作系统,这样就提高了鸿蒙系统运行效率。

2  鸿蒙应用开发概述 2.1  鸿蒙应用开发类别

正如当前鸿蒙系统(HarmonyOS)分为开源的OpenHarmony以及华为终端基于此开发的鸿蒙操作系统,现如今针对鸿蒙的应用开发也分为2种:一种是华为鸿蒙应用开发,应用于华为鸿蒙系统的手机、平板等具备完整鸿蒙能力的终端上;另一种是OpenHarmony应用开发,应用于基于轻量级鸿蒙(部分鸿蒙能力系统,即LiteOS)的嵌入式设备,如运动手表、智能家居等。对于具有完整鸿蒙能力的开发,一次开发的软件可以自动适应在不同的设备上运行,这只需在开发环境中配置选择好运行的设备类型即可。

2.2  鸿蒙应用基本组成

鸿蒙应用的软件包是以APP Pack形式发布的,它主要由一个或多个HAP与描述每个HAP属性的pack.info(应用包信息)组成。HAP又可以分为主模块(entry)和功能模块(feature)两种,一个鸿蒙软件包里必须有且只有一个entry,feature可有一个或多个,也可不包含。只有包含Ability的HAP才可以独立运行,一个HAP里面由Ability、库文件、资源文件、配置文件组成(陈美汝等,2021)。鸿蒙应用软件包内各结构如图1所示。

图1  鸿蒙应用软件包结构

(1)Ability

Ability即能力,也是鸿蒙应用程序的重要组成部分。一个应用可以具备多种能力(即可以包含多个Ability,鸿蒙支持应用以Ability为单位进行部署。Ability以分为FA(Feature Ability) 和PA (Particle Ability) 两种类型,其中FA具有UI界面,支持Page Ability(页面展示能力),Page Ability是FA唯一支持的模板,是给用户提供交互能力的;而PA无UI界面,支持Service Ability(服务能力,提供后台运行任务的能力)和Data Ability(数据库能力,提供统一的数据访问对象)。在在配置文件(config.son)中注册Ability时,可以通过配置Ability元素中的“type”属性来指定Ability模板类型,“type”的取值可以为“page”、“service”或“data”,分别代表Page Ability、Service Ability、Data Ability(华为,2023)。

一个Page Ability可以由一个或多个AbilitySlice构成,AbilitySlice是指应用的单个页面及其控制逻辑的总和,一个Page Ability相当于一个页面的容器(浏览器窗口),一个Abilityslice相当于显示在容器中的一个页面。Page Ability的生命周期的不同状态转换及其对应的回调如图2所示。

 

图2  Page Ability的生命周期

AbilitySlice间导航分为两种,一种是当AbilitySlice和导航目标的AbilitySlice处于一个Page Ability时,可以用 present方法实现导航。另外一种是不同AbilitySlice间导航,可以通过配置Intent的Action导航到目标AbilitySlice。PageAbility间的导航可以使用startAbilitv或startAbilityForResult方法,获得返回结果的回调为onAbilityResult。在Ability中调用setResult可以设置返回结果。本此应用设计种就运用了不同Page Ability间的导航,实现点击按钮进行页面之间的跳转。

(2)库文件(libs)、资源文件(resources)

库文件libs存放了应用所需要的外部API接口,是应用依赖的第三方代码,实现调用一些封装好的对象。

资源文件resources中存放应用的资源文件(字符串,图片,音频等)。resources目录包括三类目,一类为base目录与限定词目录,二类为语言目录,第三类为rawfile目录。本次应用开发的resources目录如图3所示。

 

图3  应用开发的resources目录

其中最主要的是layout,graphic和media三个文件,layout主要用来存放布局资源的,有关界面UI的设计的资源都是存放于此,采用xml文件格式;graphic主要用来存放可绘制资源,比如本此应用开发的有关按钮的透明背景设计,弹窗的属性设计资源都是存放在此;media主要存放媒体资源,比如图片,音频视频等非文本格式都是存放在次文件,本次设计的3个页面背景图片就是放在此处进行调用。

(3)配置文件(config.json)

DevEco Studio 3.1为HarmonyOS提供了两种编辑“config.json”文件的方式,一种是代码编辑视图,另一种是可视化编辑视图。“config.json”由“app”、“deviceConfig”和“module”三个部分,缺一不可。

app对象包含应用的全局配置信息,“app”部分是一致的,包含了bundleName(应用包名)、version(版本号)等信息;deviceConfig包含在具体设备上的应用配置信息,可以包含default、phone、tablet、tv、car、wearable、liteWearable和smartVision等属性。default标签内的配置是适用于所有设备通用,其他设备类型如果有特殊的需求,则需要在该设备类型的标签下进行配置。“module”包含HAP包的配置信息,包含每个Ability必须定义的基本属性(如包名、类名、类型以及Ability提供的能力),以及应用访问系统或其他应用受保护部分所需的权限等。

2.3  开发环境:HUAWEI DevEco Studio 3.1

鸿蒙开发所使用的IDE是华为的DevEco Studio 3.1,他是基于IntellIJ IDEA Community开源版本打造,面向全场景多设备,提供一站式的分布式应用开发平台,支持分布式多端开发、分布式多端调测、多端模拟仿真,全方位的质量与安全保障。

作为一款开发工具,除了具有基本的代码开发、编译构建及调测等功能外,DevEco Studio 3.1还具有如下特点:DevEco Studio 3.1为鸿蒙开发者提供了高效智能的代码编辑,支持的开发语言包括Java、C/C++、JS(JavaScript)、ETS(Extended TypeScript)等,还支持使用XML(Extensible Markup Language,可扩展标记语言)、HML(HarmonyOS Markup Language,鸿蒙系统标记语言)和CSS(Cascading Style Sheets,层叠样式表)进行页面布局。DevEco Studio 3.1还支持低代码可视化开发,它具有丰富的UI界面编辑能力,支持自由拖拽组件和可视化数据绑定,可快速预览效果,所见即所得,同时也支持卡片的零代码开发,降低开发门槛和提升界面开发效率。同时还支持多设备统一开发环境、多语言代码的开发调试、FA(Feature Ability,特性能力)和PA(Particle Ability,原子能力)快速开发、分布式多端应用开发、多设备模拟器、界面布局预览等功能。

HUAWEI DevEco Studio3.1的主界面如图4所示。

2.4  开发框架

鸿蒙的开发框架主要分为两种,一种是支持Java UI开发框架,另外一种是支持Ark UI(方舟)开发框架。对于两类鸿蒙应用开发,华为鸿蒙应用开发可选择Java UI或Ark UI框架进行开发。本设计的华为鸿蒙端应用采用基于Java的开发方式:Java UI框架,其开发方式与安卓开发较为类似:用Java编写Ability内容、自定义类等,但与安卓支持多种架构开发页面不同,鸿蒙当前只支持使用XML架构对页面布局进行开发。

 

图4  HUAWEI DevEco Studio 3.1的主界面

2.4.1  Java UI框架

Java UI框架提供了一部分Component和ComponentContainer的具体子类,就是为开发则创建用户界面提供各种组件,用户可以通过组件进行交互操作,以此获得响应。                      Java UI由布局(Layout)与组件(Component)组成,布局定义组件的摆放方式           (比如:DirectionalLayout线性布局和DependentLayout相对布局),DependentLayout指定组件根据同级元素或者父组件的位置进行布局,DirectionalLayout用于定义一组组件按固定方式排布(水平或垂直)。组件是用户界面的元素,常用的组件有Text(文本)、Button(按钮)、Image(图片)、TextField(文本输入框)、ScrollView(滚动界面),组件根据一定的层次结构进行组合就形成了布局。

鸿蒙提供了Ability和AbilitySlice两个基础类,AbilitySlice是鸿蒙的一个类,是Page Ability中用于显示的部分,一个Ability可包含多个AbilitySlice。AbilitySlice主要用于承载单个页面的具体逻辑实现和界面UI,AbilitySlice通过setUIContent为界面设置布局。

在Java UI框架中,提供了两种编写布局的方式。一种是在java代码中创建布局: 用代码创建Component和ComponentContainer对象,为这些对象设置布局参数和属性值,并将Component添加到ComponentContainer中,从而创建出完整界面。另外一种是在XML中声明UI布局: 按层级结构来描述Component和ComponentContainer的关系,给组件节点设定布局参数和属性值,可直接生成布局。

在XML中声明的布局中,在加载完成后同样可在代码中对该布局进行修改。在AbilitySlice中控制布局或组件,首先需要在AbilitySlice类对象中的onStart(intent)方法里通过super.setUIContent(“xml”)方法绑定需要的XML文件。鸿蒙所有资源都会在ResourceTable中进行注册,需要调用对应的XML可在ResourceTable中寻找。

例如将Layout目录中的“Layout_ability_main.xml”文件作为AbilitySlice类对象MainAbilitySlice的显示XML文件:

super.setUIContent(ResourceTable.Layout_ability_main);

布局与组件的使用也需要在AbilitySlice类对象中创建布局或组件对象,再与XML中定义的组件进行绑定。但布局与组件在XML中都需设定id(详见附录A),才能在ResourceTable中寻找。绑定方法为findComponentById(component_id)。

例如将id为start的按钮组件绑定到start对象:

Button start=(Button) findComponentById(ResourceTable.Id_start);

2.4.2  方舟开发框架

Ark UI(方舟)开发框架,是一套构建鸿蒙应用界面的开发框架。它支持eTS、纯JS,JS和Java混合语言开发。它拥有两种不同的开发规范,一种是基于ArkTS的声明式开发规范(声明式开发规范),另外一种是兼容JS的类Wed开发规范(类Web开发规范)。

(1)基于ArkTS的声明式开发规范,采用接近自然语义的编程方式,可以更加直观清晰地描述UI界面,它主要从三个维度(组件。动效,状态管理)来提供UI能力,而且还封装了丰富地系统能力接口,开发者可以通过系统能力地简单调用,实现从UI设计到系统能力调用的开发。

(2)兼容JS的类Wed开发规范,采用的HML、CSS、JavaScript三段式开发方式,HML标签文件进行布局搭建,CSS文件进行样式描述,JavaScript文件进行逻辑处理。

HML:HarmonyOS Markup Language,鸿蒙系统标记语言,类HTML文件,兼容大部分的HTML标签,用于定义界面中具有哪些组件,以及组件的在布局上的关系,也可以定义组件的一些参数来对组件在显示上进行控制。

CSS:Cascading Style Sheets,层叠样式表,是用于描述HML页面样式的语言。HML中的所有组件均存在系统默认样式,在CSS文件中可对这些组件进行进一步的属性编辑

JS:JavaScript,面向Web(万维网)的解释型编程语言,在此用于编写业务逻辑关系、各类事件等。

这种开发方式,主要更加适应Web前端开发者的开发习惯,主要适用与界面较为简单的应用开发。

2.5  远程模拟调试与真机调试

(1)远程模拟调试

DevEco Studio 3.1提供了远程模拟调试,其具体流程分为:调试代码类型,设置HAP安装方式,启用调试。具体流程如图5所示。

 

图5  模拟器设备调试流程图

第一步需要调试代码类型。工程调试类型默认为Detect Automatically,我们需要调试Java代码类型,在Debugger界面,选择相应模块,设置Debug type即可,如图6所示。

 

图6  模拟器的Debugger界面的调试代码

第二步需要设置HAP安装方式。在调试阶段,HAP在远程模拟机上的安装方式有2种。一种是是默认的安装方式,另外一种是采用覆盖安装方式。需要在DevEco Studio 3.1中进入Edit Configurations页面,对其指定模块的HAP安装方式,勾选“Keep Application Data”,这表示运用第二种覆盖安装的方式,保留应用/服务缓存数据,如图7所示。

 

图7  模拟器的Edit Configurations页面的设置HAP安装方式

第三步直接启用调试。需要在DevEco Studio 3.1登录华为开发者账号,然后点击“Device Manager”会打开设备选择界面,里面提供多种类型设备可供选择:手机、平板、智慧屏、智能穿戴设备等。并单击Debug或Attach Debugger to Process启动调试,就可以在远程模拟机上看到应用下载在模拟机上了,就可以对其进行对应功能的调试,如图8所示。

(2)真机调试

开发者也可使用鸿蒙系统的手机、平板、手表等真机设备进行调试,真机设备分为远程真机和本地物理真机,其调试流程完全相同,而这需要为应用进行签名,其具体流程如图9所示。

 

图8  远程模拟调试

 

图9  真机设备调试流程

第一步需要配置签名信息。首先需要连接真机设备,可在设备通过USB连接电脑,在手机中打开“开发者模式”使其处于“您正处于开发者模式”即可,打开“USB调试”开关,允许USB调试;然后在DevEco Studio 3.1中进入Singning Config页面,勾选

“Autonmatically generate signature”即可完成签名,如图10所示。

 

图10  Project Structure配置签名

第二步需要调试代码类型。工程调试类型默认为Detect Automatically,因为此应用是基于Java语言开发的,所以我们需要调试Java代码类型,在Debugger界面,选择相应模块,设置Debug type即可,如图11所示。

 

图11  真机调试的Debugger界面调试代码类型

第三步需要设置HAP安装方式。在调试阶段,HAP在手机等真机设备上的安装方式有2种。一种是是默认的安装方式,它是先卸载应用,再重新安装,这种方式会清除设备上的所有应用缓存数据。另外一种是采用覆盖安装方式,它不会卸载应用,这种方式会保留应用的缓存数据。在DevEco Studio 3.1中进入Edit Configurations页面,对其指定模块的HAP安装方式,勾选“Keep Application Data”,这表示运用第二种覆盖安装的方式,保留应用/服务缓存数据,如图12所示。

 

图12 真机的Edit Configurations页面的设置HAP安装方式

最后一步就是直接启用调试。直接在在工具栏中,选择USB连接的手机,并单击Debug或Attach Debugger to Process启动调试,就可以在手机上看到应用下载在手机上了,就可以对其进行对应功能的调试,如图13所示。

3  华为鸿蒙应用端的设计与实现 3.1  华为鸿蒙应用功能设计

可自我录入式刷题应用端采用Java UI框架的方式进行设计,旨在实现用户可以进行自我导入所需要的题库和答案,其应用本身也写入了两套不同的题库,可以对其进行切换训练,当答对题目时会有弹窗提示选项正确,当答错题目时会有弹窗提示选项错误,而且还有题目收集功能,收集对应的正确的题号和错误的题号,还有练习的总结,计算其练习的正确率,方便后续的刷题。

 

图13  真机的启用调试页面

主界面主要是由三个按钮模块组成,一个是题目的导入功能,一个是答案的导入功能,最后一个是开始做题/继续做题功能,其中题目的导入功能和答案的导入功能其原理基本一致。

点击“导入题库”按钮,会跳出文件管理的打开方式,点击进入对应的文件进行选择文件,用户可以打开自己所需的题库文本文件进行题库的导入,导入成功后会跳出“导入成功”的提示弹窗。“导入答案”按钮的功能与之类时,如图14所示。

点击“开始做题/继续做题”按钮,会跳转到题目页面,导入的题库和答案就会随着对应的方法显示在此页面上,用户就是在此页面上对题目进行练习,当用户选择选项时,会对其选项进行颜色提示,表示用户选择的答案是此选项,选项正确时会有提示弹窗提示显示“回答正确”,选项错误时会有提示弹窗提示显示“回答错误”,而点击“下一题”按钮时会出现下一题的题目,点击“上一题”按钮时会出现上一题的题目(其中第一题时点击“上一题”按钮时不会出现下一题的题目),当练习到最后一题时,“下一题”会变成“结束练习”按钮,点击“结束练习”时会跳到练习总结页面。如图15,图16所示。

 

图14  点击导入题库后的流程

 

图15  做题页面及其选项的判断提示框显示

 

图16  最后一题的做题页面和总结页面

到了练习总结页面,可以看到之前进行练习时的题目正确率,下边有三个按钮,分别是“做题收集”,“重复练习”,“返回首页”。点击“做题收集”会跳出一个弹窗显示之前所做的哪些题目是正确的,哪些题目是错误的,方便用户后续的训练和总结;点击“重复练习”会跳转到之前的做题页面,用户就可以重新开始做题提高刷题正确率;点击“返回首页”按钮就会跳转到之前的首页页面,用户可以在此页面进行重新导入不同题库进行刷题练习。

3.2  UI界面的实现

(1)主界面UI

主页面显示了背景,三个不同功能的按钮模块。页面整体使用DependentLayout与DirectionalLayout组合,实现了最终的排列。其背景是利用media组件构成,而三个不同的功能按钮模块是利用Button组件构成。而按钮是采用胶囊型按钮设计,更加圆润美观,按钮的背景设置为半透明的白色,可以观测到后面的部分背景图案而不显的唐突,提高用户视觉体验,如图17所示。

以上界面组成在XML的具体代码详见附录A,其中背景图片统一都放在media文件里,而按钮的透明背景设置则用代码设计放在graphic文件中的background_anniu_element.xml里面,后续的按钮透明背景都可以引用。组件代码中也完成了组件对象对于事件的绑定(详见附录B)。

 

图17  主界面UI

(2)做题页面UI

做题显示主要还是采用了DependentLayout与DirectionalLayout组合进行布局,展示了背景,“返回首页”按钮,题号与总题号的文本,题目文本,4个选项按钮以及“上一题”和“下一题”按钮。具体页面UI见图15。

此页面的整体设计看着现对简单,但是此页面的功能实现却是整个应用设计中最复杂的,其中的核心关键点就是题目文本和四个选项按钮中的选项答案可以随着“上一题”和“下一题”的按钮的点击进行变化,可以只要一个页面就可以完成多个页面的问题进行显示。本页面的一个创新点就是四个选项按钮的名称设置为了选项的答案文本,只需要用getText方法进行文本,获取然后用setText方法赋予按钮文本内容,这样就是可以实现答案问题的显示,然后开始设置时的按钮背景是透明的,当用户点击按钮后,选项按钮的背景变色提示,表示用户是选择此选项的,就基本完成此部分的UI设计,如图18所示。

 

图18  选项按钮的背景变化和判断提示弹窗框

(3)总结页面UI

此页面的设计的布局DirectionalLayout的方式实现组件有序排列。由一个标题文本和总结正确率文本以及三个按钮组成,三个按钮分别是“做题收集”,“重复练习”,“返回首页”,可以根据其按钮文本简单知道其功能,其中主要是“做题收集”的题目收集方式的设计,点击后会触发其按钮的事件监听,就会利用CommonDialog(一种在弹出框消失之前,用户无法操作其他界面内容的对话框)显示之前的正确题目和错误题目的题号和答案。具体页面UI见图16。

3.3  应用核心方法 3.3.1  题库与答案的导入

此鸿蒙应用的关键点,就是可以实现用户根据自身需求自由的导入所需要训练的题库和答案,而此功能主要有三大部分组成。第一部分是要获得手机二点访问文件许可有关的权限;第二部分就是选择目录下的文本文件进行读取操作;第三部分就是根据做题页面的有关布局进行逐题读取题目与选项并且显示在做题页面上。完成以上操作就完成了题库和答案的导入。

鸿蒙应用要获得手机文件的相关权限,鸿蒙应用开发的权限有两种,一种是非敏感权限,存放在config.json的敏感数据,在用户安装应用时自动授予,这种权限的授权方式为系统授权 (system grant);第二种是敏感权限,该权限需要应用通过发送弹窗的方式请求用户授权,这种权限的授权方式为用户授权(user_gront),本次手机文件有关的读取写入操作就需要设置第二种敏感权——用户授权。

一般情况下,首先需要配置config.json文件,要在module下添加“name”、“reason”、“usedScene”三个权限申请字段,然后编写权限弹窗框的触发代码,最后需要编写requestPermissionsFromUser的回调。但是在一些简单的应用开发时,我们可以直接用简单的代码进行到那个权限的申请,而不需要提前校验权限和回调,例如本此设计只需要

在MainAbility中用requestPermissionsFromUser方法申请用户权限,具体如下

"ohos.permission.LOCATION",//允许应用获取设备位置信息。

"ohos.permission.INTERNET",//允许使用Internet网络。

"ohos.permission.READ_USER_STORAGE”,//允许读取用户存储

"ohos.permission.WRITE_USER_STORAGE"//允许写入用户存储

当鸿蒙应用下载安装到手机设备后启动,就会有个弹窗框提示,如图19所示。

 

图19  权限访问许可弹窗

始终允许后,在下次重新启动应用就不会有此弹窗提示了,这就完成了应用要获得手机文件的相关权限。然后就可以进行第二步的选择目录下的文本文件进行读取操作。

这里需要设置button按钮及其事件监听,首先需要在MainAbilitySlice下用findComponentById方法获得按钮的id:

Button guideQuestions=(Button) findComponentById(ResourceTable.Id_guideQuestions);

然后再用guideQuestions.setclickedListener(new Component.clickedListener())设置此按钮的事件监听,此部分主要功能要打开文件的所在目录,所以需要用Intent对象的operationBuilder方法创建空的operationBuilder实例,然后就可以用onAbilityResult进行文件的获取操作,当文件被读取成功后,用ToastDialog进行弹窗提示“导入成功“,至此题库和答案的导入就基本完成了,其具体文本内容都存放在questionfile和answerfile中,后续需要对此进行文本的逐题显示到做题页面上。

3.3.2  AbilitySlice跳转

(1)AbilitySlice之间的界面跳转

本次应用开发的运用到了好几处AbilitySlice之间的界面跳转,比如需要点击“开始做题”按钮实现从首页页面跳转到做题页面,还有就在做题页面点击“返回首页”按钮跳转到首页页面,在总结页面点击“返回首页”按钮回到首页页面以及点击“重复练习”按钮跳转到做题页面。其主要的实现步骤有以下3点:

第一步是设置在layout设置xml布局文件,比如需要button按钮设置它的独立id。

第二步在AbilitySlice中,在onstart方法中调用super.setUIcontent方法,然后,调用 findComponentByld 方法获取之前设置的按钮id,获取的对象类型是Component,需要强转为 Button 对象,比如

super.setUIContent(ResourceTable.Layout_ability_main):

Button start=(Button) findComponentById(ResourceTable.Id_start);//获得“开始做题”按钮。

第三步就是设置点击按钮的监听事件,调用 setClickedListener方法,设置 Component.ClickedListener 类型的点击监听器,按钮被点击后,会自动回调 onClick 方法,也可以之间用以下的简单代码进行实现页面的跳转

IndexBtn.setcrickedlistener(component->poresent(newMainAbilityslice().newIntent()));

上面代码返回首页功能的按钮,就实现了从当前页面跳转到MainAbilityslice页面。

(2) AbilitySlice之间的值跳转

上面的方法只是单纯的跳转页面,无法实现从页面之间的值传递问题。比如本次设计是需要在总结界面上显示之前做题的正确率的,就需要从做题页面上收集之前的做的正确题目数量,然后传递到总结页面进行计算。Intent方法就无法满足了。那么如何实现期望的效果呢?

这就需要使用startAbilityForResult(Intent, requestCode)方法,该方法会先跳转至目标Ability,然后在返回本Ability时会回调onAbilityResult(requestCode, resultCode, resultIntent)方法;其中requestCode是一个自定义整型变量,主要作用是对这次的跳转事件进行标记,以便在返回主界面回调进入onAbilityResult(requestCode, resultCode, resultIntent)时根据不同的跳转事件做不同的处理。我们需要在AbilitySlice中重写onAbilityResult(requestCode, resultCode, resultIntent)方法,根据requestCode来判别相应的跳转事件,根据事件再进行进一步的处理。

3.3.3  弹窗框的设计

本次鸿蒙应用中会运用到各种弹窗,第一种的就是当用户成功导入题库和文件时会有提示框提示“成功导入”,第二种是在做题过程中,当选择的选项正确或错误时,会有弹窗提示“回答正确”或“回答错误”,第三种是在题目收集的模块中,是简单的实现收集之前在做题页面上标记的正确/错误题号和其正确的选项。

第一种是用ToastDialog组件进行简单实现,ToastDialog的组成一般有标题、内容、选择按钮,本次我们只需要简单的内容提示就可以了。默认情况下,弹窗框会展示2秒就会自动消失,因为第一部分的需求不大,所以之间用一行代码设置就可以实现,例如:

new ToastDialog(getContext()).setText("导入成功!").show();直接一步到位完成了ToastDialog的创建,设置所需要显示的内容,然后show展示出来。

第二种就也是用ToastDialog组件实现的,但是因为这部分不仅需要多次进行运用弹窗,而且其中的设置(需要弹窗背景有明显的颜色提示,且显示在页面的中间位置)相对第一种较复杂,所以这部分是运用了ToastDialog抽取工具类,可以直接给ToastDialog弹窗一个布局,然后将ToastDialog抽取到一个工具类中,之后需要用到此弹窗的时候就可以直接调用。

其具体是实现步骤分为以下几点:

(1)新建一个文件布局,将其命名为layout_toast1(回答正确的弹窗),如图20所示。

 

图20  layout_toast1的代码设置

其中的背景设置需要在graphic文件进行设置,本次设计创建了background_toast_element文件修改其中的color参数,使其为半透明的红色,然后在layout_toast1文件中的:backqround_element设置为"$graphic:background_toast_element"就完成了弹窗框的背景和文本内容的设置。layout_toast2(回答错误的弹窗)的布局设计也基本相同,就是在设置其不同的id和文本内容。

(2)然后就可以在在java代码调用此弹窗,首先是需要先定义这两个不同的弹窗,将xml文件加载在内存里,然后在在需要的位置调用弹窗。setContentCustomComponent就是直接调用上面所布局的弹窗,setSize就是设置弹窗的大小,默认情况下是包裹着内容,setAlianment是设置对齐方式。具体代码见附页。

以上就是自定义弹窗的设置和调用,在判断出用户选择的答案是否正确时就可以对其进行弹窗显示。

第三种是在题目收集的模块中,简单地实现收集之前在做题页面上标记的正确/错误题号和其正确的选项,此部分是需要显示之前在做题时收集的题号和答案文本,然后还要设置一个按钮来取消显示,因此部分是使用CommonnDialog组件的。

CommonDialog是一种在弹出框消失之前,用来展示用户当前需要的信息。其主要组成也是标题、内容和选择按钮,本次因为要显示的是两个部分的内容,所以在设置将标题的文本显示为“错误的题目”,内容的文本设置为“正确的文本”,然后还在下方添加一个“取消”按钮。具体的实现步骤如下:

第一步因为是点击按钮来进行弹窗的显示,所以第一步还是需要获得按钮的id,第二步就可以对其进行按钮的事件监听的设置,此部分就要先用CommonDialog创建一个对话框,然后用setTitleText设置标题文本,setContentText设置内容文本,setButton设置“取消”按钮的事件监听,show()对其进行显示在页面上。具体的代码见附录B。

3.4  本地应用功能的实现 3.4.1  题库中的题目和选项文本的显示的实现

本次题库中的题目和选项文本的显示主要都是在一个做题页面上进行显示的,在layout文件中的ability_doexercise(做题页面)布局中,题目的是使用Text组件,而4个选项是使用Button组件,这样是为了方便之后点击选项后可以触发判断正确与否的判断事件监听以及按钮变色的提示功能。

首先是题目的显示是直接要显示在Text中,这部分可以直接调用setText方法实现,而选项的文本因为是要将一行的文本分成4部分分别置入对应的按钮中,这一部分可以使用substring方法进行文本的截取。其具体的设置如下:

第一步还是需要先获得对应的文本文件,用getExternalFilesDir方法获得存储目录,然后获得其文本内容,getExternalFilesDir对应的目录是sdcard/Android/data/包名/files/。

第二步就是用findComponentById方法绑定对应的Text和4个按钮id。第三步就是用setText分别获取对应行的文本内容,例如第一道题的题目文本和答案文本在题库文件的第1行和第2行,只需要用questionsTxt.setText(readed(1))就可以获取第一行的文本内容并且放置在Text组件中,实现第一道题的题目显示;用answerText.setText(readed(2))就可以获取第二行的文本内容,然后用substring方法进行文本的截取,将对应的选项的文本放置在按钮的文本中,要实现不同的题目显示就可以给予两个变量实现不同行数的题库文本的获取。

其中的选项按钮获取文本如下所示:

ABtn.setText(answerTxt.getText().substring(0,11));

BBtn.setText(answerTxt.getText().substring(11,22));

CBtn.setText(answerTxt.getText().substring(22,33));

CBtn.setText(answerTxt.getText().substring(33,44));

因为设置了选项的获取文本格式,每个选项的只可以有11位字符,所以对导入的题库文本都有对应的格式才可以完整的获取对应的选项文本。

3.4.2  上一题和下一题的题目在一个页面的内容切换的实现

按上面的方法就实现了单个页面的题目和选项的显示操作,为了可以在点击“上一题”和“下一题”在一个页面的内容切换的切换,主就是用questionsTxt.setText(readed())中设置变量l,因为题目文本之间是相隔两行的,所以要变量需要进行+2操作,答案文本也是同理。其主要有以下两个步骤:

第一步还是绑定对应的按钮id,第二步就是对“下一题”按钮进行按钮事件监听的设置,然后在DoExerciseSlice中定义l变量为题目行数和ln变量为答案行数,就可以对题目和答案的文本进行准确的获取,因为第一题和最后一题的“上一题”和“下一题”是不能没有题目显示的,所以还需要在此增加一个if的判断来设置“下一题”的按钮文本,其中还要添加一个具体题号的a变量,当a=10时其“下一题”的文本就会变成“结束练习”,此处也是需要用到setText方法来改变按钮的文本。其中的“上一题”和“下一题”的实现时基本一致,只是变量的+2变成-2操作。这就完成了一个页面可以显示不同题目和选项答案的操作,虽然还是同一个页面,但是实际效果却好像是进行了题目页面的跳转,节约应用的内存。

3.4.3  用户选择的选项的答案进行判断

通过上述的操作就完成了题目和答案的显示布局,然后就是要实现用户在选择选项后,将此选项的答案与导入的答案进行判断操作,其中是要几个功能的实现。第一个是当用户点击选项时,就会改变选项按钮的背景色来提示用户是选择此选项;第二个是将用户选择的选项和标准的答案进行对比判断;第三个当用户选择正确时就有弹窗提示“回答正确”,当用户选择错误时就有弹窗提示“回答错误”。

第一个要实现点击按钮时的按钮由原来二点透明背景转换到绿色的背景,首先要分别绑定对应的4个选项按钮的id,然后就是要创建一个总的事件监听函数,以方便点击不同选项按钮时可以直接调用。然后在graphic文件中创建buttonchosic对其按钮的背景进行设置为绿色,然后用shapeElement方法调用graphic文件中buttonchosic。最后用setBackground就可以更改选型按钮的背景了。

第二个主要就是进行一个if语句的判断,例如if(questions[l].equals(readedAnswer(a)))

就是选项的答案与导入的答案进行判断操作。第三个就用到之前的弹窗设置,直接用ToasDialog组件。

3.4.4  初始创建题库和答案文件

因为在获取文件时,是需要先判断该目录下是否有文件的,当该目录下没有文件时就可以用createNewFile方法进行文件的创建,在本应用中,为了方便用户在没有导入题库文件的情况下,也可以进行刷题的训练,相当于是体验此应用的刷题流程,在此创建了2套题库文件和对应的答案文件。首先是用file函数获取对应的目录路径,然后判断此目录下是否有文本文件,如果没有就进行题库的创建,用BufferedWriter方法创建类对象,然后用append方法进行文件内容的文本的写入操作,就完成了初始化的创建题库和答案文件。

3.4.5  整体功能的逻辑的实现

各项基本功能都铺设完毕之后,就是利用这些功能与信息来实现整体软件的逻辑的时候。其具体地功能如下所示:

(1)点击“导入题库”按钮:实现题目的导入。

(2)点击“导入答案”按钮:实现答案的导入。

(3)点击“开始做题/继续做题”按钮:会跳转到做题页面,导入的题目就会显示在此页面。

(4)点击“返回首页”按钮:会跳转到首页页面。

(5)点击“下一题”按钮:会更换下一题题目的题目文本和选项文本(最后一题的按钮名称会变成“结束练习”)。

(6) 点击“上一题”按钮:会更换上一道题目的题目文本和选项文本(第一题因为没有上一题,所以设计上是没有变化的)。

(7)点击“A/B/C/D”选项按钮:首先点击后按钮背景后变成绿色,然后若选择正确,会有提示弹出“回答正确”,若选择错误,会有提示弹出“回答错误”。

(8)点击“结束练习”按钮:会跳转道总结页面,总结页面上有计算的练习的正确率。

(9)点击“题目收集”按钮:会有弹窗显示做正确和错误的题号和答案。

4  总结与展望

本文基于鸿蒙系统开发实现了一款可自我录入式刷题的应用,完善了市面上没有出现过的用户可以根据自身需求导入题库进行练习的刷题软件的应用,是一款应用性强,可塑性优异的刷题软件,能够为用户提供更加自由的刷题模式训练,真正达到各有所需实用性的目的。

经过本次的鸿蒙应用的设计开发,除了感叹于鸿蒙的前瞻性、创新性、完成度以及当前可实现的诸多亮点功能,也发现了本文开发的应用还是有需要改进的地方,比如导入的问题文本和答案文本必须要符合特定的格式才可以正确地导入,其次还可以添加做题记录痕迹的保存,方便用户重新阅读之前的题目等。这些都是可以进行改进和努力的方向。在进行学习和练习鸿蒙应用开发的过程中,我发现很少有面向学生学习的应用软件的开发文档或书籍,而鸿蒙系统的刚刚初步发展,需要各个不同类型的开发者们的努力,让我们一起努力推动鸿蒙的发展。

参 考 文 献

华为. HarmonyOS Developer文档指南[EB/OL]. 中国: 华为, 2023. 01. 14[2023. 02. 17]. https://developer.harmonyos.com/cn/documentation.

陈美汝, 郑森文, 武延军等. 鸿蒙操作系统应用开发实践[M]. 北京: 清华大学出版社, 2021.

李艳, 刘丹, 田小东. HarmonyOS特点与应用前景分析[J]. 通信与信息技术, 2019(05): 85-87.

IT之家. 华为鸿蒙 HarmonyOS 3.1版本发布,面进入声明式开发[EB/OL]. 中国: IT之家, 2022.11.14. https://www.ithome.com/0/653/768.htm.

毛烁. 浅谈鸿蒙系统[N]. 中国信息化周报, 2021-06-28(004).

石夏德. 物联网时代的鸿蒙野心有多大[J]. 计算机与网络, 2019.

刘小芬. 鸿蒙系架构及应用程序开发研究[J]. 电脑编程技巧与维护, 2021(12): 4.

陶善才. 鸿蒙系统发布对我国科技研究和创新的启示[J]. 安徽科技, 2021(8): 3.

Ruipeng Gao, Weiwei Xing, Haoyue Zhao etal. Teaching Reform for Harmony OS Mobile Application Development[J]. 计算机教育, 2021(12): 62-67.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3