智能记事本APP的实现与研究
2022-11-16连壮
连壮
(厦门城市职业学院 福建省厦门市 361008)
随着社会的飞速发展,数据呈现爆炸式增长,如何避免忘记工作、生活和学习中的诸多事情而造成的不良后果就显得非常重要。为此,笔者开发一款基于Android 系统的智能记事本APP,通过记事本APP 能够便携记录生活和工作的诸多事情,记录学习的知识要点,从而帮助人们有条理地进行时间管理,提升学习效率。
2021 年是中国共产党成立100 周年,习近平总书记在党史学习教育动员大会上强调,“在庆祝我们党百年华诞的重大时刻,在‘两个一百年’奋斗目标历史交汇的关键节点,在全党集中开展党史学习教育,正当其时,十分必要。[1]”2022年3 月,中共中央办公厅印发《关于推动党史学习教育常态化长效化的意见》,要求各地区各部门结合实际认真贯彻落实[2]。在此背景下,用户通过智能记事本APP 可以随时随地记录下学习党史的心得体会,同时在记事本APP 开头设计添加党史学习、庆祝建党百年等动画、在记事本界面中设计实现百年党史新闻和党史知识测试等功能,可以帮助用户更好地学习党史,推动党史学习的常态化和长效化。
1 架构分析
智能记事本APP 经过开始欢迎动画后会进入记事本界面,记事本界面主要包含内容列表、添加按钮、百年党史新闻和党史知识测试。当长按列表条目(Item)时,会弹出一个提示是否删除列表条目Item 的对话框,当点击对话框中“确定”按钮时,程序将会删除该笔记条目,当点击对话框中的“取消”按钮时,则会取消删除该条目,避免用户误操作。当点击记事本界面列表中的Item时,会跳转到修改记录界面,该界面可以查看和修改记录。当点击记事本界面中的“添加”按钮时,会跳转到添加记录界面,该界面可以添加记录内容。当点击百年党史新闻时,界面会跳转到党史百年的新闻页面,单击每个新闻列表可以阅读对应的党史新闻。当点击答题按钮,界面会跳转到党史知识测试界面,单击开始答题后即可进入答题,如果答错程序会进行提示,直到回答正确后跳转到下一题。记事本应用的系统架构如图1 所示。
图1:记事本应用系统架构图
2 功能实现与研究
智能记事本APP 采用Java 语言和Android Studio 开发工具开发,本文针对记事本APP 中如何实现APP 开始欢迎动画,如何实现存储管理大规模记录数据,如何进行网络交互访问这3 个关键功能进行深入的分析与研究。开始欢迎动画、数据库存储和网络交互访问的技术实现思路和方法也同样适用于其他APP 开发。
2.1 实现开始欢迎界面(动画)
记事本APP 的开始欢迎界面是指用户进入记事本APP之前,短暂停留在手机界面的指引性页面。欢迎界面是用户对记事本APP 的第一印象,直接关系到用户对APP 应用的整体感受[3]53,好的欢迎界面可以迅速吸引用户的注意力,提升产品的价值,能够起到很好的宣传教育作用。有些公司在欢迎界面中放置广告,以此获得收益。
在Android 系统中通常有两种动画效果的实现方式:补间动画及逐帧动画。补间动画是将View 进行图形变化来达到相应的动画效果,包括缩放、改变透明度、平移、旋转四种。逐帧动画是按照预先设置好的静态图片顺序播放,通过眼睛的“视觉暂留”原理,让人出现动画的错觉。逐帧动画的原理类似放胶片电影的原理,都是通过播放预先设置好的一组静态图片来实现[4]272。在本文描述的记事本APP 中,笔者采用补间动画实现记事本APP 的开始欢迎界面。
补间动画的效果可以通过直接编写代码的方式实现,也可以通过编写XML 文件的方式来实现,为了让逻辑业务代码和视图动画代码分离,让记事本APP 的整体代码更有条理,更清晰易懂,采用XML 文件的方式来定义动画。在Android 系统中,补间动画包含缩放动画(ScaleAnimation)、平移动画(TranslateAnimation)、旋转动画(RotateAnimation)、透明度渐变动画(AlphaAnimation)。缩放动画是通过指定动画开始时的缩放系数、结束时的缩放系数以及动画持续时长来实现。平移动画是通过指定动画的开始位置、结束位置以及动画持续时长来实现。旋转动画是通过对View 指定动画开始时的旋转角度、结束时的旋转角度以及动画播放时长来实现。透明度渐变动画主要是通过指定动画开始时View的透明度、结束时View 的透明度以及动画持续时间来实现[4]273‐274。在本文描述的记事本APP 中分别尝试采用缩放动画和透明度渐变动画实现开始欢迎界面,动画的时长设置在4000‐5000毫秒左右,两种动画各具特色,均受到用户的喜爱,取得较好的用户体验。
为实现记事本APP 的开始欢迎界面(动画),采用以下设计思路:
(1)将补间动画界面需要的图片导入到项目工程的drawable 文件夹中。
(2)在对应的布局文件XML 中,放置ImageView 等界面控件。
(3)把程序中定义动画的XML 文件存放在项目工程的anim 文件夹中。以缩放动画为例,把图片从屏幕中央由50%放大到100%。创建名为scale 的XML 文件,在该文件中通过设置缩放点的X 轴和Y 轴坐标、动画开始时在X 轴和Y 轴的缩放系数、动画结束时在X 轴和Y 轴的缩放系数、动画持续时间,动画缩放速度等属性,实现图片的缩放动画效果。此外还可以根据需求自行选择创建alpha.xml、rotate.xml 和translate.xml 等文件实现透明度渐变、旋转、平移动画效果。
(4)编写界面交互代码。通过调用AnimationUtils 类的loadAnimation()方法来加载步骤3 中定义补间动画效果的XML 文件。同时设置动画监听器,监听动画开始、结束和重复事件,在动画结束时进行界面跳转,跳转到记事本APP界面。最后通过startAnimation 方法启动动画。
界面交互代码如下(以加载缩放动画效果为例):
(5)修改AndroidManifest.xml 文件,设置动画Activity为主启动项。
实现APP 开始动画设计思路如图2 所示。缩放效果如图3 所示。
图3:开始欢迎动画(缩放效果)
2.2 实现数据库存储
在记事本APP 中需要保存数据量大、结构性复杂的笔记记录数据。如果使用文件存储或SharedPreferences存储只能保存一些简单的数据和键值对,文件存储或SharedPreferences 存储很难存储大量复杂的关系型记录数据,为此采用Android 系统内置的SQLite 数据库。SQLite是由D.Richard Hipp 用C 语言开发的一款轻量级别的关系型数据库,只需很少的存储空间而且响应快速,一般只占用约220KB 的存储空间,由于手机等设备存储空间有限,所以选择使用SQLite 数据库非常合适。虽然SQLite 占用空间小,但它能使用SQL 语句在同一时间内管理高达4TB 的数据,并使用B‐Tree 存储数据[5]8。SQLite 支持事务管理、视图创建、内外嵌套查询、多重条件组合查询、约束检测和处理外键在内的ANSI SQL92 标准大子集,且SQLite 的API 设计简单易懂,所以使用者可以很快学会使用SQLite。SQLite 具备小型、快速、简单、安全和高可靠等特点,同时SQLite 不用配置、能够单独运行、具备事务管理能力,是当今世界上运用最多的嵌入式SQL 数据库引擎[5]8。在记事本APP 中使用了SQLite 这种功能强大的数据库,能够显著提升管理数据记录的性能。
2.2.1 数据库的创建
Android 系统中有一个SQLiteOpenHelper 类,通过SQLiteOpenHelper 类可以方便地对记事本APP 数据库进行创建和升级。由于SQLiteOpenHelper 是抽象类,要创建一个类去继承SQLiteOpenHelper 类,并且重写该类中的onCreate()方法和onUpgrade()方法。onCreate()方法是在记事本APP 数据库第1 次创建时调用,该方法通常用于初始化表结构。onUpgrade()方法在遇到未来记事本APP数据库变更升级时通过增加数据库版本号进行调用,如果版本号不增加则该方法不调用。创建或打开一个现有的数据库是通过SQLiteOpenHelper 的getReadableDatabase()和getWritableDatabase()两个实例方法来实现的,这两个实例方法都可以返回能实现数据库读写操作的对象。但getWritableDatabase()在数据库不能写入时会抛出异常,而getReadableDatabase()方法返回的对象能以只读的方式打开数据库[6]345。
2.2.2 数据的添加、修改、删除操作
SQLiteOpenHelper 创建和升级数据库是通过getReadableDatabase()或getWritableDatabase()方法实现,而且会返回一个SQLiteDatabase 对象,通个这个对象可以对记事本记录数据进行添加、修改、删除、查询等操作[6]354。
在SQLiteDatabase 中有一个insert()方法,可用于在记事本APP 中添加数据。insert()方法接收3 个参数:第一个参数是要添加记录的记事本APP 数据表名称。第二个参数用于在未指定添加数据的情况下给某些可以为空的列自动赋值NULL。第三个参数为ContentValues 对象,ContentValues类相当于Map 类,可以通过键值对的形式存入数据,这里的key 表示插入数据的列名,value 表示要插入的数据。
在添加完数据后,如何才能修改记事本APP 表中已有的数据。SQLiteDatabase 中提供了一个十分好用的update()方法,这个方法是对记事本中的数据表记录进行更新。update()方法接收4 个参数,第一个参数表示数据库表的名称,第二个参数是要更新的数据。第三个参数表示要更新修改数据的查询条件。第四个参数表示查询条件的参数。
SQLiteDatabase 中同样也提供了delete 方法,专门用于删除数据。delete()方法可接收3 个参数,第一个参数是记事本APP 对应数据库的表名,第二、第三个参数用于指定删除什么数据,如果没有指定则默认会删除对应表中的所有数据[6]360。
2.2.3 数据的查询操作
在记事本APP 中“增删改”只是其中的一小部分功能,使用最多的功能就是查询数据,例如记事本的记录列表查看和某一记录笔记的详细内容查看,同时查询数据也是比较复杂的一种操作。进行数据查询的时候使用的是SQLiteDatabase 提供的query()方法,该方法返回的是一个行数集合Cursor,Cursor 是一个游标接口,提供遍历查询的方法。需要注意的是,使用完Curesor 对象后,需要及时关闭,否则会造成内存泄露。query()方法包含7 个参数,第1个参数表示记事本APP 表名称,第2 个参数表示查询的列名,第3 个参数表示的是接收查询条件的子句,第4 个参数表示接收查询子句对应的条件值,第5 个参数表示分组方式,第6 个参数接收having 条件,第7 个参数表示排序方式[4]125,通过设定对应字段的排序方式,可以轻松实现记事本记录按ID 或编辑时间升序或降序展示。
2.3 实现网络交互访问
2.3.1 WebView 控件访问互联网资源
21世纪是互联网的时代,如果记事本APP 不能够利用互联网资源,那么用户一定会感到枯燥乏味。在记事本APP 中希望能够展示一些百年党史新闻网页或党史知识测试网页,但加载和显示网页通常是浏览器的任务,如果在使用记事本APP 中需要用户打开系统浏览器则会影响用户体验,开发人员自己去编写浏览器则开发成本太高。笔者选择采用WebView 来实现这一功能,WebView 控件不仅可以指定URL,还可以加载并执行HTML 代码,同时还能支持JavaScript,通过该控件可以轻松展示各种各样的网页。
WebView 类是由Android 系统中View 类扩展而来的,可以将WebView 类添加到对应的布局中,显示特定的网页内容,WebView 不会显示出地址栏或导航栏,只呈现所需要的网页内容[7]11。通过WebView 的getSettings()方法可以设置一些浏览器的属性,在记事本APP 中党史知识测试H5 网页需要支持JavaScript 脚本和使用localStorage,否则网页无法正常显示。因此调用setJavaScriptEnabled()方法和setDomStorageEnabled() 方法,让WebView 支持JavaScript脚本和DOM 缓存,程序代码如下:
在记事本APP 中,遇到一个网页变换到其他网页时,用户希望不打开浏览器,仍然在当前WebView 中显示目标网页,那么可以使用WebView 的setWebViewClient()方法,并传递一个WebViewClient 的实例。最后调用WebView 的loadUrl()方法,并将网址传入,即可展示相应的网页内容[6]507。
最后记事本APP 通过互联网访问资源,需要在Android Manifest.xml 文件中加入网络权限声明[8]43,否则应用程序会出现无法访问互联网资源的情况。
2.3.2 Retrofit 框架实现网络数据交互解析
此外,能源行业效益、效率获得总体改善。前8个月,利润总额同比增长25.1%,占工业企业的17.8%,比去年同期提高5个百分点。前三季度,全国发电设备利用率结束连续6年下降的局面,发电设备利用小时比去年同期增加94个小时。
WebView 控件能够方便访问互联网资源,但这种交互通常是单向的。如果记事本应用中需要与后台远程服务器进行双向交互通信,比如实现注册、登录和数据备份等功能,并且能够将服务器返回的JSON 数据自动解析成对象,这就需要用到Retrofit 网络库。Retrofit 是Square 公司在OkHttp 的基础上进一步开发出来的应用层网络通信库,能够让开发者以更加面向对象的思维进行网络操作。OkHttp 侧重的是底层通信的实现,Retrofit 侧重上层接口的封装,Retrofit 是当前Android 开发中最流行的网络请求框架。Android 应用程序通过Retrofit 框架与远程服务器交互通信时,Android 应用程序首先向Retrofit 接口层提出网络请求,Retrofit 封装网络请求头部、网络请求参数、Url 等信息,之后 OkHttp 处理后续的网络请求,并从服务端获得返回数据,OkHttp 将原始结果传递给Retrofit,Retrofit 根据之前设定好的格式进行解析[9]9。
记事本APP 使用Retrofit 框架与远程服务器进行交互通信的基本用法如下:
(1)添加软件依赖包。在app/build.gradle 文件中添加Retrofit 所需要的依赖包,添加Retrofit 和Retrofit 转换库到dependencies 闭包中。由于Retrofit 是在OkHttp 的基础上开发的,所以无需额外再添加OkHttp 库。Retrofit 转换库使用GSON 解析JSON 数据,因此不用再添加GSON 库。
(2)创建实体类。从服务器端返回的数据经过Retrofit转换器转换后为JSON 格式,需要创建对应的实体类进行接收。
(3)创建RetrofitUtil 工具类。在工具类里面定义基础URL,定义Retrofit 对象和OkHttpClient 对象。在OkHttpClient 对象中设置连接超时参数和拦截器,并在拦截器中设置token 鉴权参数。设置好OkHttpClient 对象后作为参数传入Retrofit 对象的client 属性中,并根据需要设置Retrofit 对象的格式转换器。最后将RetrofitUtil 设置成单例模式,生成唯一实例。
(5)封装客户端访问程序。创建RetrofitClient 类实现Retrofit 框架的Callback 接口并重写onResponse 和onFailure方法。在对应的构造函数里面通过RetrofitUtil 实例传入IService 接口实例,在RetrofitClient 类里面定义GET、POST、PUT 等方法,在方法里面传入URL、网络请求数据等参数,当调用GET、POST 等方法时返回Call<>对象,再调用enqueue()方法,Retrofit 框架会发起网络异步请求,服务器响应的数据会在enqueue()方法中Callback 里面实现[10]83‐84。
通过Retrofit 框架可以方便实现与远程服务器进行数据交互并对返回的数据进行解析,能够让记事本APP 在互联网时代更加智能。
3 结语
本文分析和研究了实现智能记事本APP 开始欢迎界面的思路、方法及关键代码,使用缩放动画和透明度渐变动画实现APP 的开始欢迎界面,分析通过SQLite 数据库管理记事本APP 的记录数据,研究数据库如何创建以及如何对数据进行增删查改操作,分析如何使用WebView 控件,实现访问百年党史新闻、党史知识测试等互联网资源,使用Retrofit 网络框架与远端服务器进行交互解析,取得了较好的用户体验,其实现思路和方法也可适用于其他APP 开发。该智能记事本APP 不但可以帮助用户便捷记录生活、工作和学习中的诸多事情,帮助人们有条理地进行时间管理,而且可以有助于用户随时随地记录下学习党史的心得体会,帮助用户更好地学习党史知识。