当前位置: 首页 > 科技观察

鸿蒙OS应用开发实践(四)

时间:2023-03-22 15:48:22 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz通过之前的学习:快速入门一个Helloworld程序和写了一个简单的交互程序,我们已经对鸿蒙应用开发的基本流程有了基本的了解,这篇文章,我们来详细研究一下鸿蒙的UI框架(基于JAVA)。(1)Ability在开始之前,先了解一个基本概念:AbilityAbility,英文字面意思是“能力”。同样在鸿蒙的架构体系中,官方的解释是:Ability是指应用的能力抽象是应用的重要组成部分。一个应用可以有多种能力(即可以包含多种能力),HarmonyOS支持以能力为单位部署应用。能力分为FA(FeatureAbility)和PA(ParticleAbility)两种。每种类型都为开发者提供了不同的模板,以实现不同的业务功能。Ability支持三种模板:PageAbility:页面模板,用于提供与用户交互的能力。这也是FA唯一支持的模板。ServiceAbility:服务模板,用于提供后台运行任务的能力。DataAbility:数据模板,用于对外提供统一的数据访问抽象。简单的说,如果你想和UI交互,那就用FA。如果需要做非接口服务/数据处理,就用PA。层次结构可以参考下图:在配置文件(config.json)中注册Ability时,可以通过配置Ability元素中的type属性来指定当前Ability模板的类型:上图指定了一个页面,表示这是一个页面模板实例。同样,如果你创建一个PA,你也可以指定服务或数据。不管是服务还是数据,都是一种能力。区别在于开发者如何定义这个类的职责(是提供服务/数据支持,还是作为接口交互?),简而言之,取决于你要创建的能力,它为你提供了什么能力。(2)页面跳转下面详细说说PageAbility。Page模板是FA唯一支持的模板,它提供了与用户交互(UI)的能力。一个Page可以由一个或多个AbilitySlices组成。我们之前在运行helloworld的时候介绍过,Ability是一个路由入口,而AbilitySlice是写交互逻辑的地方。简单的说,当我们创建一个FA,比如这个TestAbility的时候,会同时自动对应的创建一个TestAbilitySlice。TestAbility相当于一个可以被外部调用的类,具体的逻辑实现在TestAbilitySlice中。调用TestAbility时,通过路由自动映射到TestAbilitySlice,提供具体的交互逻辑。默认情况下,一个FeatureAbility会指定一条默认路由,即通过setMainRoute方法指定其对应的AbilitySlice。当然,我们也可以通过addActionRoute方法修改默认的指定。具体方法示例如下:1、在config.json文件中添加动作:2、在对应的Ablity中,使用onStart中的addActionRounte方法添加路由。addActionRoute("action.test",TestAbilitySlice.class.getName());3.调用:privatevoidTestAction(){Intentintent=newIntent();Operationoperation=newIntent.OperationBuilder().withAction("action.test").build();intent.setOperation(operation);startAbility(intent);}这里我们将详细解释这个Intent:Intent是对象之间传递信息的载体。比如当一个Ability需要启动另一个Ability,或者一个AbilitySlice需要导航到另一个AbilitySlice时,可以使用Intent指定启动目标并携带相关数据。上一篇文章提到过,它是一个中间件。这样就可以在Pages之间访问AbilitySlice了。页面跳转有两种:页内(能力)跳转和页间跳转。当然无论是什么情况,都需要借助中间件Intent来实现跳转,Intent也支持携带参数在Pages或Abilities之间传递数据参数。(1)Page内跳转当在同一个Page内跳转时,即当发起跳转的AbilitySlice和作为跳转目标的AbilitySlice在同一个Page中时,可以使用present()方法进行跳转。如果跳转需要返回结果,可以使用presentForResult()方法实现跳转。当用户从跳转目标返回时,系统会回调onResult()来接收并处理返回的结果。这个时候需要重写这个方法。返回结果由跳转目标AbilitySlice在其生命周期内通过setResult方法设置。(2)Pages之间的跳转不同Pages中的AbilitySlices是相互不可见的,所以不能通过present或presentForResult方法直接跳转到其他Pages的AbilitySlices。但是您可以通过配置Intent的Action来导航到目标AbilitySlice。可以使用startAbility或startAbilityForResult方法切换页面之间的导航。类似的startAbilityForResult方法还有onAbilityResult方法来获取返回结果的回调。在Ability中,通过setResult方法设置返回结果,见上文添加动作部分。(3)UI框架回到UI框架(JAVA),我们可以通过两种方式创建UI结构:Java代码和XML。1.使用代码搭建UI界面步骤:(1)定义布局:DirectionalLayoutlayout=newDirectionalLayout(this);(2)定义布局配置:LayoutConfigconfig=newLayoutConfig(LayoutConfig.MATH_PARENT,LayoutConfig.MATH_PARENT);(3)设置布局Configuration:layout.setLayoutConfig(config);(4)配置布局背景:ShapeElementelement=newShapeElement();element.setRgbColor(newRgbColor(255,255,255));layout.setBackground(元素);(5)在布局中添加组件(这里以Text为例):Texttext=newText(this);text.setLayoutConfig(config);text.setText("你好,鸿蒙");text.setTextColor(newColor(0xFF000000));text.setTextSize(50);文本。setTextAligment(TextAligment.CENTER);layout.addComponent(文本);(6)设置UI内容super.setUIContent(layout);完成以上抓取后,就可以以代码的形式创建界面了。2、使用XML建立页面:(1)建立XML文件:在base目录上右击创建布局文件:(2)创建完成后会在base-生成对应的XML文件>布局目录。初始内容如下:(3)创建组件元素:xmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:height="match_parent"ohos:width="match_parent"ohos:orientation="vertical">ohos:height="match_content"ohos:width="match_content"ohos:text="Hello,Hongmeng"/>Text标签下还有很多其他的参数,大部分相同的组件都有相似或相近的标签设置参数,可以输入试试ohos自动补全即可。基本上通过字面意思就可以直接理解其用途,这里不再赘述。(4)使用资源映射ResourceTable设置UI内容:super.setUIContent(ResourceTable.Layout_mytest);OK,这篇文章的内容很多,从Ability到UI框架,但是它们之间的关联性很大,所以我将它们放在一起。了解更多请访问:与华为官方共建鸿蒙科技社区https://harmonyos.51cto.com/#zz