system: [SYSTEM]

user: 3. 软件设计详细 3.1. 登录模块 由于管理端发布的任务都是与用户相关联的，如果未登录的话，就无法领取相关联的任务，这也体现了这个系统的完整性和封闭性。为了方便用户的使用和操作，这里实现了自动登录和保持登录的功能，避免了用户在退出后需要重复登录的问题。 SharedPreferences是Android平台上一个轻量级的存储类，主要是保存一些常用的配置参数，它是采用xml文件存放数据的，文件存放在/data/data /shared_prefs目录下。本课题中，将用户名和密码保存在一个单例中，每次进入APP，将这些信息保存在Application中，程序每次运行时，会创建一个Application类的对象，用来存储相关的全局变量，实现自动登录。要切换用户的时候，点击退出登录，清除SharedPreferences中的数据。 3.2. 任务显示 任务显示使用的是SortableTableView。它是一个可排序的表格控件，主要包括了一个简单的TableView以及更高级的SortableTableView。使用该控件可将任务按照任务编号、时间和紧急程度信息显示给用户，方便用户领取任务。在显示过程中，需要填写任务信息，需要自定义实现TableDataAdapter，将对应的数据写入table cell中。设置Header视图的数据跟设置table cell一样，同样是继承TableHeaderAdapter来实现对应方法。通过设置comparater，SortableTableView将自动在列的header旁边显示一个可以排序的指示图标。点击这个header，table将按照给定的Comparator升序排列，如果header再次被点击将按照降序排列。 3.3. 地图服务的应用 3.3.1. 百度地图 本课题选用的是百度地图提供地图服务。从信息含量上看，百度地图的城市地理信息更详细，资料较新。同时，百度地图对于开发者很友好，接口全面针对手机开发的应用场景提供了两套解决方案。一种是原生的内嵌SDK形式，还有html5轻量级的解决方案(JavaScript API极速版)。坐标数据管理提供了LBS云，技术支持非常不错，功能比较全面，可以满足本课题的需求。 百度地图API是一套为开发者免费提供的基于百度地图的应用程序接口，包括JavaScript、iOS、Andriod等多种版本，提供基本地图、位置搜索、路线规划等数据服务 [ 2 ] 。百度地图为开发者提供了com.baidu.mapapi.map地图包，主要负责控制地图的显示，下面是本系统开发中用到几个主要的类 [ 3 ] ： MapView：显示地图的View，当被焦点选中时，它能捕获按键事件和触摸手势去平移和缩放地图。它和Button等控件定义类似，通过findViewById方法获取，建立类文件时继承Activity即可。 MapController：地图控制器，用于控制地图的移动，放大，缩小等功能。MapView调用函数MapView.getController()获取MapController实例。 Overlay：覆盖物，即在百度地图上进行二次开发时添加的图层类，可以设置在地图上显示图标，文字等信息，通过在底层地图上添加图层来满足我们的应用需求。Overlay是一个基类，它表示可以显示在地图上方的覆盖物。 3.3.2. 定位功能的实现 手机地图定位是获取用户当前位置信息，并将手机或移动端用户位置信息在手机上标识出来的技术和服务，是一种基于位置的服务(Location Based Server)。它利用移动网络的基站群、手机终端以及手机自带的定位设备，获取手机用户当前的位置信息(经纬度、坐标等)，并将这些信息提供给用户。本功能的实现依赖百度地图的定位SDK，包括Location (定位SDK核心类)、LocationClientOption (用于设置定位SDK的各个配置参数)、BDLocation (封装定位SDK的定位结果)、BDLocationListener (定位请求回调接口)等。关键步骤如下： ① 初始化LocationClient类。该类必须在主线程中声明，需要Context类型的参数； ② 配置定位SDK的参数。设置定位啊参数包括：定位模式(高精度定位模式、低功耗定位模式、仅设备定位模式)，返回坐标类型，是否开启GPS，是否返回地址信息等。主要通过setLocationMode方法、setCoorType方法、setIsNeedAddress方法和setOpenGPS方法实现的。 ③ 实现BDLocationListener接口。在BDLocationListener接口中，OnReceiveLocation方法需要实现，它接收异步返回的定位结果，参数类型是BDLocation类型参数。 ④ 通过LocationClient实例的start方法开启定位 [ 4 ] 。 3.3.3. 围栏的建立与地理位置验证 地理围栏服务提供的是基于位置的提醒服务，相对于SDK原来踢动的位置提醒功能，地理围栏服务通过SDK本身的内部逻辑，大幅度降低了位置提醒服务的功耗情况，GeofenceClient是地理围栏的核心类。但是现阶段的百度地图提供的围栏服务只支持圆形且半径在500 m以内的围栏。本课题需要查灭螺的区域大部分都是不规则的，因此我们需要自己去定制实现围栏功能。 目前百度地图SDK支持多种类型的覆盖物，可以满足用户的各种需求。用户可根据自己的实际需求自由添加各种类型的覆盖物，且不会产生冲突。从API中可以看到，baiduMap类有一个抽象类Overlay，我们可以通过实例化它的子类CircleOptions (圆形覆盖物选型类)、PolygonOptions (多边形选型类)来实现圆形围栏和多边形的围栏。 在新建的围栏的基础之上，通过BDLocationListener中返回的当前点的坐标，判断是否进入围栏，来实现位置的校验。由于地图自带的围栏是有判断是否进入围栏的接口，在这里，我们模拟地图提供的围栏的功能，在知道围栏坐标和当前位置的情况下，判断点是否在多边形内，来判断当前位置，从而实现了位置预警功能。 3.4. 数据存储 Android 提供了四种数据存储方式：SharedPreferences、File、Content-Provider、SQLite。由于SQLite 不像Oracle、MySQL那样需要安装，启动，它只是一个文件，并且支持绝大多数的SQL语句，通过execSQL (String sql)方法就可以执行SQL语句。在本次应用开发中，选择SQLite来存储数据 [ 5 ] 。 SQLite 数据库SQLite数据库是一个嵌入式关系型数据库，具有小型、开放的特点，由Android提供，主要用于结构化的数据存取，支持SQL语句。目前他的应用非常广泛，不仅支持Windows/Unix/Linux等主流的操作系统，还支持PHP，JAVA多种程序语言。SQLite占用资源少，并发处理线程，非常适合在手机上使用。 在该课题中，SQLIte用来存储任务数据，防止反复向服务器请求数据，消耗流量。 3.5. HTTP通信 移动客户端所推送或获取的内容主要分为两种：文本和文件。但无论是文本还是文件就，都必须按照HTTP的规范进行编码，即HTTP实体。在HTTP客户端通信方面，Android平台引入了Apache HttpClient包，并在其基础上进行了扩展。手机移动客户端通信要做的内容可以归纳为三步：第一步，将推送内容或请求参数按照适用的HTTP实体进行编码；第二步，执行HTTP Client的方法将HTTP实体内容传送给服务端；第三步，从服务端返回的实体中获取执行结果 [ 6 ] 。图3为http协议的业务流程。 3.6. 基于JSON的数据通信过程 JSON是一种轻量级的数据交换格式，是基于EcmaScript的一个子集。JSON采用完全独立于语言的文本格式 [ 7 ] 。JSON采用两种结构： (1) “名称/值”对的集合，“名称/值”可以表示对象的属性，对象其实就是属性的集合，所以这个结构可以用来表示对象。 (2) 值得有序列表，可以表示对象的集合，因此JSON能够描述一个复杂的对象的集合，同时JSON易于阅读和编写，也易于机器的解析和生成。 在Android中已经内置了JSON格式处理的相关的类，这也大大简化了JSON在它们之间的数据通信程序设计。JSON是XML的子集，较之更小、更快，更易解析。 Android要访问远程MySQL数据库，先要利用HTTP协议发送Request请求给后台Java服务器，Java服务器端根据请求访问MySQL数据库，并把读取的数据库内容或对客户端的响应封装成JSON格式，通过HTTP协议回传给Android端，Android端再对JSON解析，并进行相关的UI处理。图4即信息获取和推送交互示意图。