勤拂拭软件出品,必属精品 : 勤拂拭软件

去年做了一个类似于我的朋友圈的项目,主要功能就是用户可以实时发表自己的动态,好友可以评论点赞什么的,可以建群,聊天啊,拉黑啊,反正是一个不错的社交软件,包含服务端和客户端,服务端是jsp,客户端不用说当然是android啦。

先上几张图涨涨眼球:

废话不多说,直接上设计(也就是当时的论文,我这个人比较懒,直接粘贴过来了,不过文字好粘贴,图片可是太难弄了,一张一张的 ,,呜呜呜。。。。):

安卓交互软件-微圈的设计与实现

摘要

我们己经迈进移动互联网时代,手机己经成为了我们不可或缺的工具。手机客户端也迎来井喷发展期,现在只要是有点规模的学校或组织都希望能有一个属于自己的手机应用来达到他们的盈利、宣传等目的。因为手机的便携性,安装在手机上的手机应用的使用频率很高,同时它的卸载率也比电脑上的应用要高,因此,设计并实现一个用户满意度高、使用方便的手机应用对学校来说颇为重要。

本文结合本实验室与学校合作的实际项目,设计并开发了一款基于安卓的移动客户端系统,包括手机应用以及相应的服务器端接口的开发。根据学校的提出的实际需求,我们进行了需求分析并进行了模块划分与开发流程的设计,模块划分为:登录注册模块、朋友圈模块、扫描二维码模块和客服公告模块,每一个模块都对应一个或几个服务器端接口,服务器端接口使用JAVA语言实现,运行环境使用了Tomcat,数据库使用的是开源的MySQL。本文主要完成的工作有:安卓应用软件界面设计、安卓应用软件各个功能模块的开发、数据库的设计服务器端接口的设计与实现。本文介绍了各个模块的实现方法,利用流程图和关键代码的方式对各个功能模块进行了详细说明,针对比较有代表性的模块,例如登录注册模块和朋友圈模块,进行了比较详细的介绍,同时针对模块中比较重要的功能,例如,上拉刷新,下拉加载更多,双击退出应用程序等功能,进行了比较详细的讲解,包括它们的实现原理以及关键代码实现细节。本文设计了手机端软件和服务器端的框架,具有良好的扩展性和通用性,能够比较低成本的快速的进行二次开发。我们介绍客户端软件时,因为各个功能模块相对比较独立,我们介绍的比较详细,对服务器端各个接口的设计与实现只详细介绍了一下登录注册模块对应的接口实现,因为各个接口的设计与实现的思路大体相差不多,针对数据库的设计我们只重点介绍了最终的所有表的结构和数据类型,因为篇幅和重要度相比其他稍低等原因,我们对它的具体中间设计细节没有进行更多的讲解。

最后对系统的每个功能模块和用户界面分别进行了测试,尽可能发现系统的问题并进步完善系统。在开发的末期,我们开发人员己经进行了白盒测试,自己感觉没有问题后找了几个未参与开发的同学们从用户的角度进行了黑盒测试。目前本移动客户端软件系统己经被某学校实际使用中,系统的使用反馈良好,能够较好的满足学校和用户的使用需求。

关键词: 安卓,移动客户端,服务器端接口,朋友圈,系统开发

第1章绪论

1.1课题的研究背景与意义

本课题根据某学校提出的具体需求研究了移动客户端系统的整体设计与实现,包括手机客户端的界面设计,功能设计,功能实现与对应的服务器端的接口设计与实现。

1.1.1国内外移动客户端发展现状

随着移动终端市场的发展以及人们对移动手机依赖性的提高,用户对安装在手机的各类应用的需求也愈发旺盛。手机应用之间的竞争越来越激烈,只有那些提供更加友好的界面,并且能够满足用户的使用需求的应用软件才能存活下来。移动客户端一般要依托服务器才能正常运行,在手机上更加方便的完成一些互联网需求,例如国外的NBA视频客户端和国内的阿里巴巴手机客户端。

近年来,智能手机快速发展,移动互联网业务不断发展。人们己经习惯于利用手机完成各种以前需要在电脑上完成的任务,例如网上购物,使用手机客户端进行网上购物的用户规模逐年上升,大有超过使用电脑网上购物的用户规模的趋势。本文以实际的学校移动项目为背景,对安卓移动软件的一般架构设计及其中的关键技术进行了深入探讨。

1.1.2国内外移动应用软件开发情况

对手机软件编程人员来说,比较关心的是什么样的手机系统更有市场,什么样的手机系统拥有更多用户。当今,占有绝大部分移动操作系统平台市场份额的有苹果学校的IOS,谷歌学校的Android及微软学校的Windows Mobile 。从2009年以来,Android操作系统成为了开发者最受欢迎的系统,因为其开源性的特点,开发安卓应用程序软件具有很好的市场价值,同时安卓系统的手机也被众多国内外手机厂商青睐,例如国外的三星和国内的华为、中兴、小米等。

安卓开发的另一个特点是它大部分只需要使用JAVA开发语言就可以,一部分涉及底层的需要通过JNI使用C/C++语言生成库文件被使用,这使得开发人员很容易就可以熟悉它的开发流程,安卓系统是一个完全开放的平台,可以完全接纳第三方软件,开发者可以利用网上众多的开源代码,开发出自己需要的应用,使得开发者拥有了前所未有的自由发挥空间,Android这几年井喷之势和它的迅速占领市场离不开它的开源性和免费的服务平台。

1.2 课题任务

1.2.1课题意义

如今,3G, 4G网络正在全国范围内快速普及,手机产品也正在经历着变革似的快速发展,手机所能完成的任务也越来越多,例如,听歌、看电影、网上购物和在线支付等,手机的硬件,例如屏幕、CPU, GPU等,更新换代迅速,因此手机软件研发的快速跟进是形势所趋。随着Android平台的市场份额逐渐攀升,安卓系统下的应用程序的数量和质量都在发生着日新月异的变化。因为安卓开源性的缘故,安卓手机开发人员相比其它系统来说可以更加快捷的开发手机应用,开发者可以利用他人公布出来的成果,也可以利用自己以前开发的成果进行新的开发,这使得手机的开发更为灵活,工作量大大的减小了,同时用户在这款开放性的平台上可以最大限度的设计和实现自己想要实现的功能。

和前些年每个学校或组织都需要一个有自己特色的网站一样,进入移动互联网时代后,现在的学校和组织非常热衷于拥有一款专门为自己学校订制的安卓应用,来达到宣传或者其它一些目的。设计并实现一套扩展性和方便二次开发的移动客户端软件系统拥有巨大的潜力,现在各大学校都有了功能和性能比较完善的安卓应用,例如腾讯QQ手机客户端、淘宝客户端,但是普通学校的移动客户端还并没有普及,为了弥补安卓客户端的这一短板,我们依托某学校的实际项目,设计并开发一款扩展性良好,可以用于二次开发的安卓客户端应用系统。

1.2.2本人承担的任务

在客户端应用系统的开发过程中,本人承担了如下几部分工作:

(1)与学校人员协商并制定了需求分析并完成了需求详细文档的编写;

(2)独立完成了功能模块的划分和服务器接口的设计;

(3)全程参与了客户端各个阶段的代码开发与界面设计工作;

(4)主导并参与了应用系统的各个模块的测试工作;

(5)总结分析出应用系统的一些BUG并进行了修正。

1.3论文结构

本文主要分为六章内容:

第1章绪论。系统地介绍了本文所涉及的开发技术基础知识、本客户端系统开发的目的和意义,最后介绍了本人在整个开发过程中所做的主要工作。

第2章介绍了安卓客户端系统开发相关技术。详细说明了重点技术知识点,包括它的实现原理与应用场景,介绍了安卓操作系统的发展背景、安卓总体框架的层次设计与安排以及安卓开发过程必须要用到的重要知识点。

第3章移动客户端软件系统的需求分析。说明了整个客户端系统的需求,包括手机客户端与服务器端接口,认真分析了这些需求后制订了一系列整个系统的开发步骤。总结并画出了开发过程流程图,明确了移动客户端软件的各个模块所需要完成的功能。

第4章移动客户端软件系统的设计与实现。根据划分好的各个模块,明确了各个模块的开发流程,设计了各个模块的实现流程图、进行了相关的服务器端数据库设计与服务器端接口的设计,完成了各个功能模块的开发工作,详细介绍了重点模块的开发细节和重点服务器端接口的实现过程。

第_5章移动客户端软件测试。介绍了测试平台的硬件和软件环境,对移动客户端系统进行了实际运行测试,得到了测试结果。

第6章是结束语。对论文进行了工作总结,说明了本文所取得的成果,系统的介绍了本文所完成的工作并展望了进一步可能研究的内容。

第2章安卓客户端系统开发相关技术介绍

2.1安卓操作系统相关背景

Android是一款基于Linux平台的操作系统「,它是Google学校于2007年11月5日公开发布的。该平台由四部分组成:应用、界面、操作系统和中间控件,是针对移动终端开发出的一款开放式平台,由于其使用了Linux内核,软件移植将大大降低难度。底层采用Linux内核提供系统的基本功能,应用软件开发发布的规则非常简单,没有采取像苹果学校那样的相对严格的条例,允许各个开发学校或者是个人自行进行研发,开发应用程序的语言可以用Java或者利用JNI使用C/C++进行编写本地代码。Android开发平台和其他平台相比具有明显的优势圈:

(1)     开放性:开放性是Android系统相比其它系统来说最吸引人的特征。Android系统所具有的开放性可以让很多的手机制造厂商和个人加入Android平台生态圈中,这样,手机在Android系统的支持下,硬件飞速发展,应用迅速增多,用户越来越多,应用程序的功能越来越新颖, Android系统近年的飞速发展己经使它成为成熟的开放性平台。

(2)     不被运营商所限制:Android在国内上市并普及后,手机上网用户能够简单方便快捷地通过安卓应用连接到互联网,大大降低了通信运营商对它的限制。并且随着W IFI上网热点越来越多,移动通信网络的普及与升级,使用户可以通过手机应用享受更多互联网服务。

(3)     丰富的硬件选择:安卓系统具有开放性这一优势促使众多手机开发商都来开发安卓系统手机,这也直接促进了一大批手机厂商的发展,例如国内的华为、中兴、小米等。手机硬件因此快速发展,例如高通处理器的更新换代,手机屏幕的发展等,最近,连PC处理器的巨头Intel也积极的专门为手机研发多款处理器。目前手机的硬件己经达到了前所未有的水准,用户也体验到了更多高质量的服务。

(4)     开发商不再受到制约:Android平台拥有的开放特性提供了公平自由的环境,手机厂商不会因为自己规模的大小等原因而受到任何不公平待遇。这使得手机厂商踊跃加入,也催生了一些新生厂家,例如国内的小米学校。各式各样的软件也如雨后春笋一般地出现。虽然过于开放性的特点使得一些不健康应用,例如,色情、暴力、恶意软件等,无法从源头上制约,但可以通过发布平台的严格审核来制约。

(5)     与Google应用程序的兼容:Google学校是互联网行业的巨头,Google的业务范围己经不仅仅限于网络搜索方面,还包括很多其它业务,例如,Gmail邮箱、云计算、地图等。Google旗下的一系列优秀的软件己经拥有了全球很大的用户群。Google发布了Android }  Google平台的绝大部分软件都有安卓版本,能够在安卓平台上安装,给用户提供了极大的便利条件[6]。

2.2安卓系统架构框架

本节介绍了安卓系统的总体框架。Android总体架构如图2.1所示,从图中我们可以看到,android系统的架构设计为分层模式,从上到下一共分为四层。核心操作系统底层、系统支持库层、安卓应用框架层以及应用和小部件层。

2.2.1安卓软件开发相关技术

核心操作系统底层:该层主要负责系统相关的最基本的功能,例如内在管理、系统安全相关、电源驱动管理以及一些重要硬件的底层驱动软件等。Android的核心操作系统底层为Linux核心,Android底层还需要为手机等移动端设备中的各个模块编写特有的驱动程序来做支持。因此操作系统层包括Linux核心和驱动程序两大部分。

系统支持库层:该层为Android系统的中间件层,该层有库和安卓系统所需要的运行环境组成。跟以前非Android系统移动设备的嵌入式系统比较,Android的这一层显得比较清晰明了。本层通过C语言的标准库来实现,是整个Android系统中最底层的库,可以被上层调用。这层包括Media Framework,  SQLite,OpenGL,  FreeType,  WebKit等。

在Android中,拥有各种功能的库和移动设备的系统平台关系紧密,这些各种功能库利用中间插件共同工作发挥巨大的作用。Android最初设计时就强调用户体验的优先性高于手机性能,这种理念当时是颠覆性的,不过时间和结果证明了这个理念的正确性。硬件一直在飞速发展,有些关键硬件甚至一直保持着摩尔定律,随着硬件性能的飞速增长,手机性能己经远远高于最初的设备性能,达到了系统性能和用户体验的共赢。

应用框架层(Framework Application):

应用程序的框架主要功能和目的是为开发者提供服务。一些包含各种用户界面程序的控件就处在这层当中,例如,列表(List)、栅格(grids)等。开发人员在开发应用程序的时候,组件可以在应用程序之间被相互调用,这个特性使得应用开发可以更加省时省力。例如,应用程序需要显示一个可以显示待办事件功能组件,而另一个应用程序己经开发了具有此功能的组件,并对外发布了此组件,开发者可以直接调用该组件而不用再重复开发。关于组件的功能以及他们的作用原理将会在下一节进行详细介绍。

应用和小部件层:

该层包括自己开发的或者系统自带的应用界面以及应用的所有功能。这层是和使用用户打交道的,因此也十分重要。一般说,一个程序的应用层开发不仅会使用JAVA语言来完成,还一部分是用JNI来使用C/C++来完成,这一部分生成动态链接库以便被JAVA层使用,最后编译通过后会在Ecfipse中自动生成

安卓安装包,也就是我们熟悉的APK文件,这个APK可以签名后直接发布。Android系统直接提供了很多基本的应用程序,如主屏幕(Home),短信息(Messago),拨号((C all)等等,除此之外开发者还可以利用该层提供的其它应用接口开发出自己的程序,例如UC浏览器等。原生Android系统一般内置Google的应用框架,所有新开发的程序也会处于这一层,如Google本身具有的同步功能、Email、地图和程序员开发的手机QQ、搜狗输入法等应用软件。

2.2.2基于组件的开发

比较重要的四大组件包括:Activity, Broadcast, lntent Receiver , Service,ontent provider。接下来的内容我们主要介绍一下它们的基本原理。

Activity(活动):

Activity是一种可视化用户活动界面。它是我们应用程序的主要组成部分,一些实现代码就是以Activity的形式向用户展示的,它包含界面部分和代码实现部分,界面部分与代码部分分离开来,在代码部分直接选择显示那个界面,代码部分还可以完成所有我们想要完成的功能,例如显示图片功能、拨打电话功能、地图定位功能等等。Activity我们可以看成是一种可编程的用户界面,用户通过在用户界面触摸、点击等发出操作信息,在Activity代码中可以监听并接收这些信号以执行用户所请求的操作。例如,点击按钮跳转到另一个界面,显示图片,向指定联系人拨打电话等。任意一个Activity都可以单独实现自己的功能,多个Activity可以互相建立起联系,最终一个应用整体是通过一个或多个以Activity为基类的子类来具体实现应用的各个模块功能的。Activity的生命周期对于完全理解Activity的使用方法是至关重要的,Activity生命周期图如图2.2所示:

Broadcast lntent Receiver(广播):

Broadcast Intent Receive:的功能是接收各种己经发布广播,并且可以发送广播。例如,在音乐播放器应用中,音频文件播放完成后,该功能模块发送广播,其它所有关联它的组件或功能模块会接收到它所发送的广播,接收到后自动进行相关的方法,在这个方法中可以进行任何想要完成的代码,一个应用不仅仅可以拥有一个广播,可以有多个广播接收器来同时接收多个不同功能类型的广播。每个接收器都必须要继承于BroadcastReceiver类。例如本文中客户端实现双击退出应用程序功能时就用到了广播,该内容会在后面的章节详细介绍

Service(服务):

Service组件和Activity类似,也是完成一些开发者想要完成的功能,唯一的区别在Service一般不关心界面是如何的,也就是它只完成功能,不完成界面的绘制,它总是长时间的在后台运行,完成需要在后台操作的功能。Service的生命周期包括三个过程:服务创建、服务开启和服务销毁。Service分为两种类型:本地服务和远程服务,前者用于应用内部,后者主要用于安卓系统内部的应用之间。其进程模型是可以配置的,这个组件运行在同一进程中还是不同进程下都是可以的,完全取决于调用方和发布方的决定,当服务和服务调用者不在同一个进程的话就需要部署一些通信机制来保证它们之前的通信畅通。

Content Provider(内容供给者):

Content Provider主要功能是提供数据等内容给应用程序,使用这个组件时,开发人员需要定义一个继承自Content Provider基类的自定义类并实例化,然后所有的操作都得使用这个实例化对象来完成,不能直接调用,这个对象在调用内容的时候与内容供给者通过数据相互传输形成会话,相互协作完成相应的功能。

2.2.3存在于各组件间调用过程

Android的系统模块架构是以组件部分为基础的「。Intent(意图)对组件来说是非常重要的,它可以看成是组件之前沟通交流的桥梁,也可以看成是连接组件的桥梁。Intent Filter是为了Intent而设计,它的功能是组件反馈自己能响应或处理哪些Intent请求行为或请求数据。下面将介绍Intent, Intent-Filte:和组件之间的关系以及它们相互影响工作的原理。Intent(意图)可以使用Context.StartActivity()或者Activity.sta}tActivityForResult()来启动指定的Activity(活动),一般是通过活动的类名来启动,被启动的活动可以调用getIntent()来获取启动者的Intent。启动者和被启动的活动可以通过putExtra()和getIntent().getStringExtra()等方法进行界面之间的参数传递;Intent的应用非常广泛,例如,从一个应用界面跳转到另一个应用界面,只需要使用Context.StartActivity()然后指定要启动的活动的类名就可以了。Intent对象还常用于发送接收广播时的情形,例如在应用接收广播后会自动调用广播类的onReceive0方法去执行,这时Intent对象也会传递过来。Intent Filte:即意图过滤器,它是用来描述期望能够响应什么的Intent过滤,通过这个设计模式,所有的组件都通过系统核心模块来进行中转,组件之间可以经过Intent  Filte:过滤后再接触,不需要直接接触,使结构更加清晰。多个Intent Filte:构成一个不同的响应能力集合来完成为意图提供多个过滤。在没有定义任何Intent Filte:的情况下,Intents在激活组件的时候就必须得提供该组件的名称、意图、意图过滤器和系统核心之间构成的关系如图2.3所示:

从图2.3可以总结出它们的基本工作原理,应用将Intent传递给系统核心层,系统核心层接着通过Manifest文件或者代码的方式获取到意图过滤器,从意图过滤器里读取到可以响应的意思并进行下一步的操作。

Intent传递实现

一个应用往往拥有多个界面,各个界面往往通过Intent来交流,在上面的章节中我们己经了解到了通过Intent的putExtra()方法等可以在不同的活动界面(Activity)之间进行传参等沟通交流。这里将介绍Intent之间的传递原理。Intent的传递原理及传递过程如图2.4所示:

由上图2.4可知,Intent流程是首先调用Context类的StartActivity方法来创建意图对象,接下来系统自动执行Instrumentation类的execStartActivity方法。Instrumentation类的作用是调节整个应用当中的所有活动界面(Activity ),充当应用程序的管理员的角色,其execStartActivity方法的作用是根据上面执行StartActivity方法后传递过来的Intent来启动相应的活动界面,而且Instrumentation对象可以通过RPC方式把调用context StartActivity传递给ActivityManagerService}

系统核心层是在虚拟机上运行的,与一般的Service不同的是,系统核心层是在底层服务,是不可见的。其主要作用就是对Android的某些关键事务提供和服务。ActivityManagerService进行Activity调度过程如下:由于PackageManagerService服务有整个应用以及应用的各个组建的全部信息,Intent通过PackageManagerService传递然后和当前Intent  Filters匹配,如果匹配成功则能够得到与Component有关的信息,将这些信息传给ActivityManagerService后便可启动Activity,完成Intent传递

尽管启动Activity比较复杂,过程中会调用很多服务,显得代价比较大,但是这些调用并不会在循环中重复出现,与其对应用效果的提高相比,这些处理还是利远远大于弊的。

2.2.4进程和线程

Android为动态形式。应用程序启动后,其中的各个组件相互调用,所有的数据也都变为了更加方便地了解应用启动后的动态过程,引入了进程与线程。进程用Activity,  Service, ContentProvider和BroadcastReceiver组件在系统最底层构建了运行环境,正常情况下同一个应用的所有组件在一个进程内运行,同时,开发者也可以自行配置。用户安装新的Android程序时会得到一个用户ID,并且不同的Android程序可以共享相同的用户id,这样就可互相访问程序之间的信息,可以共享JVM并且在同一个进程中运行。正常情况下,一个Android应用的所有组件都是由一个进程的主线程管理的。新线程是在有某些复杂耗时间且需要等待的任务需要执行时创建的,多线程操作可以让系统在等待查询数据库等操作时执行其它操作来保证应用的性能。

2.3安卓APP界面组成

界面是用户与程序间交互的媒介,界面与客户体验有着直接的联系。如果开发者将整体布局设计与界面资源相结合,并结合接口设计等功能,就可以设计出友好简洁的界面。界面控件树型结构如图2._5所示:

由上图可知,图的顶端是View Group,是一个总控件,其可以衍生出View Group以及View,衍生出来的为子控件,父控件管理子控件的位置、面积,并且为其分配任务。树形界面控件具有结构层次、控制方式简单明了等优点。在程序开发的过程中,开发者会加入很多源代码以外的文件,而且能够支持多种类型的资源文件,例如图像,音频等,Android能够支持多种类型的文件。由于这些优势,树形界面控件如今被广泛应用。但其有着传播时间较长等自身的不足,使得操作的效率变低[m。但是与优点相比,这些缺点还是值得的。

2.4本章小结

本章对涉及到的安卓基础知识进行了剖析,包括了安卓系统中的重点技术、使用场景特点以及重点构架和模块。介绍了安卓的工作原理以及开发中需要用到的相关技术进行了详细讲解,为后面章节的具体设计与实现作了基础铺垫。

第3章移动客户端软件系统的需求分析

3.1移动客户端软件的作用

网络的使用对人们来说己经非常普遍,由于手机终端具有方便的可携带性,使得移动网络具备了Pc网络所没有的天生优势,深受广大人们喜爱。现在智能手机全面普及,移动互联网时代己经到来,每人一部智能手机己经不再是空话,面对如此庞大的用户群,移动客户端软件的开发显得尤为重要。

Android是第一个可以称为真正开放和完整的为移动终端设计的移动软件平台。作为移动客户端,与服务器端接口交互通信是非常重要的一个方面。我们如此迅速的跨入移动互联网时代与Android系统的迅速普及密不可分。移动互联网时代开发出的移动应用有两种模式:第一种是本地应用,这类应用安装在手机上,可能需要联网操作,但不需要开发配套的服务器接口,例如一些游戏等等;另一种是网络客户端,这类应用不仅仅需要开发本地的应用,还要设计配套的服务器端接口,并且这类应用往往需要联网服务,在这种模式中,开发人员既要掌握像Android这样的移动开发技术还要掌握开发服务器端API方面的技术,本文所设计实现的移动客户端系统就属于这种模式。使用移动客户端可以完成一些电脑上无法完成的功能,比如摇一摇功能、随时随地拍照上传功能等等。并且移动客户端的使用环境广泛,不管是在公交车中站立还是在餐厅等餐,都可方便的使用。移动客户端的优点和作用还有很多,在此不一一列举。 随着手机的硬件配置的不断发展,现在主流手机的硬件配置包括存储空间和运算能力甚至可以媲美一般PC机,因此客户端软件所受到的限制就越来越少了。目前各式各样的手机软件早己铺满了手机界面,开发者开发出的客户端应用的内容和功能更加丰富,界面更加人性化,性能更加完善,大大的丰富了移动设备的功能,也使用户享受到了更加舒适的服务。

3.2移动客户端开发现有流程分析

从软件工程的角度来说,客户端的开发总体上包括项目需求分析,项目设计,项目审核,项目开发,项目测试这几个方面,下图展示了移动客户端开发的全部流程:

此设计的目标是开发一款符合学校订制需求的移动客户端系统,客户端的网络需求可以由中国移动运营商或者WIFI提供网络支持。

软件运行环境说明:

手机端:选用Android系统的手机或者平板电脑,要求Android2.0以上操作系统,硬件需要摄像头,其它硬件保持正常,能够连接到互联网。

服务器端:选用Windows7操作系统,保证一定的存储空间,安装有MySQL,JAVA和Tomcat等运行环境,能够正常访问互联网。

(1)     软件特征:本软件面向的是使用Android系统手机或平板电脑并且能够正常访问互联网的特定用户人群。

(2)     假定和约束:本客户端的开发工作是基于假定手机端和服务器端硬件完好,系统运行正常,并具有一定存储空间。

3.3本移动客户端软件系统的需求

经过学校人员和开发人员仔细协商后,本客户端的用户人群定为学校内部员工以及学校的客户。学校员工及学校客户需要注册登录才能使用,按照学校要求,每个员工及学校的产品等都绑定一个唯一的二维码,通过扫描可以看到他们的信息,员工和客户应该能够随时随地发表状态或拍照上传并分享,并且其他人可以评论此状态以方便员工之间、客户之间或者员工和客户之间能进行沟通,学校员工能够发布通知或公告以便最新消息的扩散,定位及导航功能使得客户能够方便的找到学校所在地,拨打电话功能使得客户能直接和学校值班客服进行电话沟通。综上,本移动客户端的需求定为如下几个方面:

(1)     需要有登录注册模块;

(2)     需要有二维码条形码扫描识别模块;

(3)     需要有类似微信朋友圈那样的可以分享状态和照片及评论的模块;

(4)     需要有发布通知公告的模块;

(5)     定位及导航模块;

(6)     拨打电话模块。

3.4本移动客户端开发步骤

(1) 跟学校人员协商进行需求分析;

(2) 确定开发工具和服务器端开发环境;

(3) 确定客户端和服务器端接口编写的规范;

(4) 客户端软件界面设计;

(5) 服务器端数据库和接口的编写;

(6) 客户端和服务器端连接测试;

(7) 客户端各个模块的编写;

(8) 软件测试;

(9) 与学校交接。

3.5用户使用流程

用户使用应用程序的流程如下图所示:未注册的用户首先通过注册,然后登录应用,对于己经注册的用户,则直接登录即可使用。

3.6本章小结

本章介绍了本课题的需求分析,说明了客户端系统的作用,并分析了现有的客户端开发的流程,然后根据本课题的具体需求,制定了本客户端的开发流程,并把需求的各个功能划分成了更加直观的模块。

第4章移动客户端软件系统的设计与实现

4.1基于安卓客户端系统的总体设计

4.1.1安卓APP设计的原则

安卓系统应用是由不同组件结合起来的,组件内部高内聚,组件之间的关系是低祸合的,而且软件的划分边界不清晰。在其它软件开发过程中,程序内部都有自己方法来分解功能,这些方法并没有统一的标准。软件之间的通信也没有统一的标准,需要交互时候必须要得到双方的各项信息才可以。而在安卓系统中,底层核心可以为所有的应用程序进行信息存储,识别,通讯,起到了为组件搭桥牵线的作用,这样组件之间交互就不必得到对方的具体信息,没有底层核心,它们之间是不能进行交互的。具体情况如下图所示。

由于安卓应用程序具有上述特点,本客户端的设计原则如下:

(1)     对于应用的层次要严加思考,层次要划分清楚,组件之间低祸合;

(2)     明确各个组件的功能,分工清晰以便组件的复用与扩展;

(3)     对于进程与进程的消息传递,线程与线程的通讯要合理设计;

(4)     应用界面要友好,用户使用方便,易于上手。

(5)     在考虑应用的设计时,应该从软件平台考虑,衡量其它应用以及HomeScreen的要求。例如能够使其它软件使用的服务应提供相应的接口。

(6)     软件应考虑到被打断等特殊情况,例如,在运行过程中有其它应用的通知、接到电话,短信等,因此应做监听功能。

4.1.2客户端软件的宏观架构方案

客户端软件除了安装在安卓终端,包括平板电脑以及智能手机上的移动客户软件之外,还有数据库以及服务器端系统。移动客户端与数据库之间通过服务器相互相互,移动客户端通过网络连接到服务器,支持无线网络和移动网络。服务器与对应的数据库相连,起到桥梁作用。具体关系如下图所示:

4.1.3客户端软件的功能模块设计

根据上一章中需求分析后,我们把客户端软件分成几个模块,模块的详细设计如下图所示:

4.2移动客户端软件详细设计

4.2.1客户端软件开发的环境搭建

基于安卓客户端开发工具主要是Eclipse,开发环境由JAVA系统环境和Android SDK环境组成。开发环境的搭建过程如下:

(1)     配置JAVA运行环境。下载安装JDK。官网网站是:  http://www.Java.com/en/download/chrome.jsp?locale=en,下载界面如下

下载安装完成后仍需要配置开发用的计算机的环境变量来进行JAVA开发。

配置环境变量主要包括三个方面:JAVA的安装地址(Home变量),JAVA的可 运行程序的地址以及JAVA的类地址变量(CLASSPATH )用鼠标右击“计算机”,选择“属性”,然后选择“高级”,再选择“环境变量”,再选择“系统变量”,最后选择“新建”。

在新建窗口中的“变量名”处填写“Java_ home",“变量值”填写JAVA的安装主目录路径,例如本机为:"C:\Program FilesUava\jdk1.6.0",最后点击“确定”,这样JAVA的HOME变量(Java_ home)就设置完成了。

下面简单介绍一下“classp ath”变量的配置。选中“系统变量”添加或编辑"classpath”变量,变量名我们设置为“CLASSPATH",然后在“变量值,,中填写JAVA的lib库所处的地址,例如本机是:"C:\Program FilesUava\jdk1.6.0\jre\lib",如下图所示。

现在可以进行“path”变量的配置了。与上面“classp ath”变量设置时相似,“变量名”输入框中填写在的地址,例如本机是:"path"“变量值”输入框中填写JAVA可运行程序所“C:\Program FilesUava\jdk1.6.0\bin”。

JDK的环境变量己经配置完成,需要判断环境变量的配置成功与否,在其C cmd)窗口中输入:+.lava -version”来输出JAVA安装版本,如果正确输出安装版本信息,例如显示如下图信息,说明JDK己经安装并配置成功。

第二步,安装Android运行环境。在Android Developers下载Windows下的安卓SDK压缩包,并用上面配置JDK同样的办法把安卓SDK中TOOLS的路径添加到”path“变量中。使用在CMD终端中输入“Android -h”来检测AndroidSDK安装成功与否。

第三步,配置eclipse以使用它进行Android开发。打开Eclipse配置接口,进入Add New software界面,然后输入ADT下载源,如图:

确定返完成之后,还需要把Android SDK的路径配置好,如图

4.2.2对应服务器端的运行环境搭建

本项目开发服务器端使用的是经典的Tomcat+MySQL,开发工具是Eclipse,服务器端使用的语言是JAVA,主要的环境搭建工作就是下载Tomcat,MySQL, JAVA,Eclipse并在服务器电脑上进行安装并配置环境变量,这些环境变量的配置过程与方式与上一节类似,在此不再赘述。

4.2.3客户端软件的用户界面设计

首先是软件小图标的设计,也就是安装在手机上后在手机桌面上显示的那个图标,这个图标要考虑到两方面,一是要体现此客户端的主体风格,二是也可以体现出学校的元素。然后是软件本身的界面设计,安卓的界面采用的是Xml,通过xml中的样式总局,我们可以设计出各种用户界面,和学校美工人员协商后确定的客户端主界面如下图所示。

微圈登陆界面:

微圈注册界面:

微圈主界面:

微圈数据库后台:

数据库后台 1

数据库后台2

4.2.4客户端软件的实现类设计

当用户打开客户端软件直接跳到登录界面,在用户输入用户名和密码并点击登录按钮后,客户端会把当前输入的用户名和密码上传到服务器,服务器查询数据库以验证用户的合法性,如果用户名和密码皆正确则进入软件主界面,否则提示登录失败并引导用户进行注册。 用户进入主界面后,可以选择任意的功能进行操作,如发表状态、评论等。

根据软件客户端的业务逻辑,设计出的实现类如下图所示:

本客户端系统主要包括这几个重要的类:

(1)     HomeActivityjavaIndexActivityjava

(2)     FriendActivityjava

(3)     Message.java

(4)     comment.java

(5)     Photo.java

(6)     PersonalActivityjava

(7)     ZhihuiActivityjava

(8)     Communicate.java

(9)     Navi.javao

类HomeActivity.j ava实现了对安卓Activity类的继承,主要显示用户登录成

功后的界面,展现三个菜单以让用户进行点击选择,这三个菜单分别是:主页,微圈和个人中心。类IndexActivityjava主要实现了首页要显示的功能,主要显示了学校logo,以及扫一扫功能,沟通智慧之窗功能等。类FriendActivityj ava主要实现了朋友圈功能,包括上拉刷新功能,下拉加载更多功能,它包括三个子类:Message.java} comment.java和Photo.j ava,这三个类分别实现的功能是发表状态,发表评论和拍照并上传照片功能。类ZhihuiActivity.java主要实现了发表通知公告、定位导航等功能,它包括了两个子类:Communicate.java和Navi.java,分别完成了发表通知公告等功能和定位导航功能。把各个功能划分成具体的功能模块类,有助于系统的维护和功能的扩展。

4.2.5客户端软件的数据关系设计

根据学校人员提出的具体软件需求,我们设计出了系统的数据关系,数据库我们选用的是开源的MySQL。数据库保存在服务器端。用户表user,如下表所示:表4. 1用户表

字段

类型

默认值

是否主键

是否自增

说明

Id

int

Not NULL

索引ID

name

varchar

Not NULL

Password

varchar

NULL

密码

Sex

varchar

NULL

性别

Phone

varchar

NULL

电话

Email

varchar

NULL

邮箱

Address

varchar

NULL

住址

朋友圈发表的状态表xinjiaoliu,如下表所示:表4. 2状态表

字段

类型

默认值

是否主键

是否自增

说明

id

int

Not NULL

索引ID

time

date

NULL

发表时间

des

varchar

NULL

发表内容

pic_path

varchar

NULL

图片路径

朋友圈发表的评论表reply,如下表所示:  表4. 3评论表

字段

类型

默认值

是否主键

是否自增

说明

id

int

Not NULL

索引ID

srcid

int

Not NULL

外键,对应回复的状态的ID

content

varchar

NULL

评论内容

time

date

NULL

评论时间

uservarchar

NULL

发表评论的用户

字段

类型

默认值

是否主键

是否自增

说明

4.3客户端软件主要功能实现

在Android开发过程中,安卓的类包表示为Android.*形式,例如包含一些问网络的类和接口的类包表示为Android.net,其中一些比较关键的类包主要有:高层程序模型与安卓应用基本运行环境的提供者(app包);主要实现访问或发布设备上所包含的各种数据类包(content包);操作数据库的类包(database包);图形绘制与操作类包(graphics包);定位和相关服务的类(location包);执行对多媒体操作和管理的一些接口的类包(media包);包含一些访问网络的类和接口的类包(net包);提供系统最底层的一些基本服务操作类包(os包);OpenGL工具包(opengl包);基础的UI框架类包(view包);完成对Android各种数据内容的访问的类包(provider包);与电话功能相关的服务的类包(telephony包);安卓系统基本功能类包,例如访问或者更改系统时间等(util包);操作手机自带浏览器操作的接口的类包(webkit包);显示在应用程序中的各种用户界面的基本元素的类包(widget包)。 Android有一个非常核心的特性,应用程序可以利用其它应用程序的元素.也就是说应用可以非常简单地直接调用其它应用的代码或模块。例如,如果应用程序需要拨打电话的功能模块,但是我们不需要重新开发一个拨打电话模块,只需要找到己经开发好并且开源的功能模块然后直接使用它就可以了,开发人员可以直接调用该己经开发好了的模块,大大节省了开发的人力和物力,并且缩短了开发周期。安卓应用程序在运行的时候需要系统来调用或者初始化一些主要组件。这些主要的组件己经在第二章中的第二节进行了详细的介绍。

4.3.1登录注册模块的实现

当用户打开软件时会首先进入登录界面,用户可以使用己存在的用户名密码进行登录,如果是第一次使用则需要进入注册页面去注册新的用户。登录流程图如下图所示:

登录界面如下图      

需要注意的是因为是自动进入登录界面的,所以在进入登录界面之前的那个启动界面SplashActivity中要先打开主页Activity,也就是HomeActivity,然后在登录界面LoginActivity中执行完和服务器的交互后,把登录是否合法的结果再传回HomeActivity。从一个界面进入另一个界面的代码如下:

Intent   mIntent=new Intent(SplashActivity.this, LoginActivity.class);

startActivity(mIntent);

在登录界面中我们使用多线程机制与服务器端进行交互,登录的时候为了不阻塞主线程(UI线程),需要把些耗时并阻塞主线程的操作放在另一个线程中处理,因此登录采用异步处理是不可避免的。我们使用了AsyncTask来进行异步处理,它是android提供的轻量级的异步类,我们在开发的时候定义一个直接继承AsyncTask的类,然后把所有需要异步处理的操作放在这个类实现,这个类可以通过AsyncTask类自带的接口把当时执行的任务的反馈给主线程,以便通知主线程进行相关的操作。它的优点是简单轻量、使用快捷,并且过程可控。以下这两个方法是最重要的,也是不可缺少的:

(1)      doInBackground(par...)。运行于后台的此方法,也就是在非主线程执行,在这里主要完成一些和服务器交互、图像处理等比较耗时的操作,处理完成后把结果返回。在这里不允许直接更改主线程(UI线程)的界面元素,否则会抛出异常。只能通过自带的Progress()等方法通知主线程进行UI的更新。

(2)      onPostExecute(Result)。该方法一般需要传入参数“Result",这个参数就是上面doInBackground(Par})方法中返回的结果。在这里主要进行耗时操作后得到的结果的处理。此方法在主线程执行,因此是不能在这里执行费时操作,否则会阻塞主线程,出现卡顿现象。下面三个方法是可以选择性使用,使不使用取决于你想要实现什么样的功能:

(3)     onProgressUpdate(Progressw)。当在doInBackground(Par})方法中需要与主线程界面交互,例如显示当前任务执行进度时,进度情况的显示就是在这个方法中实现的,此方法因为要操作主界面,所以运行在主线程

(4)     onPreExecute()。此方法是在doInBackground()方法开始之前自动调用的,也就是在所需要完成的任务执行之前调用的,可以在这里完成一些准备操作,例如进度条初始状态的设置等等。

(5)     onCancelled()。当用户执行取消操作时系统自动转到这个函数中执行接下来的代码。

在我们使用AsyncTask类进行异步处理的时候,有些规范是必须要注意的。AsyncTask类的对象必须在主线程中创建使用,然后再调用execute方法来进入到异步处理操作,且该方法也必须在主线程中进行调用使用,除了该方法外,AsyncTask类的其它方法不可以手动调用,例如我们在任何情况下都不可以直接调用onPostExecute(Result)方法来执行结果处理操作。在本客户端中,与服务器进行交互的时候我们都使用了AsyncTask进行异步处理,下面我们以登录为例,核心代码如下所示:

//登录系统

class MyTask extends AsyncTask<String, String, JSONObject>

{

@Override

protected void onPreExecute(){

// TODO Auto-generated method stub

super.onPreExecute();

@Override

protected JSONObject   doInBackground(String... params)

{

Map<String, String>   map2=new HashMap<String, String>();

map2.put("name_   c", params[0]);

map2.put("password", params[1]);

try{

retStr=new   JSONObject(NetTools.sendPostRequest(url,

map2, "utf-8"));

}catch (Exception e){

e.printStackTrace();

}

return retStr;

@Override

protected void onPostExecute(JSONObject result)

{

try

JSONArray   rs=result.getJSONArray("result");

String   code=result.getString("code");

if(code.equals("1”))

{

//表明登录成功,进行登录后操作

else

{

//表明登录失败,进行登录失败后的操作

DisplayToast(”登录失败!”

}

}catch(JSONException e)

e.printStackTrace();

当我们使用如下代码时,上面的代码被调用,并在后台进行,不阻塞UI主进程。

MyTask   login=new MyTask();

login.execute(username,password);

上面的代码把用户名(username)和密码(password)作为参数传入,这两个能在方法protected JSONObject doInBackground(String... params)中得到,如params [0]就是我们传入的username,  params[1]是我们传入的password o在方法doInBackground()中进行与服务器端的交互,具体发送和接收数据在类NetTools中的方法sendPostRequest()中实现,该方法的关键代码如下所示:

在本客户端中,我们使用Post方式向服务器传送数据,包括文字(英文,中文等)、文件等,而且数据对用户不可见。服务器端接口一直监听请求,若监听到数据传输请求则进行接收数据等操作,详细代码解释会在下面的章节进行介绍。对应的服务器端的登录流程如下:

使用了异步处理不会阻塞主UI线程,使得应用可以显示人性化的提示信息,不会出现卡住界面的情况,如下图表示正在登录:

注册功能与登录功能的流程十分相似,不同之处在于:注册上传的参数比较多,不只包括用户名和密码,还包括用户的其它一些信息,如邮箱、联系电话、住址等,而且服务器端也有一些不同,登录是查询以验证合法性,而注册是把

客户端上传的信息插入到数据库中,由于上面己经讲述了登录的过程,注册的

相关技术细节这里不再进行陈述。

登录时还有一个记住密码功能,完成该功能使用的是SharedPreferences类,

SharedPreferences是Android中最方便快捷并且容易使用的数据存储技术,实际

上SharedPreferences处理的就是一个key-value(键值对)。SharedPreferences常

用来存储一些轻量级的数据。使用以下代码保存数据:

当下次登录时要检查是否己经成功登录过,如果有保存了的用户名和密码则把它们取出来并自动填写到输入框中,使用以下代码取出己保存的数据,这样就简单的完成了记住用户名和密码的功能:

4.3.2朋友圈模块的设计与实现

朋友圈功能主要是为了方便沟通与交流,要求能发表状态,针对某个状态可以回复评论,还要求能发表图片状态。朋友圈的结构如下图所示:

朋友圈的主体界面如下图所示

发表状态时可以直接在界面的上部分输入并点击发布,同样我们仍然使用AsyncTask进行异步处理,首先判断用户的输入是否为空,如果为空提示用户容不能为空,如果不为空就开始异步与服务器交互,把用户发表的状态、当前时间、用户名保存到数据库中,保存成功后告知客户端进行一次刷新。针对某个状态发表评论时,客户端首先要得到这条状态的ID以便和状态关联起来,然后用户输入评论后把这条状态的ID,评论内容,当前时间和用户名用同样的方法发送到服务器,在服务器端把这些数据插入到数据库中,然后把成功与否的结果返回给客户端。在上图中,图片都是以缩略图的形式保存的,这样提高了加载速度也减少了图片占用的空间,当我们点击图片时,图片会放大成原来尺寸方便用户的观看,使用的方法很简单,因为我们己经得到了图片的路径,在监测到点击图片事件吧,把这个图片对应的路径地址传给要显示大图片的Activity,使用mIntent.putExtra("pic_path", pic_path);在这个Activity根据路径正常显示即可。发表图片状态的时,要首先打开手机自带的相机,打开相机的代码如下:

拍照完成后显示该照片,并且允许用户输入状态,界面如下图所示,点击发布后客户端把图片和状态发送到服务器,在服务器端成功接收到图片后,根据当时时间创建一个唯一的图片名,并生成该图片的保存路径,然后把图片的保存路径和状态都插入到数据库表中。最后把处理结果发送回客户端,如果发布功能客户端自动刷新一次。

4.3.3客服公告的设计与实现

此模块是设计给用户直接用客户端向学校客服人员提问问题的。这部分包括提问问题与所有问题的显示两部分,同时在设计上也加入了下拉刷新与上拉加载更多。包括提问的问题内容和提问时间。提问界面如下图所示。

这模块的实现方法跟上一节中的朋友圈中的发表状态的实现技术和方法都差不多。主要也是用户填写要求的内容后进行异步处理与服务器端交互,把数据发送到服务器端,在服务器端把这些数据插入到数据库中,成功插入后通知客户端进行刷新操作。上拉松手刷新是必须,因为用户随时随地都有可能在发表状态,我们需要一个方便的快速刷新的机制,上拉然后松手进行刷新无疑是解决这个问题的最佳方案,下拉加载更多同样也是不可或缺的,因为用户发表的状态的数量一直在不停增加,如果每次进入都一次性的把所有的状态全部加载出来就一个不可想象的事情。为了一次性解决上面的问题,我们设计了一个上拉刷新,下拉加载更多的控件,控件的原理图如下所示:

手机屏幕的大小和上图中的Container View的大小一样,而Heade:和Footer可以想象成是超出屏幕上下边界的部分,通过设置Header和Footer的padding属性来使Header和Footer两个部分强制超出屏幕外,例如设置Header的padding=-_50,那么它就会处于屏幕最顶端的上部,且距离顶端_50个单位,因此平常不拉动的时候是不可见的。当手机监听到下拉动作时,系统会自动调用相应的方法来移动布局,也就是使整个布局向下滑动,Header也会下滑,因为它是超出屏幕外的,这样它就会显示到屏幕上,上拉正好与下拉相反。因为下拉刷新上拉加载更多的功能在多个模块中都要使用,我们把它抽象成一个接口以便后面的扩展和修改。如下所示这个接口包含的所有方法:

接下来我们还需要定义一个实现了上述IPu11ToRefresh接口的基类:Pu11ToRefreshBase。它继承自LinearLayout类,如果你想实现一些自定义的功能,例如下拉刷新功能,只需要创建一个继承这个基类的新类,然后在这个新类中把一些方法根据自己的需要进行重新实现就可以了。这个类主要实现以下内容:

(1)     处理。nInterceptTouchEvent()和onTouchEvent()中的事件:比如有下拉操作时,当内容的View(比如ListView)正处于屏幕最顶部,此时我们必须截断这个Touch事件,然后使用move事件就会把后续的事件传递给onTouchEvent()方法中,然后再在这个方法中,我们根据手指滑动的距离再整体移动整个视图View)。

(2)     负责创建Header,   Foote:和Content View:在构造方法中调用方法去创建这三个部分的View,派生类可以重写这些方法,以提供不同式样的Header和Footer,我们使用createHeaderLoadingLayout C)方法来创建“头视图”C Headerlayout),使用createFooterLoadingLayout C)方法来创建“脚视图”C Footer layout)

(3)     设置各种状态:实现这样的下拉刷新功能需要监听到各种状态,例如:下拉、上拉、松手、是否正在加载等等。状态会随着用户的操作进行改变,例如用户手拉动的距离超过一定的值时,状态会从松手不完成任何操作转制到松手进行刷新状态。然后“头视图”或者“脚视图”会根据当前的状态来显示当前的应该显示的界面。

onInterceptTouchEvent()和onTouchEvent()这两个方法是必须要进行重写的,因为它们能完成很重要的功能,例如完成上下滑动等事件处理等功能。上拉刷新的主要思路就是在检测到向下拖动到一定距离并松手后客户端向服务器端发送更新内容请求,服务器接收到请求后查询一下数据库,并把最新的数据发送回客户端。下拉加载更多的思路是设置一个限制数,比如说是巧,那么第一次进入的时候服务器只传递巧条数据给客户端,下拉一次后服务器再传递另巧条数据给客户端,并且下加载的过程的为了美观还得在最下面,也就上述的Footer显示“正在加载,请稍候”类似这样的提示语,因此它也需要异步处理,也就是需要用到上面己经提到的AsyncTask在实现的过程需要用到适配器BaseAdapter,这个适配器的作用就是把每一项动态的逐一的放到一个ListView中,这个ListView必须是我们自定义的一个ListView,它需要继承上面提到的Pu11ToRefreshBase类,因为我们要实现上拉刷新等功能,假设我们把这个自定义的ListView命名为MyListView。那么在使用时需要在layout的界面xml中使用如下语句声明使用的是我们自定义的控件

然后在界面类中使用setAdapter()方法把这个ListView和我们自定义的适配器adapter绑定,用户所发的每一条信息就可以看成是一个ListView的item项,这个item也使用一个独立的界面xml来表示,重点就是在适配器中把这些item项动态的加入到ListView中,在我们自定义的适配器中使用LayoutInflater类的inflate方法就可以得到item的xml,并使用这个xml的元素,假设这个item的xml的名字是activity_nongguanlist item.xml,这个xml包含四个元素:标题(title用户名(name ),时间(time ),状态(state ),在适配器的getView方法中使用如下代码就可以动态的绑定item到LIstView中。

convertView=mInflater.inflate(R.layout.activity_list item, null);

String title= (ImageView)convertView.findViewById(R.id.item_title);

String  name= (TextView)convertView.findViewById(R.id.item_name);

String  time=(TextView)convertView.findViewById(R.id.item_ time);

String  state=(TextView)convertView.findViewById(R.id.item_states);

上拉刷新如图所示:

4.3.4定位导航模块的设计与实现

定位导航的实现借助的是百度地图的Android导航SDK,这个SDK是免费的,并且接口可以无次数限制的使用。首先要先申请密钥和下载相关SDK包和一些库等,具体使用和配置开发过程可以参考百度导航SDK官方网站的说明和

教程:http://developer.baidu.com/map/index.php?title=android-navsdk o

4.3.5扫一扫模块的设计与实现

扫一扫在各个手机客户端中都常看到。本客户端二维码扫描使用的是目前十分流行的开源项目(Zxing项目,由Google主导),整个项目工程及相关例子的下载地址是:http://code.google.com/p/zxing/。二维的扫描矩形四个角是用Canvas类的drawRect方法画的,drawRect的原型是drawRect(float left, float top, float,right, float bottom, Paint paint)。扫描矩形框中上下扫描的扫描线也是同样的办法画的,不过参数坐标需在设定的频率内不刷新,就实现了线上下位移的效果了。二维码扫描界面如下图所示:

我们实现了自动打开相机自动聚焦进行扫描二维码,扫到二维码后解码得到此二维码表示的内容。二维码大体上有以下特点:

  1. 二维码编码密度高,因此信息容量大,例如可以容纳多达可容纳多达100多个汉字。
  2. 容错能力强,并且纠错能力非常高,二维码图片损毁面积达_50%仍可成功解码出其所承载的信息。
  3. 解码成功率高,实验数据显示解码失败率不超过千万分之一。
  4. 保密性与防伪性好。
  5. 成本低,易生成和保存。

二维码能存储汉字、数字和图片等一维码所不能承载信息,因此它可以应用在更广大的领域。因为二维码扫描功能需要调用手机自带的相机,在AndroidManifest.xml中要声明上使用camera权限,

在AndroidManifest.xml文件中加上代码:

<uses-permission android:name="android.permission.CAMERA" />

就声明了权限。扫描流程如下图:

4.3.6拨打电话模块的实现

在安卓应用中实现拨打电话的功能是很容易,在应用中指定好电话号码,然后通过代码调用手机自带的拨号功能,把号码传递过去,就实现了自动拨号功能,自动拨号在一些团购网站等服务性网站客户端中比较常用,它的作用就是最大程度方便用户的使用,使得用户不用先记住客服电话,然后手动打开拨号应用并输入己记忆的电话号码进行拨打。使用如下代码可以自动拨打指定电话号码,假设我们的目标电话号码是100860

//传入服务,parse()解析号码

Intent   intent=new Intent(Intent.ACTION_ CALL, Uri.parse("tel:”+“10086”);

//通知activtity处理传入的call服务,开始拨号startActivity(intent);

最后我们介绍了安卓软件中非常常用的功能:连续点击再次退出应用程序。这里包括两个部分,一个退出应用程序的方案,二是连续点击退出。退出应用程序最简单是使用finish()方法关闭本Activity,但是针对多个界面的应用来说这样会带来一些问题,需要我们在具体实现的时候时时刻刻记得最后保证每个Activity都得关闭,这些做开发起来会增加一定的劳动和时间成本的,我们采用的方案是通过广播事件去一次性关闭所有的Activity,首先就是建立一个父类,让所有的activity继承这个父类,这样就不用每个Activity都去注册以接收广播,只要在父类注册接受就行了。在父类的Resume()中使用方法registerReceiver()注册广播,当接收到请求时,在父类的新建的类roadcastReceiver()中执行方法finish(),这样所有的Activity就都关闭了,因为所有的Activity都继承自这个父类Activity。然后在所有子Activity中监听返回按键,当在设定的时间内连续两次点击时就发布广播。连续双击退出应用程序的流程图如下所示:

4.4与客户端配套的服务器端的设计与实现

不管是登录注册,还是发表评论都需要服务器端接收客户端发送的数据并进行处理,执行数据库操作也是在服务器端进行的。每一个客户端的功能都对应一个服务器端的一个JAVA类文件。且这些类名需要在web.xml中进行类名和类位置的映射,例如登录类名为:Login,在包login里,需要如下映射:

<servlet>

<servlet-name>Login</servlet-name>

<servlet-class>login.Login</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>Login</servlet-name>

<url-pattern>/Login</url-pattern>

</servlet-mapping>

这样在客户端当指定访问地址时只需要指定服务器IP地址加端口加工程名加类名就可以了,例如:http://192.168.1.102:8080/appserver/Login,服务器接到请求后会调用login包下Login类进行操作。这些服务器端的类都继承类HttpServlet,例如当我们接收Post方法传来的数据时使用如下代码可以得到客户端传递过来的数据:

public class   Login extends HttpServlet{

pubfic void doPost(HttpServletRequest   request, HttpServletResponse resp

onse) throws   ServletException, IOException{

String name_ c=new String(   request.getParameter("name_ c").getBytes("i

so-8859-1   "), "UTF-8");//得到用户名

String password=new   String(request.getParameter("password").getBytes

("iso-8859-1"),   "UTF-8");//得到客户端发送过来的密码

//接着执行其他一些操作,例如数据操作等等

}}

往客户端发送数据的时候要先PrintWriter out=response.getWriter();可以使用out的方法print()和flush()把数据写入并发送到客户端。各个服务器模块的思路和代码实现和上面的登录模块都大同小异,区别就在于接收的数据内容、数量不同,执行数据库的操作不同,例如有的是查询,有的插入等等,因此我们不再逐一介绍各个模块的代码实现。

4.5本章小结

本章详细说明了安卓移动客户端软件的设计与实现。设计出了整个系统的总体实现方案和软件的总体构架方案。介绍了移动客户端软件的界面设计、各个模块的实现细节、数据库的设计方案、服务器端的设计与实现细节。重点实现了安卓四个大类的中各个Activity的实现、安卓的监听机制,以及客户端与服务器端交互过程的实现。

第5章移动客户端软件测试

5.1测试环境与配置

在软件开发中一般测试分两种:白盒测试和黑盒测试。

黑盒测试是针对移动客户端软件系统的测试方式,要从用户的角度出发,检验应用是否功能正常,检验应用是否偏离应用的需求。

白盒测试跟黑盒测试不同,它针对的是软件系统的代码,检验程序的逻辑等是否有误

在开发的末期,我们己经进行了白盒测试,自己感觉没有问题后找了几个未参与开发的同学们从用户的角度测试网站,也就是我们进行了黑盒测试,下面我们重点介绍一下黑盒测试。

移动客户端软件是基于Android系统开发的应用软件,我们使用安装好APK的真机来测试的,系统的服务器端使用实验室的PC。测试的目的是总结开发及测试阶段的过程,检测移动客户端能否在服务器端正常的情况下正常工作,同时检测移动客户端软件系统的性能。服务器端电脑的操作系统是Windows?,中兴、华为、三星等安卓系统手机作为测试时使用的手机终端。服务器端电脑的配置为:Intel CPU双核3.39GHz、3.4GHz;内存:3.00G;硬盘容量:3206 0

5.2测试需求功能

功能与性能方面测试是我们主要测试工作,对移动客户端在手机上进行了实际使用测试。预期测试功能如下表所示:

5.3测试流程的设计

首先确定软件相关系统配置正确,然后安装移动客户端。本次测试包含单机测试和多机同时测试,启动移动客户端软件后随机使用客户端的任何功能,测试过程中随时记录测试的结果或者出现的问题与BUG。

5.4系统测试的结果

最后总结一下测试结果,测试表明,客户端界面设计大方美观,符合用户使用习惯,登录等各个模块在硬件网络正常的情况下可以正常工作,性能优秀,除了网络速度的影响,应用软件不会产生延迟的情况,总体上功能体验是流畅的。登录注册可以成功工作,重复名不可能注册,朋友圈可以发布状态、回复状态、发表图片等等,总的来说,移动客户端软件的整个系统通过了测试,包括客户端软件和服务器端功能。本次移动客户端软件的开发是成功的。当然测试过程也出现了一些小问题,例如因为各个手机的屏幕大小、分辨率不同的原因导致软件界面的不统一等问题,还有一些功能上的问题,例如,下拉刷新时出现了重复项等,都一一进行了解决。客户端各个功能模块都可以正常工作,

例如登录后如下图所示:

登录成功后才可以进行朋友圈(微圈)并进行发表评论等操作,如下图:

各个模块的成功运行的截图在此不一一介绍。

第6章结束语

本文结合本实验室与学校合作的实际项目,设计并开发了基于安卓的移动客户端系统,包括手机应用以及相应的服务器端接口的开发。根据学校的需求,我们进行了需求分析并进行了模块划分与开发流程的设计,经过几个月的努力,软件系统顺利开发完成,并与学校人员完成了交接,用户的意见反馈表明,整个系统运行稳定,能够满足学校和用户需求。

6.1论文工作总结

本文主要介绍实际项目的中移动客户端软件系统的设计和开发工作,在可行性分析完成后,制定了需求分析并确定了开发流程图,对用到的Android等系统相关的技术知识进行了介绍,涉及的技术包括Android应用开发,基于Tomcat,MySQL, JAVA等服务器端接口的设计与开发。本文完成了Android应用所有界面的设计、各个功能模块实现以及对应的数据库关系设计和服务器端接口的实现。论文详细说明了客户端各个功能模块的实现细节,同时也讲解了服务器端接口的实现方法,并以登录接口为例进行了详细说明。最终完成了移动客户端应用系统的开发。

6.2系统运行状况

测试完成后由学校相关人员进行验收,验收过程是愉快的,应用在网上发布后所有人员就都可以使用了,根据用户的反映,系统运行状况良好,同时使用用户达300人时不会有明显的延迟,用户体验效果良好,软件运行稳定。

6.3问题和展望

本移动客户端软件系统的开发工作己经取得阶段性成果,以后还会继续开发第二版软件,在运行过程中会累积用户反馈的意见的新的需求,在以后的工作中还会对软件系统进行不断的优化改进和增加新的功能。以后的功能改进可能包括以下几点:

(1)     现在只能记住一个用户的用户名并自动填写,以后可能会增加支持记住多个账号并实现切换账号功能。

(2)     现在朋友圈只一次发表一张图片,以后可能会增加支持同时发表多张图片的功能

(3)     现在用户还不能修改自己的用户头像,这部分下一个版本也是要加上的。

(4)     )增强客户端软件在不同设备上运行时候的兼容性,尤其是手机和平板的兼容性。

参考文献

[1] 马越.Android的架构与应用「D].中国地质大学(北京),2008.

[2] 沈爱涛,程涛.基于Android平台的应用系统开发环境研究[[J].计算机光盘软件与应用,2013, (7):247-247.

[3] 贾震斌,董洪逾,陈娟等.Android应用开发中多任务机制剖析[[J].福建电脑,2013, 29(9):46-47.

[4] Brestovac G, Grbac T G, Grgurina R. Development environment for Androidapplication development: An experience report.[J]. MIPRO, 2011 Proceedings ofthe 34th International Convention, 2011:1693一1698.

[5] 周辉.基于Android移动学习平台研究与实现[D].电子科技大学,2012.

[6]  Peng B, Yue J, Tianzhou C. The Android Application Development College Challenge[J]. High Performance Computing and Communication&2012 IEEE9th   International   Conference   on   Embedded   Software   and   Systems (HPCC-ICESS), 2012 IEEE 14th International Conference on, 2012, 248(4):1677一1681.

致谢

至此,这篇论文己经接近尾声。首先我要感谢我的论文指导老师一一xxx

老师,在许志闻老师的帮助和指导下,遇到的无数困难和疑惑都得到了解决。在

论文写作过程中,朋友和同学热情帮助我查找资料和提供格式的修改建议,没有

他们的帮助,论文就不会这么顺利的完成。还要感谢吉林大学提供了这么好的学

习和实验环境,让我能方便的在图书馆和网上查找相关资料。最后还要感谢一直

在默默支持和鼓励我努力学习的父母,谢谢你们!

勤拂拭软件出品,必属精品

软件开发,毕业设计,程序作业,请访问勤拂拭毕业设计:

勤拂拭软件

我的qq(1215714557 加好友请注明:勤拂拭)

qq群(439261058 加群请注明:勤拂拭)

Android毕业设计-微圈的更多相关文章

  1. Android drawable微技巧

    家都知道,在Android项目当中,drawable文件夹都是用来放置图片资源的,不管是jpg.png.还是9.png,都可以放在这里.除此之外,还有像selector这样的xml文件也是可以放在dr ...

  2. Android状态栏微技巧,带你真正意义上的沉浸式

    记得之前有朋友在留言里让我写一篇关于沉浸式状态栏的文章,正巧我确实有这个打算,那么本篇就给大家带来一次沉浸式状态栏的微技巧讲解. 其实说到沉浸式状态栏这个名字我也是感到很无奈,真不知道这种叫法是谁先发 ...

  3. Android微信朋友圈全文、收起功能

    在众多的社交类软件中,朋友圈是必不可少的,可以与好友.同学等分享自己的日常和有意思的事情,在开发社交类App时,朋友圈发表的内容你不可能让他全部显示,全部显示的话用户体验度会非常不好,这时就要用到全文 ...

  4. Android状态栏微技巧,带你真正理解沉浸式模式【转】

    感谢! 本文转自大佬郭霖:http://blog.csdn.net/guolin_blog/article/details/51763825 转载请注明出处:http://blog.csdn.net/ ...

  5. android——仿微拍贷滑动圆形菜单

    一次偶然机会接触到微拍贷的app,瞬间被其圆形可滑动菜单吸引了.一直琢磨着给弄出来. 现在弄出来了.先看看效果吧 如果你也喜欢这个菜单.去我的github找源码吧.太忙了.没时间贴代码和讲解了. ht ...

  6. Android 实现朋友圈有图片和视频

    最近开发比较烦,这个作为我第一篇博客吧. 效果就是图上的样子. 首先是布局文件,没什么就是一个RecycleView <android.support.v7.widget.RecyclerVie ...

  7. 仿:Android - 微信 - 朋友圈 - 小视频播放,多 4 句废话算我输

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  8. 【Android】还原“微信”apk中的“发现”和“我”两个模块

    先下载一个微信apk,以压缩包的形式打开,对比微信界面,找出我们需要的素材. 以下两个模块的还原完全采用RelativeLayout相对布局. 按钮效果的实现 点击对应版块,将有点击效果.这可以通过修 ...

  9. 掘金 Android 文章精选合集

    掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...

随机推荐

  1. c++ 中lambda

    C++ 11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作. 1.Lambda表达式完整的声明格式如下: [capture list] (params list) mutable  ...

  2. Ajax 的onreadystatechange事件注意事项.

    <script type="text/javascript"> function createXHR() { var request = false; try { re ...

  3. GIT入门笔记(19)GIT 小结

    1.add和commit为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:$ git add file1.txt$ g ...

  4. 基于python的统计公报关键数据爬取 update

    由于之前存在的难以辨别市本级,全市相关数据的原因,经过考虑采用 把含有关键词的字段全部提取进行人工辨别的方法 在其余部分不改变的情况下,更改test部分 def test(real_Title,rea ...

  5. bootstrap表格 之多选数据的获取

    使用表格的时候经常会用到多选的功能,比较常用,下面写一个小Dome记录一下 如下:单击批量删除按钮之后,需要获取选中行数据,传值到后台进行处理 一.获取选择行的数据 btnplDel是按钮id:tab ...

  6. python tornado TCPserver异步协程实例

    项目所用知识点 tornado socket tcpserver 协程 异步 tornado tcpserver源码抛析 在tornado的tcpserver文件中,实现了TCPServer这个类,他 ...

  7. 详解Ajax请求(三)——jQuery对Ajax的实现及serialize()函数对于表单域控件参数提交的使用技巧

    原生的Ajax对于异步请求的实现并不好用,特别是不同的浏览器对于Ajax的实现并不完全相同,这就意味着你使用原生的Ajax做异步请求要兼顾浏览器的兼容性问题,对于java程序员来讲这是比较头疼的事情, ...

  8. CentOS ping www.baidu.com 报错 name or service not know

    今天尝试安装了centos系统 玩一玩 刚刚装好的操作系统 ping www.baidu.com的时候  报出 name or service not known 查了好多资料,都没有很好的解决 最后 ...

  9. Python_fullstack_test1

    1.执行Python脚本的两种方式 使用交互式的带提示符的解释器或使用源文件 2.简述位.字节的关系 位是计算机中最小计量单位,用bit表示 字节是计算机中最小存储单位,用Byte表示 1字节=8位, ...

  10. tkinter的冷却技能

    validatecommand=(f,s1,s2,s3) f就是冷却后的验证函数名,s1,s2,s3这些时额外的选项,这些选项会作为参数依次传给f函数. register()冷却作用:register ...