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

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

时间:2023-03-21 18:21:49 科技观察

更多内容请访问:与华为官方共建的Harmonyos技术社区https://harmonyos.51cto.com/#zz在上一篇文章(转)中,我们已经跑通了鸿蒙OS应用开发环境。在本文中,我们将更深入地探索helloworld代码背后的东西。(1)IDE布局分析如上截图所示,我将整个界面大致拆分:顶部红色区域为菜单栏,左侧蓝色区域为项目工程,右侧大面积为代码编辑区,右上角是工具栏(Debug、run),底部是显示日志、命令、调试等一些信息。当然,这里主要标注了几个比较大、比较固定的窗口,更详细的,比如预览界面等动态界面,需要的时候再细说。(2)项目结构分析项目工程这里主要存放项目资源,包括用户代码、配置文件、库文件、图片、音视频等,根目录是我们创建项目时定义的项目目录。.gradle和.idea一般不需要开发者干预,属于IDE自动创建环境的目录。build文件夹:该目录为编译输出目录,编译后会生成对应的.hap包(可以理解为类似于ios.ipa和Android.apk)。entryfolder:入口目录,如果是Android开发者,可以对应app文件夹。它存放着我们应用程序的核心内容,比如代码、图片、音视频资源等等。所以这个文件夹是重点,我们展开分析一下:同理,在entry目录下,也有一些熟悉的目录:entry-build:和外层根??项目目录下的build功能一样。entry-libs:库目录,用于放置库文件的目录。entry-src:存放源文件的目录,然后里面又细分了主目录和测试目录。main是核心目录,里面包含核心程序代码(main-java)和资源(resources)目录。config.json是配置信息文件,可以配置包名、版本、设备类型等,其中设备类型(deviceType)指定了当前程序支持的设备,鸿蒙OS会加载FA即根据实际不同的设备适用于当前设备对应的版本。entry-src-resources:该目录存放各种资源文件,如应用程序的图标、音效、布局配置等。entry-src-tesst:该目录存放测试代码。目前默认使用junit测试框架。gradle:该目录属于编译模块。(3)代码分析了解了项目目录后,我们来分析一下之前的helloworld的源码。在entry-src-main-java-com.xxx.myHarmonyApp目录下:我们可以看到多了三个java代码文件,其中slice可以对应Android开发中的片段概念。目前官方的例子是把逻辑代码放在MainAbilitySlice里面。MainAbility.java:一个Ability代表一个能力。我们可以看到这个MainAbility是继承自Ability类的:这里重写了onStart方法(@Override),方法中做了两件事:调用父类的onStart方法初始化intent,另一个就是调用父类方法给slice类设置路由,也就是将后续的执行逻辑赋值给slice。通常一个Ability对应一个AbilitySlice。MyApplication.java:程序的入口点。我们只在代码中重写了一个初始化函数,它的主要作用是对程序进行初始化。MainAbilitySlice.java:我们看到上面两个java类没有执行任何逻辑代码,那么我们如何输出helloworld这个词呢?如上所述,MainAbility已将其执行路由到slice。因此,核心逻辑代码就在这个MainAbilitySlice.java中。代码行数不多,我们可以逐行分析。首先,我们需要分析几个关键词。因为之前熟悉的技术栈是c#,这里也简单参考一下,做benchmarking:package:是一个关键字,指定一个包名,格式为com.vendorname.applicationname.module。您可以类似地对c#的命名空间进行基准测试。import:也是一个关键字,用于导入其他包。也可以使用c#的using关键字。extends:关键字,表示继承,类比c#的冒号。@Override:关键字,表示重写,overridesupperofc#:关键字,表示基类调用,可以类比c#的base。ohos:意思是开放和谐操作系统。intent:中间件,主要作用是为组件之间提供相互调用的媒介,辅助组件之间的交互和通信。所以,有了上面的概念,我们再看代码的时候就会更清楚了。第一行代码指定并定义了当前类的包名。第3-5行导入当前所需的包环境。第7-12行,继承AbilictySlice,扩展MainAbilitySlice类。重写onStart方法,调用基类的onStart初始化intent中间件,然后调用基类的setUIContent设置UI内容(helloworld的创建到此为止~)。第14-23行都是为周期函数的初始化基类调用的。所以,重点是super.setUIContent(ResourceTable.Layout_ability_main);此代码生成“helloworld”。简单来说,setUIContent会解析ResourceTable提供的元素信息,创建对应的UI界面。ResourceTable用于管理一些widget资源,Layout_ability_main对应entry-src-resources-base-layout目录下的布局配置。(4)布局文件分析打开ability_main.xml就很清楚helloworld的来源了:这是一个xml文件,开头对应着mark。标签是鸿蒙的方向性布局标签,对应于:xmlns:XMLNamespaces表示命名空间。ohos:heigh="match_parent":表示定义了一个高度匹配的parent。ohos:width="math_parent":表示宽度自适应父级。ohos:orientation="vertical":表示布局方向是垂直的,另一个相对值是"horizo??ntal"。标签代表一个文本元素。ohos:id="$+id:tex_helloworld":表示文本的调用id,用"$+id:"标记一个占位符,后面跟一个名字,这样当你需要调用这个文本的时候,就可以调用是这样的:ohos:background_element="$graphic:background_ability_main":表示背景元素被指定为entry-src-main-resources-base-graphic目录下的另一个xml配置。标签表示绘制一个形状。ohos:shape="rectangle"意思是画一个矩形。标签表示填充色表示填充色为白色,也可以用鼠标选择IDE左侧的颜色选择块。回到标签:ohos:layout_aliment="horizo??ntal_center"表示文本对齐水平居中。ohos:text="helloworld"这是最终的输出文本。我们可以尝试将其更改为任何其他字符串,例如:ohos:text="Hello,Hongmeng!"ohos:text_size="50":表示设置字体大小为50。也可以给文本元素添加颜色:ohos:text_color="#78FF00",当输入"#"+任意数字时,可以看到颜色IDE左侧的选择块。我们可以自定义配置再次运行看看效果:本文结束,看下一篇~更多内容请访问:与华为官方共建的Harmonyos技术社区https://harmonyos.51cto.com/#ZZ