MENU

【代码札记】从零开始的安卓应用开发 - P0

April 24, 2023 • 瞎折腾

虽然我以前也尝试过开发安卓APP,但最后都没能成功。好在这一次成功了,姑且就算它是第一次吧。

我想写一个个人物品管理的APP。事情的起因源自于我时常找不到曾经买过的东西——这并非我丢三落四,而是我每年都要搬迁几次,每次搬迁都要把自己的东西打包到箱子里。然而安定下来之后,我不会一下子都把他们拿出来,如果没有用到的,那就留在箱子里,这样一来下次搬迁就不用动了。但是几次搬迁累积下来,基本上我也不知道什么东西在哪个箱子里了,尤其是之前没用到的。所以每次找东西都得挨个箱子翻找,搞得一团乱,有时候找到一般就很急躁地不想再找了。

有一天我接快递的时候看到快递盒子上面贴的面单,这无意间提醒我了:我可以在箱子上贴一个二维码,然后扫一下不就知道里面是什么了。所以我在春节期间糊了一个APP,也就是本文所介绍的APP的第一个版本。这个版本使用了我之前折腾过的喵喵机P2,通过蓝牙调用打印机在热敏标签纸上打印一个二维码,这个二维码是一个UUID,每个盒子对应这么一个UUID,然后APP提供了简单的日志功能,扫描一个UUID就可以针对这个UUID按时间顺序添加备注。这个备注相对比较自由,你可以写放进去了什么东西,里面有什么,拿出来了什么,把箱子搬到了什么地方之类的。找东西的时候直接全文搜索,找到与关键词相关的备注,继而找到与备注相关的箱子。箱子上的标签除了二维码,还有文字版的UUID方便寻找。总第来说,第一版APP构造十分简单,易用性不高,但足够使用。

第一版APP是我一边看文档一边凭感觉写的,使用了Jetpack Compose,没有XML的日子是真的爽啊!第一版的APP在代码上可谓是非常简陋了:只有一个数据库实体,一些抽象出来的类,剩下的页面逻辑就全都放在Activity里面了。那个时候的我也不知道什么MVC、MVVM这些东西,反正就硬写,能用就行。但话是这么说,虽然它在功能上满足了一个最小全功能集,但是这就好比,Java能做的事情汇编也能做,但没有人会用汇编来写复杂的业务。这个第一版也是一样。假如说你把一个物品从A箱子移动到B箱子,你就得先扫A箱子,记上我把东西拿出来了,或者删掉这个东西的备注,然后再扫B箱子,记上我把这个东西放进去了。如果期间疏忽大意了,很可能这个东西就在系统里找不到了,或者在系统里同时出现在多个箱子里,归根到底,还是没有彻底解决问题。

我对于这个APP并不满意。首先它不够实用,其次我好像也没学到什么,就是花费了时间和精力编写了一个赛博垃圾。于是我开始寻找现有的解决方案。

大部分我见到的解决方案都是针对商用场景的,比如IT资产管理或者供应链、库存管理等。对于我的需求太说,这就像是开宝马去菜市场买菜,实在是大可不必。后来我找到了两个相对合适的APP。

第一个是HouseBook,看起来这个APP是由一个独立开发者编写的。这个APP给我带来了不少启发,例如多个实体类型:房屋、位置、容器、物品,其中房屋是最顶级的单位,一个房屋可以有多个位置,一个位置下面可以有容器或物品,而一个容器里也可以有子容器。同时它也提供了一种比较方面的交互界面:容器和物品可以与二维码绑定,容器可以有名字,物品可以有固定字段,例如品牌、型号、序列号、保质期等。在搜索方面也比较方便:可以使用文字搜索相关的容器或物品,也可以直接扫描二维码搜索对应的实体。

我虽然很喜欢它的灵活性,但在物品字段方面我认为有些死板了:你只能使用应用中定死的,而不能自己新增字段。同时这个APP是付费的,需要一次性支付30USD来解锁全部功能,同时使用云同步的话,随着物品数量的增多,你可能还需要额外花钱购买云空间。不过这些都是一次性消费,没有持续订阅。

第二个APP严格来说不算是物品管理,而是一个通用的个人数据库,叫做Memento Database,背后是一个商业公司在支持和维护(至少看起来像是,也许这个公司就只有开发者一个人也说不准)。同时这个APP支持安卓、iOS和桌面版,其中桌面版是Java写的,因此支持全平台。不过要跨平台使用,就需要订阅他们的高级计划。如果只是在一台设备上使用的话,那么不订阅也是可以享受到大部分功能的。这个App以库(Library)来组织数据,以数据库的语言来说,这个库其实就是一个表。你可以在表中定义字段,但是不需要像关系型数据库那么严格——你的表甚至可以没有唯一字段(因为每一个记录有一个内部的entity id)。同时在字段类型的选择上也非常丰富:字符串、整数、小数这些就不说了,什么布尔啊货币啊时间啊,这些都比较常见。他们还提供了条码字段,可以直接扫描条码来读取其中的信息,同时还提供了列表、树、标签、外键、自定义计算(基于其他字段计算出结果),如果这些还不能满足你的话,他们还支持JavaScript脚本。可以说是非常强大了。后来经过一番探索,他们还提供了一个云API用来操作开启云同步的库和数据,这一下子可玩性就高了啊。

基于这种灵活度,我决定使用Memento Database,配合我自己开发的APP来进行操作。虽然这两个APP在输入上都提供了非常好的交互方式,但输出上面还是差了一点。虽然他们都支持扫描条码,但是条码得先打印才能扫描啊。与此同时,我受够了喵喵机的封闭,开始寻找商业化的便携打印机。这次我购买了佳博的M322便携打印机,它的打印质量非常一般(没办法打印精细图片,我尝试了调整曲线和交错打印——是的,通过控制打印机把纸倒回来,我可以分多次打印一幅画,但倒纸的精确度有待商榷——都没有得到满意的结果),只能用来打标签(毕竟人家是标签打印机,没说是热敏图片打印机),但和喵喵机不同,它具有多种传感器,也就是说我们可以使用正经的标签纸,而不是连续纸了。不过归根结底,这个打印机最最重要的一点是厂家提供技术手册:你可以使用SDK(或者和我一样自己写SDK)光明正大的和打印机交互,而不必考虑什么逆向工程之类的东西。

总之,在第二个版本中,我的思路是将数据存到Memento Database中,然后利用我的APP与之交互。大体的使用场景就是:先在我的APP中调用打印机打印条码标签,然后在Memento中添加这个标签,与盒子或物品做绑定,记录信息。需要查询的时候就直接在Memento中搜索或扫码。如果需要移动箱子或物品的话,可以在我的APP中选定好目的地位置或箱子,然后连续扫码,将扫到的物品或箱子通过API移动到目的地。这一套组合下载,堪比商用解决方案,岂不美哉?

当然了,这个系列的文章是站在事后诸葛亮的角度上写的。其实一开始我也不知道第二版应该怎么做。就是觉得第一版不够好,连我自己都不想用,那肯定是要改。第二版就参照着HouseBook和Memento Database,一边用一边找思路,最终摸索成现在的模样。

此外,由于篇幅有限,我想把这个作为一个系列来写,这一次是序言,下一次会介绍整体架构和使用的技术,如果还有篇幅的话就介绍一下数据库设计,再之后是标签设计和蓝牙打印,然后是联动Memento的API,最后说一说UI设计。

序言部分暂且先告一段落,我们下一篇文章见。

-全文完-


知识共享许可协议
【代码札记】从零开始的安卓应用开发 - P0天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://skyblond.info/about.html 处获得。

Archives QR Code
QR Code for this page
Tipping QR Code