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

HarmonyOS应用开发速成体验

时间:2023-03-12 06:03:10 科技观察

更多内容请访问:https://harmonyos.51cto.com,与华为官方共同成立的鸿蒙技术社区,聊聊HarmonyOS应用开发,主要是因为2020年底,我接到了华为的一个项目,为两所985高校开发实验案例手册。一个是面向上层应用方向,一个是面向操作系统层。老实说,那时候我只知道HarmonyOS,但对它的开发技术一点都不懂。但是这两个层面也算是很有信心去接了,首先是对新知识新技术的渴求(尤其是本土化的),毕竟我做了10年的应用开发,3年的操作系统低级协议栈开发。说说我是怎么学习一门新技术的。作为开发老手,肯定是项目驱动的学习。很多年都是这样,从最初的vc到delphi到php,java到Android,python等等。一、项目用例需求分析与项目移植先从我之前写的其中一本实验指南开始《HarmonyOS 手机通讯录开发 实验指导手册》。首先,在写案例之前分析案例需求。对我这个老鸟来说,不需要考虑太多。在极小的情况下,我心里已经有了原型。当然,没必要自己画原型。这是实现的最终渲染。然后,根据以往的项目经验,想象一下,如果你用Android或者Vue,要实现什么步骤。其实Android和Vue虽然语法不同,但是基本思路是差不多的。切换和比较不同的技术栈是非常重要的。这里还有一点要记住。当你拿到一个项目的时候,不用担心看着API,手写代码。经过以上思路,我很快形成了初步的功能实现思路,能够尽可能多的集成常用的开发方式。技术栈进来。(1)实现通讯录首页的UI布局问题:HarmonyOS中如何实现通讯录的UI布局,其中涉及的UI组件Skd是否可用(2)实现静态数据联系人列表渲染(3)实现按钮点击和列表点击,长按等监听事件,使用日志打印模拟业务,debug调试(4)添加联系人详情页面,实现页面间跳转和传递参数(5)编写并通过弹窗添加联系人页面(6)联系人动态刷新人员列表数据(7)将静态数据切换为本地持久化数据,如sqlite是否存在,对数据进行相应的CRUD操作(8)将静态数据切换为服务器数据,如何使用http网络通讯?是否涉及权限?对照(九)自定义组件的使用接下来我会带着这个想法和问题去网上找资料。我个人习惯先查看官网信息。前期不要太依赖博客。毕竟博客里面会有很多坑,跳不出来。说到这里,希望社区不要打我。至少我写完系列手册的时候没有看博客。当然,那时候相关的博客可能很少。毕竟官网资料很少,还是有一些错误。2.阅读官方开发文档既然华为的官方文档已经很强大了,我觉得大家想学习HarmonyOS应用开发的人再看我的博客有点多余。这里先说说阅读官方文档的技巧。整篇文章不用仔细看,结合项目需求看。首先,我只是找目录,看看HarmonyOSSDK是否支持我上面提到的所有功能需求。看了之后发现HarmonyOS中有两个SDK,Java和JS。简单的看一下入门案例,就知道该怎么做了,不用太纠结于细节。对于JS,对比一下VUE和微信小程序的思路就可以了。对于Java,可以先和Android对比一下,等以后自己写代码实现功能了。所以后来为这个项目写了一个JS版的通讯录开发,后来发现了HarmonyOS重要的分布式开发技术,也写了Java和JS混合开发。JSFA调用JavaPA的数据内容。这些都是在看完文档后,做了一个项目扩展。确认SDK基本支持我想要的需求后,下面开始实现代码编辑。3、开发HelloWorld的必备作为一个老手,我一直向学生强调HelloWorld的重要性。参考官网??入门案例自行搭建开发环境,运行HelloWorld项目。官网上的步骤很详细,就不多解释了。这里我强调几个关键点。请好好看看HelloWorld项目的组织结构。我个人认为前期最重要的是熟悉这个项目的组织结构,尤其是JS版本和Java版本。如果不清楚,请看官方文档对此有解释。至于调试,前期只有模拟器在线版,需要华为账号认证,每小时自动发布。这只是一个明确的习惯,没必要纠结。至于DevEcoStudio的IDE,我就不多说了。对于熟练使用过IDEA或者AndroidStudio等JetBrains全家桶产品的开发者来说,上手简单。刚接触它的读者应该先不厌其烦地熟悉一下常用操作。4、写代码,看官方文档,填坑由于之前已经分解了开发步骤,所以写代码的目的很明确,思路也很清晰。如果你是缺乏项目经验的初学者,从小的语法知识点开始学习,比如半天学一个小按钮,那开发学习就太慢了。所以,我还是建议多使用项目式学习,尤其是自己做过的项目移植或者需求非常明确的项目的替代。既然知道了JavaSDK的开发,再发现可以和Android对比开发,那么Android老手要做的就是写代码,做差异化的笔记。我的同事之前也在社区上发布了《安卓VS鸿蒙第三方件切换宝典》,就是这种开发思维的产物。首先,强调一种编码习惯。包结构划分合理,包名清晰,然后是类名、方法名、变量名、常量名命名规范,即使注释少,没有详细说明也便于阅读代码设计文件。然后是git的使用,每完成一个核心步骤,就及时提交,并写出简洁明了的提交日志。最后一步一步解决问题(1)实现通讯录首页的UI布局。本项目案例,先布局上下结构菜单栏和空列表,再对UI细节进行微调。这时候,你就会对版面内容有七个掌握。七八个,不用深究了。这个时候可以记录一下Android和HarmonyOS的布局知识的异同(2)实现联系人列表的静态数据渲染。发现HarmonyOS和Android列表数据渲染的实现是类似的,也是使用一个带有provider的lsitui组件实现的。(3)实现按钮点击、列表点击、长按等各种监控事件,并使用日志打印模拟业务,调试调试。点击事件监控是最常用于触发应用程序中的业务逻辑的事件。前期没有实际业务时,请使用Log打印代替实际业务。初学者经常抱怨sysout和log太枯燥了,你会发现用到后面才是最好的。这里我想强调一个问题。做开发一定要抓住重点。现在你需要学习掌握点击事件的触发。您不需要创建实际的业务场景,例如大数据分析。关键是使用哪些大数据技术,根据原始数据集分析我关注哪些数据维度。这些才是核心,而不是这些数据展示的多么漂亮。当你觉得在控制台下打印这些数据是最美的时候,我就会觉得你进步了。当然,回过头来看,后面还是需要在这些事件中加入实际的业务操作,比如长按删除联系人的操作,这样才能充分理解实际业务是如何进行的,以及你当时所学的基础知识点。开始是串联的。以此目的。(4)添加联系人详情页面,实现页面间跳转传递参数数据的交互,可以说是应用开发的核心,比如传统的web开发,前后端分离模式的web开发,和AppCS程序开发。逃不开数据的交互。要实现这个功能,首先要抛开具体的编程技术,而是思考以下几个关键点:如何创建多个页面,如何将某个页面设置为首页,在何处触发页面跳转,上一页如何向下一页传递数据,传递数据支持哪些数据结构,如何从下一页返回数据,然后我们可以阅读官方文档找到相应的API进行处理。这里重要提醒一下,在我个人的开发理念中,我把API语法放在很低的位置,从不死记硬背API。比如你只需要知道SDK中一定有API可以实现页面跳转的功能,然后你就可以快速查资料了。或者你自己的笔记,书面演示,只是让他们熟悉。保证在你很久没有做这种开发的情况下,通用API依然可以在1分钟内解决问题。尤其是学了七八种编程语言之后,想要记住各种API就更不可能了。(5)编写通过弹窗添加联系人的页面(6)动态刷新联系人列表数据。这两个步骤还是可以通过查阅官方资料,做个对比记录一下来实现的。(7)静态数据切换为本地持久化数据,比如有没有sqlite,会对应到数据的CRUD操作。这一步涉及到数据库的使用。查阅资料后发现,还是传统的原生SQL操作和ORM模型操作。至于CRUD,我就不多说了。初学者一开始主要是这么干的,资深开发者看到这个就恶心。这里不多说,我觉得nativesql不如ORM爽快,但是学习成本低,学习nativesql可以玩转所有数据库,所以还是推荐nativesql使用。在这一点上,有一个步骤是我非常想强调的,那就是方法(也就是函数)的编写。大业务层面是面向接口设计,业务实现时面向对象设计,实现实现时最重要的是方法的设计和编写。一个优秀的代码开发者,在想清楚需求之后,只需要写出方法的两个关键要素,方法参数和返回值,就可以实现业务了。这里重点在于他对业务和数据交互的深入理解,所以在前期写代码的时候,几步伪代码就可以完成一个功能模块的设计和实现。下面我写伪代码:(1)---实现布局---(2)在AbilitySlice中关联布局,并初始化要使用的各个UI组件,并初始化监听事件(3)写三个核心业务methods,数据切换的几种场景//获取sqlite数据库中的数据,集成sqlite后调用该方法替代之前的静态数据方法privateListgetSqliteData(){}//生成静态列表数据进行模拟,在对接sqlite或者服务器将不再使用privateListgetData(){}//通过http请求获取服务器数据privatevoidgetServerData(){}(4)菜单选择监听事件切换数据源loadingswitch(position){case0:getData();break;case1:getSqliteData()break;case2:getServerData();break;}这里提到了对数据库的操作,我们也可以引入惯用的DAO接口设计注意事项,编写相应的DAO层,然后进行设计实现的实现类,同时也可以将上述伪代码方法封装成一个获取数据服务的Service接口,再使用业务接口实现。这里还是要强调一下,设计先于代码。(8)静态数据切换为服务器数据时如何使用http网络通信?是否涉及权限控制?HTTP网络通信是应用程序开发中必不可少的东西。既然是JavaSDK,自然想到支持最原生的HttpConnectionAPI。查看官网信息,会发现肯定是支持的,但是一般不会使用原生的,往往会引入一些优秀的第三方库进行开发。比如okhttp是一个纯Java的jar包,直接进入开发即可。由于不是Android开发,这里不介绍用于开发的Androidaar库。在网络开发中,你会遇到各种坑,比如权限申请,ui主线程无法执行网络耗时任务等等,这些都可以通过经验或者阅读错误日志来一一解决。说到网络通信交互,不得不想到各种MVC、MVP、MVVM设计模式。一开始当然最熟悉的是MVC。先使用传统的MVC进行开发,然后可以自己封装MVP开发模型。(9)鸿蒙定制组件的使用处于起步阶段。初期的SDK开发包只会进行基础功能的开发。如果全部基于原生SDK开发,项目开发效率肯定会比传统的Android和iOS低很多,因为他们已经非常成熟,拥有大量优秀的开源第三方组件库。说白了,现在开发一个应用就像是代码积木。现在需要大量优秀的开发者来打造各种优秀的轮子,让大家可以更快的开发项目。编写自定义组件确实比完成一个简单的项目需求更有趣、更有成就感,哪怕是一个很小的组件。这需要耐心去阅读官方SDKAPI甚至底层代码实现。当然现在官网文档已经完成了。写第一个组件的时候还是消耗了不少精力。当时文档匮乏,只能看比较生涩的API文档,然后半猜测半尝试弄清楚。(10)重要特性和功能介绍阅读官方文档后,我发现了分布式数据通信、协作、流转等重要技术。后来主要是考虑使用场景,集成到开发中。本案例正好可以使用分布式PA和FA的相互调用,通过本项目案例也可以完美的集成这个功能引用。这种融合也可以检验对新知识的掌握程度。比如JS开发通讯录FA,然后Java开发通讯录数据服务PA,FA可以获取PA中的数据。5.遇到无法解决的陷阱如何寻求帮助这里是给初学者的一个建议。遇到问题不要马上求助。当出现问题时,首先要通过查看日志来解决。自己看资料,反复尝试,记录错误重现的手段,对比场景解决方案等措施,自己寻找解决办法。只有在反复尝试后发现问题就是问题所在时,才可以向老师求助,并且能够把问题描述清楚再求助。项目开发过程中发现官方文档、工具等各种BUG,并进行了充分记录和证据论证,并提交给华为帮助整改。对于遗漏的关键API操作或技术说明,也可以明确提出合理化诉求,寻求帮助。6、开发完成后,回顾项目,总结开发思路,主要是分析之前的思路有没有不准确的地方;梳理和回顾开发过程中遇到的坑,以及如何一步步填坑;整理相关文件,归档留存;梳理项目中使用的技术栈;梳理项目需要持续改进的地方;七、本项目使用到的一些相关技术点1、HarmonyOS移动应用开发工具(DevEcoStudio)的使用;2、UI组件的使用,包括Text、Button、TextFiled、Image、RadioButton、RadioContainer、ToastDialog、ListContainer;3、UI布局的使用,包括DirectionalLayout、DependentLayout;4.日志打印,HiLog的使用;5.各种事件监控操作及业务逻辑实现;(难点)6、ListContainer子布局结合RecycleItemProvider的使用;(难点)7.对话框和自定义对话框的使用;(难点)8.页面生命周期和页面间跳转传递和传递参数;9、自定义组件(也涉及到Canvas)以及如何调用;(难点)10、数据存储操作,主要涉及sqlite数据库存储;(难点)11、通过HTTP网络通信与服务器交互;(难点)12、多线程通信;(难点)13.代码编程规范、设计模式;反复跳坑填坑,类比更自然,即使你是一个技术新手,也可以快速完成一个项目的移植,比如这个小项目案例,从第一次接触到开发完成一天就够了.学习编程,不要执着于语法和API,要注意思维训练,多练习,多坑,多比较,多总结才是王道。对于开发老手,快速掌握HarmonyOS开发我的建议是将自己原有的项目进行移植,尽可能多的融入技术点。对于初学者,我的建议是找一个自己项目的通关型案例,然后配合自己查阅官方资料进行结合学习,这样也会事半功倍。如果你做太多的应用,你会逐渐失去兴趣。它们都是关于数据交互和UI渲染的。这个时候强烈建议大家关注一下操作系统层的源码。这时候c的代码可能看起来更友好一些。这里推荐的不是开发板、上层数据传输等应用开发,而是操作系统内核代码,值得一看。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区