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