谈及接触到HarmonyOS应用的开发,主要是因为在2020年年底接到华为一个项目为某两所985高校开发实验案例手册,一个是上层应用方向的,一个是操作系统层的。
说实话,当时只是知道HarmonyOS,而没有了解过其中任何开发技术。但是这两个层面自己也算很有底气去接,首先是对新知识新技术的饥渴(特别还是国产化的),加上自己毕竟做过10年的应用开发和3年的操作系统以及底层协议栈开发。
下面谈谈我是如何学习一门新技术的吧。
作为一个开发老鸟肯定是项目驱动学习,这个已经很多年都是这样了,从最初的vc到delphi到php、java到Android、python等等。
1、项目案例需求分析与项目移植
我这里就拿之前我之前编写的实验指导手册之一《HarmonyOS 手机通讯录开发 实验指导手册》这个说起吧。
首先,在编写这个案例之前分析这个案例需求。对于我这个老鸟来说基本不用多想,很小一个案例,头脑中已经有一个原型出来了,当然没有必要自己画原型图,这里贴一个最终实现的效果图。
然后,根据以往的项目经验来构想,如果使用Android或者Vue实现该是怎样的几个步骤。其实Android和Vue的语法虽然不一样,其实基本思路也是类似的,不同技术栈的切换对比式学习非常重要。
这里还有点需要切记,拿到一个项目时,别着急看API和动手写代码
经过以上的构思,我很快就形成了一个初步的功能实现思路,并且能尽可能地多融汇一些开发常用的技术栈进来。
(1)实现通讯录主页UI布局
疑问点:通讯录的UI布局在HarmonyOS中如何实现,里面涉及的UI组件Skd是否具备
(2)实现联系人列表静态数据渲染
(3)实现按钮点击、列表点击、长按等各种监听事件,使用日志打印模拟业务、debug调试
(4)添加联系人详情页面,实现页面之间跳转传参
(5)通过弹出窗口来编写添加联系人页面
(6)联系人列表数据的动态刷新
(7)静态数据切换为本地持久化数据,比如是否存在sqlite,相应会对应数据的CRUD操作
(8)静态数据切换为服务端数据,http网络通信如何使用?是否涉及权限控制
(9)自定义组件使用
下面再来带着这个思路和疑问去网上找资料。我个人习惯优先查阅官网资料。前期大家也别太依赖博客,毕竟博客里面的坑会一大堆,还跳不出来,讲到这希望社区别打我啊。起码我编写完成系列手册时没有翻阅博客,当然可能那个时候的相关博客也极其少吧,毕竟官网资料也很少并且还存在部分错误。
2、阅读官方开发文档
现在华为官方文档非常强大,我觉得大家想学HarmonyOS应用开发来看我的博客都有点多余了。
我这里讲下看官方文档的技巧吧,没必要全篇通读细读,带着项目需求去阅读。首先我就是寻找目录,看看我上面的功能需求HarmonyOS SDK是不是都支持。
阅读之后发现HarmonyOS 存在两个SDK,Java的和JS的,简单看了下入门案例就知道咋弄了,不用过于纠结其中细节了。JS的就对比VUE和微信小程序的思路去进行即可,Java的就先类比Android的去弄,等后面具体编写代码实现功能的时候再来排坑。
所以后面又对该项目编写了一个JS版本的通讯录开发,以及后面发现HarmonyOS 重要的分布式开发技术,还编写了Java和JS混合开发,JS FA调用Java PA的数据的内容,这些都是在通读文档之后做了项目延申。
确认好了SDK基本都支持我要的需求之后,下面就开始实施代码编辑了
3、开发必备HelloWorld
作为一个老鸟,我一直给学生强调HelloWorld的重要性。自行参照官网入门案例搭建开发环境,并且运行起来HelloWorld项目。官网步骤很详细,没有啥多解释的。我这里强调几个关键点,HelloWorld工程项目组织结构请好好看看,个人认为前期最主要的就是要熟悉这个项目组织结构,特别是还分JS版和Java版的,如有不清楚的请阅读官方文档对这块的讲解。
至于调试,前期只有网络版的模拟器,并且要华为账号认证,每个小时会自动释放,这个清楚习惯即可,没必要纠结。
至于DevEco Studio这个IDE我没什么多说的,熟练使用过IDEA或者Android Studio等JetBrains全家桶产品的开发者来说,就顺手拈来了。刚接触的读者还是先花心简单熟悉下常用操作吧。
4、代码编写、阅读官方文档、填坑
由于前面已经分解了开发步骤,所以编写代码目的性非常明确,思路清晰。
如果是初学者缺乏项目经验,从一个个小语法知识点开始学起,比如一个小小按钮学半天,那样开发和学习就太慢了。所以我还是建议多用项目式贯穿学习,特别是自己曾经做过的项目移植或者需求非常清楚的项目代入。
既然知道了Java SDK开发,然后发现可以和Android进行对比开发,那么这对Android老鸟来说要做的就是编写代码边做好差异化记录笔记即可。之前我同事也在社区上发布了《安卓VS鸿蒙第三方件切换宝典》,就是这种开发思维下的产物。
首先强调一个编写代码习惯。包结构的合理划分,包名清晰,然后就是类名、方法名、变量名、常量名命名规范,这样即使注释很少没有详细设计文档也很方便阅读代码。
然后是git的使用,每完成一个核心步骤及时提交并且编写简要明了的提交日志。
最后就是一步步去解决问题了
(1)实现通讯录主页UI布局
针对本项目案例先把上下结构菜单栏和空列表布局出来,然后微微调整UI细节,此时你就会对布局内容掌握的七七八八了,没有必要进一步深究了。此时可以记录下Android和HarmonyOS的布局知识点异同点
(2)实现联系人列表静态数据渲染
发现HarmonyOS和Android列表数据渲染实现类似,也是采用一个lsit ui组件配合provider进行实现。
(3)实现按钮点击、列表点击、长按等各种监听事件,使用日志打印模拟业务、debug调试
点击事件监听是应用中最常用来触发业务逻辑的,前期在没有实际业务的时候,请用日志打印来取代实际业务即可。
初学者往往会吐槽sysout、log好无聊,后面你就会发现它最好用。这里我重点强调一个问题,做开发一定要hold住关键点,现在是要学习掌握点击事件的触发,不用真要出一个实际业务场景,比如做大数据分析,重点是采用哪些大数据技术去根据原数据集分析出我所关注的哪些维度的数据,这些才是核心,而不是这些数据如何漂亮的展示出来。
当你觉得console下打印这些数据最漂亮的时候,我会觉得你进步了。当然回过头来,后面还是要在些这些事件里面加入实际业务的操作,比如长按删除联系人的操作,这样你就完全知道实际业务和最初所学基础知识点是如何串联起来的了,达到此目的即可。
(4)添加联系人详情页面,实现页面之间跳转传参
数据的交互可以说是应用开发时候的核心,比如传统的web开发、前后端分离模式的web开发、App类CS程序开发,都逃不过数据的交互。
实现此功能我们首先要抛开某门特定的编程技术,而是想着以下几个关键点:如何创建多个页面、如何设置某个页面为首页、在哪里触发页面跳转、前一个页面的数据如何传递到下一个页面、数据传递支持哪些数据结构、数据如何从下一个页面回传回来,然后我们再来去阅读官方文档找寻相应API进行处理即可。
这里着重提示,我个人开发理念里面把API语法放到非常低的地位,从来不记忆API,比如你只需要知道SDK中肯定有个API能够实现页面跳转的功能,然后自己能够快速的查阅资料或者自己的笔记、编写过的demo,做到眼熟即可。保证常用的API在你很长一段时间没有做此类开发之后,依然能在1分钟之内解决问题。特别是在你学习过七八门编程语言之后,越发不可能去记各种API了。
(5)通过弹出窗口来编写添加联系人页面
(6)联系人列表数据的动态刷新
这两步依然是查阅官方资料即可实现,做好对比和记录即可。
(7)静态数据切换为本地持久化数据,比如是否存在sqlite,会对应数据的CRUD操作
这步涉及到数据库的使用,查阅资料之后,发现依然是传统的原生sql操作和ORM模型操作。至于CRUD我不多说了,初学者最开始主要都是干这个,开发老鸟见到这个都想吐了。这里不多说,我认为原生sql虽然没有ORM操作起来清爽,但是学习成本低,学会原生sql玩转所有数据库,因此我还是更推荐原生sql使用。
到这一步有一个我非常想重点强调的步骤就是,对方法(即函数)的编写。大的业务层面面向接口设计,落实业务的时候面向对象设计,实施落地的时候最重要的就是方法的设计编写。一个优秀的代码开发者,在想清楚需求之后,只需要编写出方法的两个关键要素,方法形参和返回值,那么他一定就能实现该业务。这里就重点在于他对业务的深入理解和数据的交互,因此前期在编写代码的时候几步伪代码就可以完成一个功能模块的设计与实现。
下面我编写下伪代码:
- (1)---实现布局----
- (2)在AbilitySlice中关联布局,并且初始化要使用的各个UI组件,初始化监听事件
- (3)编写三个核心业务方法,用于数据的几种场景切换
- //获取sqlite数据库中的数据,集成sqlite之后调用这个方法取代之前的静态数据方法
- private List<Contacts> getSqliteData() {
- }
- //生成静态的列表数据进行模拟,在对接sqlite或者服务端之后不再使用
- private List<Contacts> getData() {
- }
- //通过http请求获取服务端数据
- private void getServerData() {
- }
- (4)菜单选择监听事件切换数据源加载
- switch (position) {
- case 0:
- getData();
- break;
- case 1:
- getSqliteData()
- break;
- case 2:
- getServerData();
- break;
- }
这里提到数据库的操作,我们也可以引入习惯的dao接口设计考虑,编写相应dao层,然后设计实现类进行实现,同时上面的伪代码方法还可以封装到一个获取数据服务的Service接口中,然后利用业务接口进行实现。此处依然是想强调设计先于代码。
(8)静态数据切换为服务端数据,http网络通信如何使用?是否涉及权限控制
http网络通信在app开发中必不可少的东西,既然是Java SDK,那显然会想到支持最原生的HttpConnection API,查阅官网资料也会发现肯定是支持的,但是一般不会使用原生的,往往会引入一些第三方优秀库进行开发,比如okhttp就是存粹的Java jar包,进入开发即可。由于不是Android开发,这里不要引入Android的aar库进行开发。
网络开发中就会再遇到各种不同的坑,比如权限申请、ui主线程不能执行网络耗时任务等,这些都可以通过经验或者阅读报错日志一一解决。
提到网络通信交互,不得不想到各种MVC、MVP、MVVM设计模式了,起初当然最熟悉的还是MVC,先使用传统的MVC去进行开发,后续可以自行封装MVP的开发模式。
(9)自定义组件使用
HarmonyOS处于起步阶段,最初的SDK开发包只会带有基础功能的开发,如果全部基于原生SDK进行开发,项目开发效率肯定会比传统的Android、iOS低太多,因为他们已经非常成熟,有大量优秀的开源第三方组件库,说白了现在开发一个应用就跟码积木一样。现在就需要大量优秀开发者造出各种优秀的轮子出来让大家可以更快速的开发项目。
编写一个自定义组件确实比完成一个简单的项目需求要更加有意思和成就感,即使一个非常小的组件。这就需要耐心阅读官方SDK API甚至底层代码实现了,当然现在官网文档很齐全,我在编写第一个组件的时候还是消耗了很多精力的,那个时候文档缺乏,只能看比较生涩的API文档,然后半猜半试捣鼓出来。
(10)重要特性功能引入
读完官方文档之后,发现了分布式数据通信、协同、流转等重要技术,后面就主要思考使用场景将其整合开发进去。本案例正好可以运用分布式PA和FA的互相调用,对于这个功能引用也可以完美的通过该项目案例进行整合,这种整合类的也能更考验对新知识的融会贯通。比如JS开发一个通讯录FA,然后Java开发通讯录数据服务PA,FA去获取PA中的数据即可。
5、无法解决的坑如何求助
这里着重给初学者一个忠告,不要遇到一个问题就马上求助问人,一个问题出现首先要通过查看日志进行解决,自行翻阅资料,反复尝试,错误复现手段记录,对比场景解决等措施自行想办法解决,只有经过反复尝试发现是问题的时候再来求助老师,并且求助之前能够清晰的描述问题现象。
在项目开发中发现了官方文档、工具等各种bug,做好了充分记录和证据论证,然后提交给了华为方进行求助和整改,对于缺失的关键API操作或者技术描述也能明确提出合理化诉求进行求助。
6、开发完成之后的项目复盘
- 梳理总结开发思路,主要是分析前期的思路是否存在不准确的地方;
- 梳理回顾开发过程中遇到的坑点,自己是如何一步步填坑的;
- 整理相关文档,进行归档留存;
- 整理该项目中所运用到的技术栈;
- 梳理该项目待持续改进的地方;
7、本项目所用到的相关的一些技术点
1.HarmonyOS移动应用开发工具(DevEco Studio)使用;
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.代码编程规范、设计模式;(重难点)
8、个人总结
学习没有捷径,只有依靠一腔热血和持之以恒的努力。反复跳坑填坑,多了自然触类旁通,即使刚新接触一个技术,也能快速搞定一个项目的移植,比如这个小项目案例从刚接触到一天开发完成都足够了。
学习编程切忌执着语法和API,而要注重思维锻炼,多练习多踩坑多对比多总结才是王道。
对于开发老鸟,我对快速掌握HarmonyOS开发的建议是将自己原有的项目移植,并且尽可能多融入一些技术点。
对于初学者,我建议是找到一个我这种项目贯穿式案例然后配合自己查阅官方资料进行结合学习,也会事半功倍。
应用做多了,会慢慢失去兴趣了,都是各种数据交互和UI渲染,这时强烈推荐大家去关注下操作系统层的源码啊,此时c的代码或许会看起来更亲切哦,我这里推荐的不是开发板和上层传数据这类应用开发,而是操作系统内核代码,值得一看。