失效链接处理 |
基于安卓的工作流管理系统的设计与实现 PDF 下载
本站整理下载:
提取码:4olm
相关截图:
主要内容:
2 技术背景
本章将对于系统开发过程中所使用的主要技术从Android客户端和服务器端等方面进行简要介绍,其中主要包括Android平台以及其开发环境和技术架构、OKHttp框架、Laravel框架、百度云推送等,并且结合软件开发进行相关技术的介绍。
2.1 Android 平台
2.1.1 Android 简介
Android 系统是谷歌公司主要研发的基于 Linux 的开源手机操作系统。如图2.1所示,Android 系统共分为4个层级结构,从上到下依次是应用(Application)层、应用框架(Application Framework)层、运行库(Libraries)和运行时(Android Runtime)以及 Linux 内核(Linux Kernel) 层。其中 Android 应用开发主要是依赖应用框架层,并在应用层上进行开发。
图2.1 Android 的系统结构
在Application Framework 层包含了 Android 开发的四个核心的组件,分别是 Activity、Service、Broadcast Receiver 和 Content Provider。其中 Activity 作为承载视图和主要业务逻辑的组件,在四大核心组件中使用率最高,重要性也居于四大核心组件之首。Activity 使用了模板方法模式,将其各个生命周期封装起来,供开发者在其间进行相关的自定义,其中包括了onCreate, onStart,onResume,onPause,onStop和onDestroy。其中 onCreate 方法最“重”,包含了视图创建和主要业务逻辑的定义。
2.1.2 Android 开发环境
在Android 刚发展的几年里,Android 官方最开始是通过在 Eclipse 中添加 ADT bundle 插件的形式提供给开发者的开发环境的。这样做的收益是可以吸收大部分熟悉使用 Eclipse 使用的 Java 开发人员,让 JAVA 开发者能够在熟悉的平台和语言上快速上手开发。随着 Android 开发技术的日趋成熟,一个平台级的 Android 应用甚至能够达到上百万行代码,使用 Eclipse 开发Android 应用的弊端也开始突显出来,Android 开发插件在复杂的环境中不够稳定,开发和编译效率越来越不能满足开发者的需求[6]。
在2013年夏季,Google 公司推出了 Android Studio 作为 Android 开发的专用集成开发环境。Android studio 来自于 Jet Brain 公司的著名开源项目IntelliJ,一个现代而智能的 JAVA 集成开发环境[7]。Android studio有非常多优良的特性,相比于 Eclipse,更加地稳定可靠,并且提供了 Instant Run 这个秒级的增量部署方案,极大地提高了编译效率;提供了更加准确完备的即时预览;能够即时监控应用运行时内存的变化,为解决内存泄露等问题提供了更有效率的方案;并且兼容几乎所有的 IntelliJ 插件,功能扩展非常强大[7]。
经过三年的发展,Android studio 相比于2013年刚出的预览版,已经非常成熟,成为了一个稳定可靠的 Android 主要开发环境,所以综合考量之后,我们选择 Android Studio 作为 Android 客户端开发的主要环境。
2.1.3 Android 开发技术架构
为了加快开发效率,提供系统的稳定性,需要对 Android 的各项开发技术机型选型,确定 Android 技术架构。
客户端和服务端进行交互使用 HTTP 协议。通常来说,HTTP 请求有两种方式,一是在进行 HTTP 请求时在业务逻辑中每次都编写一次相关的请求代码,并将请求结果进行处理;二是将网络请求进行单例封装,形成网络访问层,业务逻辑中需要请求时就调用单例的 HTTP 请求客户端[15]。两种方案各有优劣,前者可以对消息请求进行非常灵活的定制化,并且对结果也能进行非常灵活化的处理,但是由于这样需要多次编写相似的代码,不利于维护,适用于小型项目或者测试脚本;第二种方案在请求和响应的定制化上进行了妥协,当然,采用统一的单例模式,好处也是显而易见的,就是非常方便维护,比如对框架进行升级等等。在考虑了项目大小之后,最终决定采用第二种方式。
在对代码的封装中需要确定使用的网络请求框架,常用的网络请求框架主要有三类,一是开发包中自带的 HTTPURLConnection 框架类,二是使用封装良好的以 OKHttp 为代表的第三方网络框架,三是以Retrofit 为代表的对 OKHttp 进行封装的网络框架,这类框架主要是针对移动端而进行 RESTful 架构设计了的。开发包中带的 HTTPURLConnection 框架类的优点是稳定、高效,但是在功能性和对请求的可定制性上做得稍差一些[8]。Retrofit 一类的框架虽然使用非常方便,但是定制性并不好,对工作流 Android 端来说又太“重了”。而 OKHttp 也非常轻量级,使用代码非常简洁、高效,非常符合项目需求,所以最终选择了 OKHttp 框架作为网络框架层封装的主要技术。
以下为使用OKHttp网络框架层封装部分post方法:
1 public static String post(String url, String json) throws IOException {
2 RequestBody body = RequestBody.create(JSON, json);
3 Request request = new Request.Builder()
4 .url(url)
5 .post(body)
6 .build();
7 Response response = client.newCall(request).execute();
8 String result = response.body().string();
9 return result;
10 }
代码是对网络请求的 post 方法进行封装,作为网络请求的工具类,如代码第1行所示,使用的 static 方法,并且需要传入两个参数,一个参数是 HTTP 请求的 URL,另外一个是请求是需要提交给服务端的请求体,一段 json 格式的字符串,这个字符串中包含了客户端和服务端协议中所需要的参数。代码第2到第6行是根据用参数对请求实例进行创建。第7行进行 HTTP 网络请求,在执行 newCall 方法的时候,会创建一个网络请求的新线程,并将这个线程放在线程池中执行。第8行代码是对请求的结果进行获取,请求的结果根据协议会有一个固定的格式,所以在第9行可以将这个结果直接返回,让业务层对这个结果进行解析,并做出相应的操作。
在网络请求中,会涉及到 JSON的解析,JSON 是一种通用的数据数据交换格式,几乎所有主流语言都有对这个数据格式的解析进行了支持,Android 的主编程语言 Java 也不例外。但是,如果使用 Java 原生的库解析每次都需要编写非常繁杂的解析代码,既不利于开发,也不利于维护。所以,引入了一个常用的 JSON 解析框架 GSON。使用 GSON 进行解析的示例代码如下所示:
1 public static <T> List<T> stringToList(String json, Class<T> cls) {
2 Gson gson = new Gson();
3 List<T> list = new ArrayList<T>();
4 JsonArray array = new JsonParser().parse(json).getAsJsonArray();
5 for (final JsonElement elem : array) {
6 list.add(gson.fromJson(elem, cls));
7 }
8 return list;
9 }
这段代码是将 JSON 字符串转化为对象列表的工具方法,该方法需要传入两个参数,第一个是需要转化的 json 字符串,第二个是需要转化成的类的 Class 对象。代码第2行创建一个 Gson 对象,通过这个对象是用来转化的工具实例。第3行新建一个列表用户存储对象结果。第4到6行将GSON 解析的数据存储到列表中,第8行将列表结果返回。
在 Android 开发中,业务层获取视图实例是通过一个名为 findViewById 的方法进行的,由于页面元素过多,如果重复地编写获取视图实例的代码,无疑是非常繁琐的工作。为了避免重复的视图查找操作,引入了 Butter Knife 框架。Butter Knife 框架通过注解的方式,在编译期将视图和实例变量相绑定,既能加快代码编写速度,又不会因为运行时反射降低应用的运行速度。
总的来说,为了加快开发速度,提高系统的稳定性和可维护性,在各层次都用了以下的一些框架或者技术。在网络层,在框架 OKHttp 的基础上对网络层进行封装在;视图层使用 Butter Knife 加快编写业务逻辑层获取视图(View)实例的 速度;在网络层和业务层之间使用 GSON 对数据传输格式进行转换。
2.2 服务端
2.2.1 服务端技术选型
本课题项目的服务端需要提供客户端需要的接口,客户端通过这些接口来进行相关的数据操作和持久化存储。由于服务端的主要功能只是编写接口,在 MVC 架构中只涉及到 Model 和 Controller(客户端即为“View”)。所以需要对客户端的技术进行选型,其主要的评判标准是找出一个能够快速构建后端接口的技术。
PHP 即超文本处理器(Hypertext Preprocessor),提供给了开发人员一套快速构建动态网页的技术,是当前流行的 Web 端开发语言。PHP 程序将其程序嵌入到 HTML 标签中执行,相比于其它CGI 语言,开发速度快很多。
和 PHP 类似的还有 JSP (JAVA Server Pages),即 JAVA 在服务端的语言,作为一个简化版的 Servlet,主要用于构建动态页面。它的主要特点是使用了 HTML 的语法,将标签进行扩展,形成了 JSP 独有的标签,主要以 <% %> 标签的形式对内容进行标记,并封装页面中的业务逻辑。
另外一套是微软推出的 ASP (Active Server Pages)技术,作为服务端的动态脚本技术,它跟 JSP 比较类似,但主要用于小型和中型的 Web 应用。
JSP语言是一套非常成熟的动态页面脚本技术,在常见的 JAVA MVC 框架中充当 View 的角色,性能比较不错,但是在开发环境和生产环境的部署的便捷性上并不占优势,而且开发速度也并不占优。ASP和 JSP 的情况比较类似,不太适合轻量级的快速接口开发。而PHP 是当前非常流行的网页端脚本语言,在能够快速构建中、小型的 Web 页面,在编写服务端 HTTP 接口也有比较快速的解决方案。所以根据实际分析的轻量级和快速的需求,最终选定 PHP 作为后端开发的主要语言[9]。
在确定后端 PHP 作为后端的动态脚本需要之后,接下里就需根据语言特点和实际项目需要,对 Web 服务器进行选型。由于后端的脚本语言选择的是 PHP,于是就自然地选择业界比较经典的 LAMP 环境,即是 Linux、Apache、MySQL 和 PHP。Linux作为服务端的操作系统,是整个服务端的容器;Apache 作为 Web 服务器,对 HTTP 请求进行正确转发和处理;MySQL 是持久化存储的方案,对数据进行相关的存储;PHP 作为动态脚本语言,主要负责编写服务端业务逻辑,是服务端 HTTP 接口编写的主要语言。这个环境组合能够非常快速地构建,且各环境之间的契合度非常高。
2.2.2 服务端开发框架简介
为了快速方便地编写服务端 HTTP 接口,在选定 PHP 服务端脚本语言之后,需要选择一个匹配的框架,来进行相关的开发。现在流行的 PHP 框架有 ThinkPHP、Yii和Laravel 等等。其中 ThinkPHP 和 Yii 虽然比较流行、稳定,但是对API 接口的支持并不好,最终选择了 Laravel 作为开发 HTTP API 接口的框架。
Laravel 是目前最流行,使用率最高的 PHP 开发框架,完全符合 MVC 模式,主要用来开发 Web 页面。由于本项目只需要编写接口,只需要 Model 和 Controller 层。另外,Laravel 为 HTTP 接口的编写提供了方便,在路径以 api 开头的请求默认是无状态的,在具体实现上就是不会启用 Session 机制维持会话。在代码编写时只需要维护 api.php 和ApiController.php 这两个文件就可以了,前者是 HTTP 路由的文件,对访问的请求进行路由操作,将请求转发到对应的 ApiController.php 文件中的具体方法去执行;后者是 API 接口的具体实现文件,其中包含了一个 ApiController 方法,它的公共成员函数就是相关的接口函数[10]。
|