一篇很好的关于Android的本科毕业论文《基于android手机通讯录的设计与实现毕业论文》转自百度

本文转自:

http://wenku.baidu.com/view/bb7dad58804d2b160b4ec058.html

         相应的word文档csdn下载地址:

http://download.csdn.net/detail/ly969434341/9217141

                                      






中图分类号:TP311.1

 

            

 

 

本 科 生 毕 业 论 文

(申请学士学位)

 

 

 

 

 

 

论文题目    基于Android手机通讯录的设计与实现

作者姓名                  ……….              

所学专业名称          计算机科学与技术        

指导教师                  ………              

 

 

  

 

 

 

 

 

2012年4月20日


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

学        号:  

论文答辩日期: 2010  年 6  月 10 日  

 

指 导 教 师:                     (签字)



基于Android手机通讯录的设计与实现

 

摘要:随着第三代通信技术3G的推广,无线带宽和传输速度都得到了大幅度提升,为智能手机终端添加更多内容丰富的应用功能提供了良好的平台。本系统是基于谷歌公司新推出的一款Linux平台的开源手机操作系统——Android系统,利用Java语言,Eclipse为开发工具,通过对平台的系统架构和应用程序进行学习,设计出一款手机通讯录。本系统包括存储,删除,Android修改,打电话,发信息,发邮件,备份SD卡等功能,满足了用户对通讯录的需求。此通讯录的设计遵循标准的开发流程,首先进行需求分析,然后确定通讯录的功能,再编写程序的代码,调试程序,运行程序,并对程序进行优化完善。本软件利用Android提供的各种组件对界面进行设计,能够很好地支持用户体验。

关键词Android;手机通讯录;智能手机; 

 

Design and Implementation of Mobile Phone Contacts Based on Android 

 

Abstract: With the 3G promotion of third-generation communications technology, wireless bandwidth and transmission speed have been improved significantly, and provides a good platform for smart mobile terminals to add more content-rich applications. The design is based on the Google Corporation a new version of the Linux platform to the source mobile phone operating system -- Android system, using Java language, Eclipse as a development tool, through the Android platform system architecture and application for research, design a mobile phone contacts. The design including functions of storage, deletion, modification, phone calls, messages sending, E-mail sending, backup SD cards and other functions, to meet user demand for mail list. The design of the contacts follows the standard development process, the first needs analysis, and then determine the function of the contacts, then write the code, the debugger, run the program, and procedures to optimize the sound. This software uses the Android provides a variety of components to design the interface, can support the user experience.

 

Key wordsAndroid; Mobile Phone Contacts; Smartphone;

 

 

 

 

 

 

 

 

1绪论

1.1研究背景

智能手机(Smartphone),是指像个人电脑一样,具有独立的操作系统,可以由用户自行安装软件、游戏等第三方服务商提供的程序,通过此类程序来不断对手机的功能进行扩充,并可以通过移动通讯网络来实现无线网络接入的这样一类手机的总称。目前,全球多数手机厂商都有智能手机产品,而芬兰诺基亚、美国苹果、加拿大RIM黑莓)、美国摩托罗拉、中国台湾宏达(htc是智能机中的佼佼者[1]

智能手机具有五大特点:1具备无线接入互联网的能力,即要GSM的支持网络下的GPRS或者CDMA网络支持下CDMA 1X3G网络。2人性化,可以根据个人需要扩展机器功能。3.它是具有开放性的操作系统,可以安装非常多的应用程序,使智能手机的功能可以得到无限扩展。4具有PDA功能,其中包括个人信息管理日程记事任务安排多媒体应用浏览网页5扩展性能强,第三方软件支持多[2]

Android是一种以Linux为基础的开放源码操作系统,主要使用于便携设备。目前尚未有统一中文名称,中国大陆地区较多人使用安卓安致Android操作系统最初由Andy Rubin开发,最初主要支持手机2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。Android的主要竞争对手是苹果公司iOS以及RIMBlackberry OS2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 20122月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为68.4%[3]

在这个信息化的时代,手机已成为继固话之后最为通俗的交流工具[4]。在这个人与人关系愈加密切的时代,“通讯”成了生活中的必需品。这就有这么一个系统记录下人与人之间的多样联系方式——手机通讯系统。目前国内的通讯录应用服务商分为三类,第一类如幸会、名片全能王、QR扫描等等,这些产品主要是为了解决名片交换时候输入难度较高的问题。而这也就致使了这部分厂家缺少了一个服务商最看重的东西:对用户没有持续的运营能力;第二类如火种、QQ通讯录、友录、手机自带的通讯录同步服务等等,这部分的市场主要提供了号码备份服务,帮助用户解决手机号码记录联系人的问题。第三类就是针对与通讯录之上提供的拓展应用服务提供商,比如:米聊和微信,你可以通过上面去发短信,实现多种通信能力的聚合[5]

1.2研究现状

当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同种类。Android是一个基于Linux 核心(kernel)的开放手机平台作业系统,与Windows MobileSymbian 等手机作业系统处在同一级别,其中占有开放源代码优势的Android系统有最大的发展前景。较之Symbian用户体验较差系统较为封闭,支持的应用较少Windows Mobile系统对终端厂商来讲引入成本较为昂贵,娱乐性平平。Android系统拥有低廉的引入成本,在应用方面的资源丰富,以及良好的用户体验开放性较强的特点适应了移动互联网的发展趋势,切合了移动互联网产业链各方的发展变化需求,所以取得了迅猛的发展[6]

Android 系统除了低廉的成本和良好的用户体验外,因采用了开源的平台,给予了终端厂商和开发者更大的灵活性,开发者在程序的开发移植上更为方便且不需要考虑厂商端内容审核等问题,终端厂商则可以按需深度定制系统开发本地化应用环境,在终端厂商、电信运营商和第三方应用开发商的推动下,用户可选择的应用资源将会进一步丰富。各大Android应用商店呈现百花齐放的态势。带给了应用开发者更多的机遇和极具诱惑力的利润分成,在各应用商店间的移植改造成本也相对较低。随着应用商店的不断发展和开发者的涌入,Android平台的应用资源优势正在逐步的扩大[7]

而从用户的角度考虑Android良好发展前景主要源于优秀的用户体验和高性价比这两个方面

从人才需求类型来看,目前对Android人才需求一类是偏向硬件驱动的Android人才需求,一类是偏向软件应用的Android人才需求。从目前的招聘需求来看,后者的需求最大,包括手机游戏、手机终端应用软件和其他手机应用软件的开发[8]

职业专家分析说,由于目前Android技术较新,具有开拓空间,无论是相关书籍、培训还是大学教育,都处于初级阶段,因此Android人才短期将供不应求。从长期来看,随着各种移动应用和手机游戏等内容需求日益增加,也将激励大中小型手机应用开发商加大对Android应用的开发力度,因此Android人才前景也被看好。

生活在信息高速发展的今天,智能手机的普及己经是不可改变的趋势。而作为手机各个功能中最为基本的通讯录也成为人们生活中必不可少的一部分了[9]。在这个人与人关系愈加密切的时代,“通讯”成了生活中的必需品。通过手机通讯录记录下对方的联系方式,既减轻了大脑的负担,又不在受各种条件的约束,做到便捷随身管理相关的联系信息,摆脱了传统电话簿,名片的累赘。另外,不同于微博,社交网站,手机通讯录是完全属于用户的,而不隶属于某个特定公司或是服务,只要获得用户的认可,即使不是大公司也可以借此迅速建立起一个巨大的关系网络[10]Frost & Sullivan的王煜全也曾多次强调过手机通讯录是一块颠覆性创新的金矿,是创业者们创新的绝佳平台。从长远利益来看,可是意义重大的环保便民之举。根据市场需求,手机通讯录管理系统所记录的信息一般分为个人、商业、办公三类。清晰了机主的联系方向。针对性的分门别类,使系统具有了方便了机主的存储和快速查阅优势功能,大大减少了在电话簿,名片上机械翻阅查找过程的时间。于此同时又根据手机随身携带的特殊性,在一定程度上比一般的制作文件方便亲民。又其次,因为手机是随身携带的通讯工具,这与记事本相比将在一定程度上保障了联系人信息的安全性,相对避免了个人隐私信息外泄从而带来的损失[11]。 

综上所述,手机通讯录管理系统是一个高效、实时、绿色环保的管理系统。然而现在很多通讯录一味追求外观花哨,功能繁杂,对于大多数用户,许多功能用不上,形同虚设。针对以上各种弊端,开发了此种通讯录,将各种性能优化,继承通讯录的常用功能,满足一般用户存储,查找,删除,查看的需求,此外还支持发信息,打电话,发邮件,备份SD卡等功能[12]

1.3主要工作

在此背景下,开发的基于Android手机通讯录具有十分重要的意义。可以根据客户需求的实际情况,开发一款实用的手机通讯录软件。

本设计主要是采用AndroidView框架编写,部分框架运用Android中的其他组件。 

当进入通讯录的增加界面时,调用的是一个用相对布局RelativeLayoutXML布局文件。其中包括了2Button,分别实现了不同的功能。第一个Button是保存内容,当输入联系人姓名和号码是点击保存实现此功能。说到保存,不得不说得是保存信息涉及添加新联系人的头像,姓名,手机号码,办公室电话,家庭电话,职务职称,单位名称,地址,邮政编码,Email,其他联系方式,备注这些信息。第二个Button是返回,顾名思义就是从增加界面返回前一界面。

响应menu键的触发事件,设置底部菜单是否可见,并通过对底部菜单选项的监听实现底部菜单中的增加、查找、删除、菜单、退出等功能,其中菜单包括显示所有、删除所有、号码备份功能。

在联系人信息界面时通过点击menu键,会弹出通信功能框,通过与发信息、打电话、发邮件功能接口的套用来实现。

1.4本文结构

本文首先给出了系统的研究背景,对当前手机通讯录的发展现状做了简单的介绍。进而详细的分析了Android的特征、架构以及Android应用的构成和工作机制。

本文详细的提出了软件的架构,以及通讯录的设计方案;采用Java开源的JAR包对HTML文件进行分析和获取图片和文字信息;对各个界面的布局和实现方式进行详细说明;对数据库设计模块进行了详尽的需求分析,经分析得到数据库设计模块,它主要完成用户对已经获取的内容的存储,删除和查询等操作;运用Android提供的各种组件设计和实现很好的UI效果,实现很好的用户体验;详细介绍了该软件的性能优化。

2 Android技术与理论

2.1 Android系统开发简介

2.1.1 Android技术简介

Android一词的本义指“机器人”同时也是Google。于2007115日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。它采用软件堆层(Software Stack,又名软件叠层)的架构,主要分为三部分。底层以Linux内核工作为基础,由C语言开发,只提供基本功能;中间层包括函数库Library和虚拟机Virtual Machine,由C++开发。最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以Java作为编写程序的一部分,不存在任何以往阻碍移动产业创新的专有权障碍。Google通过与软、硬件开发商、设备制造商、电信运营商等其他有关各方结成深层次的合作伙伴关系,希望借助建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统[13]

对于设备制造商来说,Android是一个免费的平台。对硬体开发厂商来说,Android是个开放的平台。只要厂商有能力,可以在这个平台上自由加入特有的装置或功能,不受手机作业系统厂商的限制。对于手持装置的开发者来说,Android是个先进的平台。平台上的应用程式可相容于各种型号的Android 手机,免去为各种不同手机机型开发的困扰。Android平台支援各种先进的网络、绘图、3D 处理能力,可以用来提供更好的使用者体验。Android它的开放性就优于其它封闭式的手机系统,因此,任何人都可能根据自己的喜好将手机系统中的所有功能重新编写。这使得越来越多的人关注这个操作系统[14]

Android软件平台主要由五部分构成它们分别是:关键应用程序、应用程序框架和组件、C /C ++函数库、Java程序运行环境、优化了的Linux内核[15]

关键应用程序:Android平台内包含一些关键应用程序如邮件收发客户端程序、短信收发程序、日历、网页浏览器等而更多有特色的Android应用程序还有待于广大开发者共同参与开发。

应用程序框架及组件:Android 应用程序开发基于框架和组件。Android本身已在其框架中提供了许多组件供应用程序调用开发者也可在开发应用程序时顺带开发新的组件并将该组件放入应用程序框架中以供自己和其它应用程序调用。

C/C++函数库:Android应用程序框架之下是一套C/C ++函数库它们服务于Android应用程序组件其功能通过组件间接提供给开发者。这些函数库包括标准C函数库、媒体功能库、浏览器引擎、2D3D图形库等[16]

Java程序运行环境:AndroidJava程序运行环境包含一组Java核心函数库及Dalvik虚拟机它们有效地优化了Java程序的运行过程。

Linux内核:Android系统平台基于优化了的Linux内核它提供诸如内存管理、进程管理、设备驱动等服务同时也是手机软硬件的连接层[17]。 

Android应用程序以各种组件(API)为基础APIAndroid软件平台的重要组成部分也是开发Android应用的关键所在。

当前活动程序Activity:作为最常用的应用程序组件几乎所有Activity都会通过创建U I窗口与用户进行交流。Activity具有生命周期它包含运行、暂停、停止等几个状态状态间的转换可通过调用onCreate()onStart()onRestart()onResume()onFreeze()onPause()onStop ()onDestory()等方法来实现。要开启新的activity可以调用startActivity(Intent)或调用startSubActivity(Intent, int)后者通常和onActivityResult(intint, StringBundle)联合使用以从一个activity获取某结果并返回给打开它的activity[18]

图像显示View: View是最基本的UI构件它在屏幕中占据一个矩形区域可用来显示文本、图像等内容还可完成图像事件处理。常用的View方法有:inflate()(由XML 文件生成View)onDraw (Canvas)(对View进行填充) onMeasure (int, int)(测量View的高度和宽度) onLayout() (完成View的布局) onKeyDown(int, KeyEvent)(View中有按键操作时被调用) onFocusChanged (boolean, int)(View得到或失去关注时被调用)setOnClilckListener()(设置View点击事件监听器)View也包含一些子类: TextView(布局文件中的文本显示)EditText(布局文件中的文本编辑)Button(按钮)、ListView(显示列表) [19]

事件Intent: Intent抽象描述了想要执行的某种操作它与startActivity一起使用可以开启新的activitystartService 一起使用可以开启后台服务。Intent最重要的作用还是加载activity它是不同activity间的桥梁。Intent也可以被认为是一种概括操作行为的数据结构它主要包括action (动作)data(数据)两部分此外它还具有一些附加属性如category(intent种类)type (数据类型)等。常用的Intent方法有intent() (构造intent)addcategory() (添加intent类型)getAction()(获取intent动作)getData()(获取intent数据)等。

数据存取与共享机制ContentProvider: ContentProvider为应用程序提供一些访问方法包括: Query(Uri, String [ ] , StringString[ ] , String, String, String)(数据信息的查询insert (Uri, Contentvalues) (Contentp rovider中添加新数据, updata(Uri, Contentvalues, String, String[ ])(更新Conntp rovider中的数据), delect(Uri, StringString[ ])(删除数据, Gettype (Uri)(获取数据类型)。其中Uri标明了ContentProvider存储的数据类型在执行访问方法时都需依据Uri作为路径标识来确定要访问哪个ContentProvider[20]

后台服务Service: Service是运行在后台的应用程序组件不直接与用户交互。当前活动程序可以使用Context. StartService()开启一项后台服务还可以通过Context. bindService()与后台服务通信。

Android的架构是Linux内核、C/C++函数库、Dalvik虚拟机、应用框架以及关键应用程序构成的,如图2-1。通过编译基于框架的应用程序可以降低开发负荷。应用软件原则上是在Dalvik VM上运行的。

 

2-1 Android架构图

2.1.2 关键应用程序

Android平台内包含一些关键应用程序,如邮件收发客户端程序、短信收发程序、日历和网页浏览器等,开发者可以在其平台上开发更多有特色的应用程序,所用开发语言是Java

2.1.3 应用程序框架

Android应用程序的开发基于框架和组件。Android本身已在其框架中提高了许多的组件供应用程序调用,当然开发者也开放新的组件,并将组件放入应用程序框架中,以供自己和其它应用程序调用。

2.1.4 函数库

Android应用程序框架之下是一套C/C++函数库,它们服务于Android应用程序组件,其功能通过组件间接提供给开发者。这些函数库包括:标准C函数库、媒体功能库、浏览器引擎、2D3D图形库、基于WEB应用的的安全协议SSL、用于点阵和矢量字体渲染的FreeType以及SQLite引擎等。

AndroidJava程序运行环境包含一组Java核心函数库及Dalvik虚拟机,它们有效地优化了Java程序的运行过程。所有的Android应用都运行在它自己的进程里,该进程是一个Dalvik虚拟机的实例,Dalvik被设计成能在一台设备上高效的运行多个虚拟机实例。Dalvik虚拟机的可执行文件被封装成Dalvik可执行格式(.dex)。这是被优化过的最小内存依赖的格式。Java编译器(dx工具)将注册了的和运行时用到的类编译成.dex格式。Dalvik虚拟机依赖于底层Linux内核提供的功能,如线程机制,和内存管理机制等。

2.1.5 Linux内核

Android系统平台是基于优化了的Linux内核,是其系统平台的核心。它提供诸如内存管理、进程管理、设备驱动等服务,同时也是手机软硬件的连接层,提供了一个屏蔽层用于屏蔽硬件和上层软件。

2.2 Android应用的构成和工作机制

对于一个Android应用程序来说,是由Activity、 Intent Receiver 、ServiceContent Provider四部分组成,但并不是每一个Android应用程序都必须由这四部分组成。在应用程序中使用时,需要在配置文件AndroidMainfestxml中进行配置。这个配置文件是每个Android应用程序所必需的,用于定义应用程序的组件、组件的功能以及必要条件等。

2.2.1 Activity

Activity是构成应用程序中最重要的构造块, Android应用程序中,几乎都是通过Activity来与用户进行交互,所以Activity主要负责的就是创建与用户进行交互的显示窗口,你可以在这些窗口里通过调用setContentView(View)方法来显示你自己的用户界面。

活动(Activity)在系统中以活动栈的形式进行管理。当一个新的活动启动后,被放到了栈顶,成为了运行活动,而新活动之前的活动在活动栈里总位于新活动之下,直到新的活动退出才重新回到前台。

从图2-2可以看出,Activity有三个关键的循环:

(1)活动的整个生命期:从首次调用onCreate(Bundle)开始,到最终调用onDestroyO结束。在onCreate()中进行所有初始化,在onDestroyO时进行清理工作,释放资源。

(2)活动的可见生命期:从调用onStart()开始,到onStop()被调用为止。在这段时间内,即使活动不与用户进行交互,用户也可以在屏幕上看到它。在这两个方法调用之间,可以维护活动显示给用户的资源。onStart()onStop()方法可以多次调用,因为活动随时可以在可见和隐藏之间进行转换。

(3)活动的后台生命期:从调用onResume()开始,到onPause()被调用为止。这段时间内活动处于其它所有活动之前,并与用户进行交互。一个活动可以不断在resumed状态和paused状态之间变换。

Android使用了Intent类来实现活动之间的切换工作。Intent负责对应用中一次操作的动作、动作涉及的数据和附加数据进行描述。根据Intent的描述,负责找到对应的组件,将Intent传递给调用的组件并完成组件的调用。因此,Intent起着一种媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。在应用中,我们可以以两种形式来使用Intent:直接Intent,指定了component属性的Intent,通过指定具体的组件类,通知应用启动对应的组件。间接Intent,没有指定component属性的Intent,则需要包含足够的信息,这样系统才能根据这些信息,在所有的可用组件中,确定满足此Intent的组件。

2-2 Activity状态变换路径图

2.2.2 Intent Receiver

Intent Receiver是用于对外部事件的响应,当外部事件发生时,会使用Notification Manager通知用户。当一个Intent Receiver被触发时,系统会在需要的时候启动对应的应用程序。如在本系统中,当用户正在其它界面进行操作时,有好友发送消息过来,就会以通知的形式发送到当前界面的正上方来通知用户。各种应用还可以通过使用ContextBroadcast Intent()将它们的Intent Receiver广播给其它的应用程序,实现应用之间的通讯。

2.2.3 Service

Service是提供连续信息的应用程序。它是运行于应用程序后台的服务,在用户进行其它活动的时候,这个服务将一直运行在基于Android平台的即时通讯系统的研究与实现后台,直到用户停止该服务或服务运行结束。本系统客户端扩展功能就是采用Service来进行设计和开发的。

2.2.4 Content Provider

Content Provider应用程序能够将它们的数据保存到文件、SQL数据库和其它的存储设备中。当应用程序需要使用存储设备中的数据时,可以使用Content Provider来完成。使用Content Provider能够灵活的替换底层使用的存储设备,使开发者可以专著于应用逻辑的开发,不用考虑底层存储设备的细节,从而使应用系统具有良好的数据。

3需求分析

3.1功能需求分析

根据用户需求总结出来的反映了用户需求的系统逻辑模型转换成可以实施的物理模型,把整个设计划分成单元,主要解决如何去做的问题,要想创建整个通讯录首先要通过增加联系人信息来创建通讯录。整个应用程序应划分为4个模块,分别是程序启动、用户界面、后台服务和数据库适配器,各模块之间的关系如图3-1所示:

 

 

图3-1 各模块关系图

从上图中不难看出,后台服务是整个应用程序的核心,主要是“数据获取模块”,负责周期性的从用户输入的内容中获取信息。后台服务在程序启动时就由AppWidgetProvider启动,也可由用户界面通过startService()进行启动,启动后的后台服务将一直保持运行状态。同时用户界面从数据库中获取文本信息。一方面可以避免因网络通信不畅造成界面失去响应;另一方面,后台服务可以及时更新数据,以保证数据的准确性。数据库适配器封装了所有对SQLite数据库操作的方法,用户界面和后台服务会调用它来实现数据库操作。在完成用户界面设计、数据库设计和模块设计后,至此程序设计阶段基本完成。

文本编辑器中不同功能界面之间的切换,用户可以通过点击menu键来切换到不同的功能界面,不同功能界面的切换如图3-2

 

图3-2 不同功能界面切换

3.2性能需求分析

手机软件要有良好的用户体验,良好的用户体验体现在以下几个方面:

(1)界面友好

用户界面要简洁直观,设计合理,方便用户操作,让用户操作起来比较舒服,并且UI视觉效应好。

(2)快速响应

快速处理用户的输入或请求,对于需要长时间处理的部分,在其处理时可以给用户一个提示,告知用户该软件正在运行。

(3)无缝性

一个常见的无缝问题就是一个应用的后台进程(如servicebroadcast receiver)对某事件作出响应而弹出对话框,这看起来并无大碍,特别是当在模拟器上单独地构建和测试系统时。然而,当的应用在真正的设备上运行,后台线程显示对话框时,的应用当时可能没有获得用户焦点。这就会出现的应用会在活动的应用后面显示对话框,或者从当前应用中获得焦点并显示对话框的情况,而管论当时用户正在做什么(如正在打电话等)。那样的行为可能对的应用或用户不起作用。为了避免这些问题,的应用应该利用适当的系统资源——Notification类来通知用户。利用通知,的应用可以通过在状态条上显示一个图标来通知用户事件已经发生,而非获得焦点和打断用户

3.3数据库需求分析

数据结构组织和数据库文件设计要根据不同用途使用要求等,来决定数据的整体组织形式等。

数据库,顾名思义,是存放数据的仓库。只不过这个仓库是在计算机存储设备上,而且数据是按一定的格式存放的。数据库中的数据按一定数据模型组织、描述和存储,具有较小的重复度、较高的数据独立性和易扩展性,并且可以被在一定范围内的各种用户共享。在涉及数据库的软件开发中,需要根据有待解决的问题性质、规模,以及所采用的前端程序创建工具等,做出合适的数据库类型选择,用户数据库是基于SQLite建立。

SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如TclPHPJava等,还有ODBC接口,同样比起MysqlPostgreSQL这两款世界著名开源的数据库管理系统来讲,它的处理速度比他们都快。这也是android的性能优势。

该系统数据库的建立是完全在Android平台上执行Java代码,通过DVM编译来建立的,没有什么辅助工具,由于整个SQLite数据库是非可视化操作,所有对数据库的操作都是通过执行Java代码实现,在完成其查询功能的时候没有使用数据库高级编程,较为麻烦的关节是在如何有机的将客户端数据库整体结构实现出来,实现过程是无可视界面,也没有数据库辅助工具情况下,整个过程很抽象。

3.4安全需求

Android安全中的一个重要的设计点是在默认的情况下应用没有权限执行对其他应用程序,操作系统或用户的有害操作。这些操作包括读取用户的隐私数据,访问网络,保持设备活动等等,应用程序的进程是一个安全的黑盒子,在没有给它权限的时候它不能干扰其他应用程序。

4功能设计

4.1总体设计

一个好的系统设计的步骤决定了程序是否能按照设计者的目的按时完成,是否能在规定的时间内按照设计者的要求高质量的完成程序必要的功能。并且按照标准的设计步骤对程序进行调试,测试,以及后期的优化完善,使程序更加具有健壮性和可用性。通过对通讯录功能、系统模块、用户需求方面进行全方位的分析制定开发流程,开发流程如图4-1所示。

 

图4-1开发流程图

采用标准的开发流程确定系统具有用户管理功能,联系人增删改功能,通讯功能,查找功能,备份等功能。系统的功能图如4-2所示。

图4-2 系统功能图

通过对系统的功能结构的分析,设计后系统运行流程是系统运行用户将进入通讯录主界面,可以看到联系人列表。通过点击MENU界面的增加功能选项可以新增联系人,通过查找按钮可以对联系人进行姓名、号码的操作,通过选择联系人并点击删除键可以对联系人进行删除操作,通过菜单功能可以显示所有联系人、删除所有联系人、并备份SD卡功能。在联系人详细信息界面点击MENU键弹出通讯功能框选择拨打电话按钮或者发信息发邮件按键,系统的运行流程图如4-3所示。

 

 

图4-3 系统运行流程

4.2系统功能设计

根据手机功能调查显示,近十成消费者都会使用手机通讯录功能,随着手机通讯录功能的不断加强与完善,手机通讯录的意义,已不仅仅像电话薄一样显示电话号码,而是向着个性化、人性化的方向发展。通讯录从无到有,从英文到中文,经历了十几年的发展历程,今后的发展趋势就是从通讯录发展为名片夹,也就是在一个联系人之下有手机号码、固话号码、公司、住址、邮箱、备注等内容。手机通讯录扮演着与用户直接交互并且提供服务的重要角色,它需要提供良好的用户体验,方便用户操作,接收用户的操作并把这些操作转换成相应的命令,采用用户活动的方式完成各个服务的逻辑流程。其功能主要包括以下几方面内容。

1、增加、删除、编辑联系人

点击通信录界面中的增加按钮,进入增加联系人界面。输入联系人的基本信息,并可根据用户需求增加个性化信息如头像姓名手机号码办公室电话家庭电话职务职称单位名称地址邮政编码Email其他联系方式备注这些信息,单击确认返回主界面。点击通信录中一个已存在的联系人,进入联系人编辑界面,可修改联系人的资料或进行删除联系人操作,完成后退回到主界面。对列表中联系人的标记,点击menu键弹出功能界面上的删除按键也可进行删除。还可以在菜单上选择删除全部联系人来清空通讯录。在删除联系人的过程中,系统将提示用户是否继续操作,若放弃操作,则联系人信息将继续保存。

2、查找联系人

用户点击menu键打开底部菜单框,底部菜单框为查询联系人提供入口,进入通讯录的缺省页面为联系人列表,在列表中看到所有联系人的姓名、电话信息排列,用户点击查找按键输入联系人基本信息,通讯录显示所有符合查询条件的联系人列表,用户选择一个联系人进入联系人基本信息页面进行其他操作;查询完成,用户按返回键返回主界面。

3、通讯功能

用户在通讯录选择联系人进入联系人详细信息界面,这时点击menu键打开通信功能框,选择打电话、发信息还是发邮件的功能进行操作。

4、菜单功能

通过对menu按键的点击,显示底部菜单框,包含有增加、查找、删除、菜单、返回功能,菜单按键则包含显示所有、删除所有、备份SD卡等实用功能。

4.3系统数据库设计

该程序数据库是在Android平台上执行Java代码,通过DVM编译来建立的,由于整个SQLite数据库是非可视化操作,因此所有对数据库的操作都是通过执行Java代码实现。且表的设计也尽量优化,没有错综复杂的关系,每张表都是独立的,不存在任何约束,因此数据库也是独立数据库。

本系统为了实现文本管理功能需要建立文本信息表database,文本信息表database中需要包含的属性有idnamemobilephoneofficephonefamilyphoneaddressemialcompanyremarkimageid,文本信息表database如表4-1所示:

 

 

表4-1 文本信息表database

属性

数据类型

说明

_id

Integer

自动增加的主键

Name

Integer

姓名

Mobilephone

String[ ]

手机号

Officephone

String[ ]

办公室号

Familyphone

String[ ]

家庭号码

Address

String 

地址

Email

String

邮箱

Company

String

公司地址

Remark

Integer

标记

Imageid

Integer

图片号

5通讯录实现

5.1 Android开发平台搭建

Android的上层应用程序是用Java语言开发,同时还需要基于Dalvik虚拟机,所以,Google公司推荐使用主流的Java继承开发环境Eclipse。只有Eclipse还不够,因为是使用Java语言进行开发,还应该有由SUN公司提供的Java SDK(其中包括JREJava Runtime Environment)。此外,Android的应用程序开发和Java开发有较大区别的,所以还需要有Google提供的Android SDK。同时,还需要在Eclipse安装ADT,为Android开发提供开发工具的升级或者变更,是Eclipse下开发工具的升级下载的工具。

简言之,需要以下软件,才能搭建Android开发环境,从而进行Android应用程序的开发。

(1) Java SDK

(2) Eclipse

(3) Android SDK

(4) ADT

Android开发平台搭建步骤:

1)首先到http://www.eclipse.org/downloads/下载Eclipse集成开发环境并且解压,这里推荐下载Java EE 集成版本。去http://java.sun.com/javase/downloads/index.jsp 站点下载SDK后安装,下载http://dl.google.com/android/android-sdk-windows-1.5_r1.zipAndroid SDK1.5后解压。第一步下载工序就结束了。    (2)双击Eclipse解压后目录中的eclipse.exe然后启动,选择Eclipse菜单中的Help->Install New Software-> Available Software,点击右侧的“Add”输入http://dl-ssl.google.com/android/eclipse/后确定,然后在“Work with”下拉菜单中选择刚才输入的网址。过一会就会出现一个Developer Tools选项,勾上以后点击Next以后Eclipse会自动网上查找Android 开发工具插件,然后要到Android DDMSAndroid Development Tools,选中这两个点击FinishEclipse就会自动下载并安装Android插件了,最后会提示重启Eclipse

3)重启后选择Eclipse菜单中的Windows-> Preferences 在左侧的Android项目中SDK Location中填入Android SDK解压后的目录,然后点击Apply

4)在Windows XP的系统变量中的path变量中添加一个值,该值指向解压后的Android SDK目录下的tools文件夹。

5.2具体功能实现 

5.2.1界面布局

Android的资源文件保存在/res的子目录中。其中/res/drawable/目录中保存的是图像文件,/res/values目录中保存的是用来自定义字符串和颜色的文件,/res/xml目录中保存的是XML格式的数据文件。所有在程序开发阶段可以被调用的资源都保存在这些目录中,在对界面进行绘制时要考虑到不同手机屏幕大小可能不一样,应尽量兼容大多数手机屏幕尺寸,使之显示无障碍。增加界面绘制代码如下:

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent" //宽度为填充

android:layout_height="fill_parent" //高度为填充

android:orientation="vertical"> //方向为垂直

<ScrollView android:layout_weight="4" //比重41

android:id="@+id/ScrollView1"

android:layout_width="fill_parent" //宽度充满父空间

android:layout_height="wrap_content"//根据内容决定高度

android:scrollbars="vertical">//滚动条方向为垂直

<LinearLayout 

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

<LinearLayout

android:id="@+id/widget205"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="10dp"//左边距为10dp

android:layout_marginRight="10dp">

<ImageButton

android:id="@+id/image_button"

android:layout_width="60px"

android:layout_height="60px"

android:src="@drawable/icon"//默认图片

android:scaleType="centerCrop"//按比例缩放图片,保持图片的尺寸比例

></ImageButton>

<EditText 

android:id="@+id/username" 

android:layout_width="fill_parent"

android:layout_height="wrap_content" 

android:scrollbars="vertical"

android:hint="姓名//hint当文本内容为空时,出现的提示信息

android:gravity="top"//置顶垂直排列

android:layout_gravity="center_vertical"//排列居中 />

</LinearLayout>

<LinearLayout 

android:layout_width="fill_parent"

android:layout_height="wrap_content" 

android:orientation="vertical"

android:layout_marginRight="10dp" 

android:layout_marginLeft="10dp">

<TextView 

android:layout_height="wrap_content"

android:layout_width="wrap_content" 

android:text="手机:"

android:textSize="20dp" />

<EditText 

android:id="@+id/mobilephone"

android:layout_width="fill_parent" 

android:layout_height="wrap_content"

android:scrollbars="vertical" 

android:gravity="top" android:hint="手机"

android:phoneNumber="true" />//只能输入数字

</LinearLayout>

<LinearLayout 

android:layout_width="fill_parent"

android:layout_height="wrap_content" 

android:orientation="horizontal"

android:layout_marginLeft="10dp" 

android:layout_marginRight="10dp">

<Button 

android:id="@+id/save"

android:layout_width="wrap_content"

android:layout_height="wrap_content" 

android:layout_weight="1"

android:text="保存"/>

<Button 

android:id="@+id/btn_return"

android:layout_width="wrap_content"

android:layout_height="wrap_content" 

android:layout_weight="1"

android:text="返回"/>

</LinearLayout>

</LinearLayout>

5.2.2增加联系人功能

在通讯录中最主要的功能操作,也就是联系人的添加操作的功能,在联系人增加界面中点击保存按钮实现对联系人信息的保存。首先user类中定义了一个user函数从表单中获取数据,建立数据库帮助类,打开数据库并将user保存到数据库中,增加界面如图5-1所示。

btn_save.setOnClickListener(new OnClickListener(){

public void onClick(View v) {//判断姓名是否为空

String name = et_name.getText().toString();//et_name读取的文本转化为字符串

if(name.trim().equals("")) {//如果读取的字符串为空

Toast.makeText(AddNew.this, "姓名不能为空", Toast.LENGTH_LONG).show();

return;}

//从表单上获取数据

User user = new User();//user类中定义了一个user函数

user.username = name;

user.address = et_address.getText().toString();

user.company = et_company.getText().toString();

user.email = et_email.getText().toString();

user.familyPhone = et_familyPhone.getText().toString();

user.mobilePhone = et_mobilePhone.getText().toString();

user.officePhone = et_officePhone.getText().toString();

user.otherContact = et_otherContact.getText().toString();

user.position = et_position.getText().toString();

user.remark = et_remark.getText().toString();

user.zipCode = et_zipCode.getText().toString();

//判断头像是否改变,若改变,则用当前的位置,若没有改变,则用前一回的位置

if(imageChanged) {

user.imageId = images[currentImagePosition%images.length];} else {

user.imageId = images[previousImagePosition%images.length];}

//创建数据库帮助类

DBHelper helper = new DBHelper(AddNew.this);

//打开数据库

helper.openDatabase();

//user存储到数据库里

long result = helper.insert(user);

//通过结果来判断是否插入成功,若为-1,则表示插入数据失败

if(result == -1 ) {

Toast.makeText(AddNew.this, "添加失败", Toast.LENGTH_LONG);}

setTitle("用户添加成功!");

setResult(3); //返回到上一个Activity,也就是Main.activity

finish();//销毁当前视图}});

 

图5-1 增加联系人界面

5.2.3删除联系人功能

通过光标选择删除的联系人,点击联系人然后选择删除可以删除联系人,并且在数据库中删除联系人,删除联系人功能如图5-2所示。

if(deleteId == null || deleteId.size() == 0) {

Toast.makeText(Main.this, "没有标记任何记录\n长按一条记录即可标记", Toast.LENGTH_LONG).show();} else {

new AlertDialog.Builder(Main.this)

setTitle("确定要删除标记的"+deleteId.size()+"条记录吗?")

.setPositiveButton("确定", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

DBHelper helper = new DBHelper(Main.this);

helper.deleteMarked(deleteId);

list = helper.getAllUser(privacy); //重置视图

adapter =new SimpleAdapter(Main.this, list, R.layout.listitem,                                                newString[]{"imageid","name","mobilephone"}, 

new int[]{R.id.user_image,R.id.tv_name,R.id.tv_mobilephone});

lv.setAdapter(adapter);

deleteId.clear();}})

.setNegativeButton("取消", null)

.create()

.show(); }

break;

图5-2 删除联系人界面

5.2.4查找联系人功能

在查找功能实现的过程中,我先将搜索框中的内容转化为字符串形式,如果输入为空就设置显示所有联系人的列表,否则就建立一个数据库帮且类,在数据库中进行查找匹配,返回到list列表中,将整合的adapterlistview结合展现出来,并统计查找到的条数展现给用户。

private void loadSearchLinearout() {

if(searchLinearout == null) {

searchLinearout = (LinearLayout) findViewById(R.id.ll_search);//通过ID找到searchLinearout的布局

et_search = (EditText)findViewById(R.id.et_search);//通过ID找到et_search的布局

et_search.setOnKeyListener(new OnKeyListener(){//设置et_search的监听器

public boolean onKey(View arg0, int arg1, KeyEvent arg2) {

String condition = et_search.getText().toString();//获取et_search输入框的输入内容

if(condition.equals("")) {//如果输入的为空

lv.setAdapter(adapter);//设置显示所有数据的listview列表的适配器}

DBHelper helper = new DBHelper(Main.this);//获取数据库对象

list = helper.getUsers(condition,privacy);//获取用户列表

SimpleAdapter searchAdapter = 

new SimpleAdapter(Main.this, list, R.layout.listitem, 

new String[]{"imageid","name","mobilephone"}, 

new int[]{R.id.user_image,R.id.tv_name,R.id.tv_mobilephone});

lv.setAdapter(searchAdapter);  //将整合好的adapter交给listview,显示给用户看

if(list.size() == 0) {

Drawable nodata_bg = getResources().getDrawable(R.drawable.nodata_bg);//获取图片资源

mainLinearLayout.setBackgroundDrawable(nodata_bg);//设置layout的背景

setTitle("没有查到任何数据");

} else {setTitle( "共查到 " + list.size()+" 条记录");

mainLinearLayout.setBackgroundDrawable(null);}

return false;}});}}

5.2.5 Menu底部菜单框功能

下面我们将介绍menu的触发方式,通过对menu的介绍,我们将了解menu功能设计,对menu键的使用首先要建立menu菜单,为每个菜单选项绑定了一个图标和文字,代码如下底部菜单如图5-3所示。

String[] bottom_menu_itemName = { "增加", "查找", "删除", "菜单","退出" };

String fileName;

int[] bottom_menu_itemSource = {

R.drawable.menu_new_user, 

R.drawable.menu_search, 

R.drawable.menu_delete, 

R.drawable.controlbar_showtype_list,                R.drawable.menu_exit, };//选择功能图片

响应menu点击事件时设置底部菜单是否可见,

public boolean onKeyDown(int keyCode, KeyEvent event) {

if(keyCode == KeyEvent.KEYCODE_MENU) {//如果点击menu

loadBottomMenu();//载入menu功能

if(bottomMenuGrid.getVisibility() == View.VISIBLE) {//设置可视

if(searchLinearout != null && searchLinearout.getVisibility() == View.VISIBLE) {//如果选择不为空且视图为可视

searchLinearout.setVisibility(View.GONE);//设置可视视图不显示}

bottomMenuGrid.setVisibility(View.GONE);//设置底部视图不显示

} else {

bottomMenuGrid.setVisibility(View.VISIBLE);//设置底部视图为可见

}}

return super.onKeyDown(keyCode, event);//返回一个点击的结果

}

 

图5-3 menu底部菜单

再监听底部菜单选项,代码如下:

bottomMenuGrid.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

switch (arg2) {

case 0: {/*增加*/}

case 1: {/*查找*/}

case 2: {/*删除*/}

case 3: {/*菜单*/}

case 4: {/*退出*/}

5.2.6 通信功能

下面的程序定义了用户打电话,发邮件,发短信的功能,如下的代码主要是运用了android操作系统自定义接口,运用这些接口可以实现用户的打电话、发短信、发邮件的功能。

首先定义了menu键,为menu添加了三个选项,并且为每一个item设置图标功,通讯功能如图5-4

 

图5-4 通信功能界面

当建立好menu键以后为每一个MenuItem添加事件,添加了三个事件,代码功能如下:

public boolean onMenuItemSelected(int featureId, MenuItem item) {

//设置menu键选择功能

switch(item.getItemId()){通过switch选择不同的id

case Menu.FIRST: {

//将状态设置为打电话

status = Intent.ACTION_CALL; 

if(callData == null) {//加载可用的号码

loadAvailableCallData();//加载电话号码

}if(callData.length == 0) {//提示没有可用的号码

Toast.makeText(this, "没有可用的号码!", Toast.LENGTH_LONG).show();

} else if(callData.length == 1) {

//如果之有一个可用的号码,这直接使用这个号码拨出

Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel://" + callData[0]));

//设置一个新的intent对象

startActivity(intent);//开始活动事件

} else {

//如果有2个或者2个以上号码,弹出号码选择对话框

initNumChooseDialog();//选择号码

}break;//跳出

}

case Menu.FIRST+1: {

status = Intent.ACTION_SENDTO; //将状态设置为发短信

if(callData == null) {//如果号码为空

loadAvailableCallData();//载入号码

}if(callData.length == 0) {//提示没有可用的号码

Toast.makeText(this, "没有可用的号码!", Toast.LENGTH_LONG).show();

} else if(callData.length == 1) {

//如果之后又一个可用的号码,这直接使用这个号码拨出

Intent intent = new Intent(Intent.ACTION_SENDTO,Uri.parse("smsto://" + callData[0])); //设置一个新的intent对象

startActivity(intent); //开始活动事件

} else {

initNumChooseDialog();}//初始化号码

break;}

case Menu.FIRST+2: {

if(user.email.equals("")) {

Toast.makeText(this, "没有可用的邮箱!", Toast.LENGTH_LONG).show();

} else {

Uri emailUri = Uri.parse("mailto:" + user.email);//设置uri为发送邮件的uri

Intent intent = new Intent(Intent.ACTION_SENDTO, emailUri);

//设置一个新的intent对象

startActivity(intent);//开始活动

}break;//退出}}

return super.onMenuItemSelected(featureId, item);

//返回menu选择功能}

5.2.7显示所有、删除所有及备份功能

bottom_menu 中菜单功能键中包含有显示所有、删除所有、以及备份SD卡功能,显示所有与联系人列表界面的思路一致,创建一个数据库帮助类从数据库中获得所有用户的信息放到list,通过setAdapterlistviewadapter相结合展示出来。删除所有是数据库中deleteAll这个方法将数据全部删除。备份文件时先AlertDialog.Builder来提示是否需要备份记录到SD卡,如果点击确定就通过helper.backupData(privacy);在数据库中执行备份的方法。详细代码如下。显示所有,删除所有,备份功能如图5-5

mainMenuGrid.setOnItemClickListener(new OnItemClickListener(){

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,

long arg3) {switch(arg2){

case 0:{

DBHelper helper = new DBHelper(Main.this);

list = helper.getAllUser(privacy);

adapter = new SimpleAdapter(  Main.this, list,R.layout.listitem, 

new String[]{"imageid","name","mobilephone"}, 

new int[]{R.id.user_image,R.id.tv_name,R.id.tv_mobilephone});

lv.setAdapter(adapter);//显示所有数据

mainMenuDialog.dismiss();

break;}

case 1:{

AlertDialog.Builder builder  = new AlertDialog.Builder(Main.this);

confirmDialog = builder.create();

builder.setTitle("是否删除所有!?");

builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

DBHelper helper = new DBHelper(Main.this);

helper.deleteAll(0);

list = helper.getAllUser(privacy);

adapter = new SimpleAdapter(Main.this,list,        R.layout.listitem, 

new String[]{"imageid","name","mobilephone"}, 

new int[]{R.id.user_image,R.id.tv_name,R.id.tv_mobilephone});

lv.setAdapter(adapter);//显示所有数据

mainMenuDialog.dismiss();}});

builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) 

{confirmDialog.dismiss();}});

builder.create().show();

break;}

case 2:{

mainMenuDialog.dismiss();

new AlertDialog.Builder(Main.this)

.setTitle("是否需要备份记录到SD卡?")

.setPositiveButton("确定", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

LayoutInflater li = LayoutInflater.from(Main.this);

View backup_view = li.inflate(R.layout.backup_progress, null);

progressDialog =new AlertDialog.Builder(Main.this)

.setTitle("备份正在进行中...")

.setView(backup_view)

.create();

progressDialog.show();

DBHelper helper = new DBHelper(Main.this);

helper.backupData(privacy);

ProgressBar bar = (ProgressBar) backup_view.findViewById(R.id.pb_backup);

Button btn_backup_ok = (Button)backup_view.findViewById(R.id.btn_backuup_ok);

bar.setMax(list.size());

for(int i=0;i<=list.size();i++) {

bar.setProgress(i);}

progressDialog.setTitle("备份完成!一共 "+ list.size() + " 条记录");

btn_backup_ok.setVisibility(View.VISIBLE);

btn_backup_ok.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

progressDialog.dismiss();

mainMenuDialog.dismiss();}});}})

.setNegativeButton("取消", null)

.create().show();break; }

 

 

图5-5 显示所有、删除所有、备份功能

5.2.8数据库操作实现

为了实现联系人在数据库中的增加,删除,查找等操作,使用操作数据库的核心类android.database.sqlite.SQLiteDatabase。使用SQLiteOpenHelper的子类来完成创建、打开数据库及各种数据库的操作。数据库的类继承函数,显示了数据库类的继承关系:

class MyDBHelper extends SQLiteOpenHelper { 

public MyDBHelper(Context context, String name,

int version) {//公共的MyDBHelper对象

super(context, name, null, version);//继承上面的}

我在数据库中运用了openDatabase的方法来打开数据库。

public void openDatabase() {

if(dbInstance == null) {

myDBHelper = new MyDBHelper(context,DB_DBNAME,VERSION);

dbInstance = myDBHelper.getWritableDatabase();}

实现联系人信息插入数据库中我设置了一个新的ContentValues,通过user对象把联系人信息存储在values

public long insert(User user) {

ContentValues values = new ContentValues();//设置一个新的容器的对象

values.put("name", user.username); 

values.put("mobilephone", user.mobilePhone); 

values.put("officephone", user.officePhone); 

values.put("familyphone", user.familyPhone); 

values.put("address", user.address); 

values.put("othercontact", user.otherContact); 

values.put("email",user.email); 

values.put("position", user.position); 

values.put("company", user.company); 

values.put("remark", user.remark); 

values.put("imageid", user.imageId);//储存用户相关信息

return dbInstance.insert(DB_TABLENAME, null, values);//用户插入数据表的信息}

为了解决用户菜单操作中删除联系人,我在数据库中调用delete函数在DB_TABLENAME中进行删除:

public void delete(int _id) {//删除联系人

dbInstance.delete(DB_TABLENAME,"_id=?", new String[]{String.valueOf(_id)});}

当用户通过长点击对要删除的联系人进行标记,然后对标记的数据进行彻底的删除操作。我新建了一个StringBuffer,将删除联系人的id存储进去,并调用delete函数来删除StringBuffer中所有数据,具体代码如下:

public void deleteMarked(ArrayList<Integer> deleteId) {//删除标记的用户信息

StringBuffer  strDeleteId = new StringBuffer();//新建一个缓冲对象

strDeleteId.append("_id=");//存储要删除联系人的id

for(int i=0;i<deleteId.size();i++) {//设置for循环函数

if(i!=deleteId.size()-1) {//如果i为真

strDeleteId.append(deleteId.get(i) + " or _id=");//删除联系人} else {

strDeleteId.append(deleteId.get(i));}}

dbInstance.delete(DB_TABLENAME, strDeleteId.toString(), null);//在数据库中删除联系人

System.out.println(strDeleteId.toString());//显示删除后的联系人}

文件的查找操作可以通过对数据库的查找来实现,从数据库中查找到符合条件的联系人返回到list,将整合好的adapter交给listview显示出来,具体代码如下:

public ArrayList getUsers(String condition, boolean privacy) {

ArrayList list = new ArrayList();String strSelection = "";

String sql = "select * from " + DB_TABLENAME + " where 1=1 and (name like '%" + condition + "%' " +

"or mobilephone like '%" + condition + "%' or familyphone like '%" + condition + "%' " +

"or officephone like '%" + condition + "%')" + strSelection;

Cursor cursor = dbInstance.rawQuery(sql, null);

while(cursor.moveToNext()) {HashMap item = new HashMap();

item.put("_id", cursor.getInt(cursor.getColumnIndex("_id")));

item.put("name", cursor.getString(cursor.getColumnIndex("name")));

cursor.getInt(cursor.getColumnIndex("imageid")));

list.add(item);//放进list里面}return list;

6系统测试

6.1系统测试用例

系统测试就是利用测试工具按照测试方案和流程对产品进行功能和性能测试,根据需要编写不同的测试工具,设计和维护测试系统,对测试方案可能出现的问题进行分析。根据功能需求和性能需求制定以下测试用例,测试用例如表6-1所示。

表6-1 测试用例

ID

用例描述

操作步骤

预期结果

实际结果

1

联系人增加功能

1、选择联系人头像 

2、输入联系人相关信息

3、跳转联系人列表界面

能实现联系人增加功能

符合预期

2

联系人删除功能

1、联系人详细信息界面删除

2、通过底部菜单删除键删除

3、对联系人进行标记

 4、删除全部联系人

联系人信息成功删除

符合预期

 

3

联系人查找功能

1、输入要查找联系人的相关信息进行查找

成功查找出符合条件的联系人

符合预期

4

通讯功能

1、联系人详细信息界面点击menu弹出通讯功能界面

2、通过对号码和邮箱的识别进行相应的操作

成功实现联系人打电话、发信息、发邮件功能

符合预期

5

通讯录底部菜单功能

1、 增加联系人

2、 查找联系人

3、 删除联系人

4、 菜单

5、 退出

功能键实现

符合预期

6

菜单功能

1、 显示全部

2、 备份SD

3、 删除全部

显示全部联系人,成功备份SD卡,成功删除全部联系人

符合预期

6.2系统测试结果

6.2.1系统测试方法  

测试过程按4步骤进行,即单元测试、集成测试、确认测试和系统测试及发版测试。 

开始是单元测试,集中对用源代码实现的每一个程序单元进行测试,检查各个程序模块是否正确地实现了规定的功能。 

集成测试把已测试过的模块组装起来,主要对与设计相关的软件体系结构的构造进行测试。 

确认测试则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求,以及软件配置是否完全正确。

系统测试把已经经过确认的软件纳入实际运行环境中,与其它系统成份组合在一起进行测试。

6.2.2 编辑联系人功能测试

联系人详细界面中有修改、删除和返回按钮,在选择修改功能后,联系人的所有信息处于可编辑状态,手机号码和固定电话则被EditView设置为只可输入数字,修改完后点击确定按键,触发确定按键点击监听事件,从而对数据库中该联系人信息进行更改,然后自动返回联系人浏览界面。在联系人列表中选择某个联系人点击查看联系人详细信息,联系人手机、办公室电话、家庭电话、职务称等一览无遗,同时在联系人详细信息界面下面会出信功能键,这时的联系人信息是不能操作的,如果想要对联系人进行修改点击修改功能键对联系信息进行修改。测试结果如图6-1编辑联系人界面。

图6-1 编辑联系人界面

6.2.3 查找联系人功能测试

如图6-2查找联系人界面,在联系人列表显示中,输入姓名或者号码对联系人进行查找,程序自动筛选符合条件的联系人,如果没有符合条件的联系人则不显示。

图6-2 查找联系人界面

6.2.4 删除联系人功能测试

如图6-3删除界面在系统测试中对联系人进行删除操作时,可以通过对底部菜单框中删除按键的点击,或者联系人详细信息界面中删除按键点击,出现提示框询问“是否要删除”。

 

图6-3 删除界面

如图6-4头像选择框,在对进行用户信息增加时,点击用户头像按钮,弹出用户头像选择框: 

 

图6-4 头像选择框

6.2.5 备份功能测试

点击底部菜单的菜单按钮,事件响应菜单中包含显示所有、删除所有、以及备份SD卡选项,菜单功能界面如图6-5所示。当点击备份SD卡功能时,会出现提示功能框“是否需要备份记录到SD卡?”如图6-6所示。按照提示选择确定或者取消,选择确定,备份成功并统计备份条数:

 

图6-5 菜单功能界面

 

图6-6 备份提示框

6.2.6 通讯功能测试

在用户在通讯录选择联系人进入联系人详细信息界面,这时点击menu键打开通信功能框如图6-8,然后选择打电话、发信息还是发邮件的功能通过接口套用识别号码跳转到相应的功能。

 

图6-7 通信功能框

6.3测试总结

通过对本系统进行的多次的测试,系统正确实现了对联系人增加、删除、查找、修改、备份、显示所有、删除所有、发信息、打电话、发邮件等操作,实现了用户对通讯录的基本要求。在测试过程中对程序细节上出现的漏洞进行修补,系统运行的稳定性基本达到要求,运行结果比较良好。在整个工程的构思方面还存在着不足,这些问题还需要今后逐一解决。与此同时,这个软件还可以进一步扩展,带给用户更好的体验与生活的便捷。

结束语

在系统开发过程中,对Android的学习比想象的要困难的多,为了在短时间内投入到开发,完成系统。需要大量的时间去学习,我在图书馆借阅了相关开发的书籍,照着上面去学习,以最快的速度学习Android,掌握开发中的各种控件的使用。本文主要研究了Android平台的架构以及在Android平台上手机通讯录功能的实现。    本文在Android平台以及在该平台上开发手机通讯录上做了大量的工作,但因个人能力有限,还有很多问题需要实现和解决,现对未来可以进行的工作做出以下几点展望   (1)本文实现的通讯录是基于Android平台进行开发的,但是还未能真正解析Android的精髓,系统的界面设计也不是很完善,对Android平台进一步研究能够使系统在设计方面更加快捷和完善。    (2)本文所开发的系统目前还只是在模拟器上进行运行,还有待移植到真机上进行进一步研究。相信随着研究的进一步深入,这些问题会逐步得到解决,相信基于Android手机通讯录类应用软件会有很好的应用前景。 

这次系统的开发对我来说是一个挑战,对于从来没接触过Android的我经过努力,现在程序运行良好,基本功能得以实现。这一次的系统开发让我受益匪浅,我相信它会对我以后的人生和工作都起到很好的促进作用,有着积极的影响。

 

参考文献

 

[1]靳岩姚尚朗. Google Android 开发入门与实战[M]. 北京人民邮电出版社, 2009: 1-12

[2]景保玉. 2010中国移动应用开发现状与趋势大调查[M]. 北京人民邮电出版社, 2011: 2-19

[3]()Herbert Schildt.Java 参考大全[M]. 北京清华大学出版社, 2008: 9-11

[4]()鲍格斯坦(Bergsten,H.林琪朱涛江 .JSP设计(第三版)[M]. 北京中国电力出版社2004: 12-28

[5]高昂支持动态语言的Android平台[M]. 北京人民邮电出版社, 2009: 5-7 

[6]郭志宏. Android应用开发详解[M]. 北京电子工业出版社, 2010: 6-21

[7]韩超梁泉. Android 系统开发原理及开发要点详解[M]. 北京电子工业出版社, 2010: 1-11

[8]李宁. Android/OPhone 开发完全讲义[M/CD]. 北京水利水电出版社, 2010: 6-19

[9]余志龙Google Android SDK 开发范例大全(2)[M]. 北京人民邮电出版社2010: 6-6

[10]公磊周聪. Android的移动应用终端应用程序开发与研究[J]. 南昌计算机与现代化, 2008: 8: 85-89

[11]高焕堂Android应用框架原理与程式设计36[M]. Google公司, 2008: 2-22

[12] ()梅尔Android 2高级编程(2)[M]. 北京清华大学出版社2010: 12-12

[13]Dautenhahn.Kerstin.Methodology and themes of human-robot interactionA growing research field[J]. Apress:International Journal of Advanced Robotic Systems2007103-108

[14] Mehran SahamiProgramming Methodology[M]. Apress:the Experts Voice, 2008: 4-12 

[15] Julie Zelenski. Programming Abstractions[M]. Apress: the Experts Voice, 2010: 3-16

[16]Haseman Chris.Android Essentials[M]. Apress: the Expert’s Voice, 2009: 8-22

[17]DiMarzia Jerome.A Programmer’s Guide[M]. McGraw-Hill: the Experts Voice, 2008: 4-11

[18]王向辉张国印沈洁. Android应用程序开发[M]. 北京清华大学出版社, 2010: 3-3

[19]张孝祥. java就业培训教程[M]. 北京清华大学出版社, 2007: 7-22

[20]E2ECloud工作室深入浅出Google Android [M]. 北京人民邮电出版社, 2009: 8-11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

附录

/*响应单击事件,单点击某一个选项的时候,跳转到用户详细信息页面*/

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

HashMap item = (HashMap)arg0.getItemAtPosition(arg2);

int _id = Integer.parseInt(String.valueOf(item.get("_id")));

Intent intent = new Intent(Main.this,UserDetail.class);

User user = new User();

user._id = Integer.parseInt(String.valueOf(item.get("_id")));

user.address = String.valueOf(item.get("address"));

user.company = String.valueOf(item.get("company"));

user.email = String.valueOf(item.get("email"));

user.familyPhone = String.valueOf(item.get("familyphone"));

user.mobilePhone = String.valueOf(item.get("mobilephone"));

user.officePhone = String.valueOf(item.get("officephone"));

user.otherContact = String.valueOf(item.get("othercontact"));

user.position = String.valueOf(item.get("position"));

user.remark = String.valueOf(item.get("remark"));

user.username = String.valueOf(item.get("name"));

user.zipCode = String.valueOf(item.get("zipcode"));

user.imageId = Integer.parseInt(String.valueOf(item.get("imageid")));

intent.putExtra("user", user);//

if(searchLinearout != null && searchLinearout.getVisibility()==View.VISIBLE) {

searchLinearout.setVisibility(View.GONE);}

startActivityForResult(intent, arg2);

}

});

lv.setCacheColorHint(Color.TRANSPARENT); 

lv.setOnItemLongClickListener(new OnItemLongClickListener(){

@Override

public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

if(deleteId == null) {

deleteId = new ArrayList<Integer>();}

HashMap item = (HashMap)arg0.getItemAtPosition(arg2);

Integer _id = Integer.parseInt(String.valueOf(item.get("_id")));

RelativeLayout r = (RelativeLayout)arg1;

ImageView markedView = (ImageView)r.getChildAt(2);//

if(markedView.getVisibility() == View.VISIBLE) {

markedView.setVisibility(View.GONE);

deleteId.remove(_id);

else {markedView.setVisibility(View.VISIBLE);

deleteId.add(_id);}

return true;}

       });

Drawable bgDrawable = getResources().getDrawable(R.drawable.list_bg);

lv.setSelector(bgDrawable);       }

 

/*定义界面跳转的参数*/

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);//清除deleteId的内容

if(deleteId != null) {

deleteId.clear();

}/*resultCode==3时代表添加了一个用户返回,当resultCode==4的时候代表修改了用户,或者删除了用户,其他条件代表数据没有变化*/

if(resultCode == 3 || resultCode == 4) {

DBHelper helper = new DBHelper(this);

list = helper.getAllUser(privacy);

dapter = new SimpleAdapter(

          this, 

          list, 

          R.layout.listitem, 

          new String[]{"imageid","name","mobilephone"}, 

          new int[]{R.id.user_image,R.id.tv_name,R.id.tv_mobilephone});

if(list.size() > 0){

        mainLinearLayout.setBackgroundDrawable(null);

        }}

lv.setAdapter(adapter); 

/* resultCode只有345当等于4或者5的时候,代表由UserDetail转过来的。在转向UserDetail的时候,requestCode的值设置的是选中项的位置*/

if(resultCode == 3) {

lv.setSelection(list.size());

} else {

lv.setSelection(requestCode);

}

}

 

/*修改按键的响应*/

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.userdetail);

Intent intent = getIntent();

user = (User) intent.getSerializableExtra("user");

loadUserData();

setEditTextDisable();

btn_save.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View arg0) {

if(!flag) {

btn_save.setText("保存修改");

setEditTextAble();

flag = true;

} else {

setTitle("modify");

modify();

setEditTextDisable();

setColorToWhite();

btn_save.setText("修改");

flag = false;

}

}});

 

致谢

从论文选题到搜集资料,从写稿到反复修改,期间经历了喜悦、聒噪、痛苦和彷徨,在写作论文的过程中心情是如此复杂。如今,伴随着这篇毕业论文的最终成稿,复杂的心情烟消云散,自己甚至还有一点成就感。

本论文是在导师的悉心指导下完成的。导师渊博的专业知识,严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,严以律己、宽以待人的崇高风范,朴实无华、平易近人的人格魅力对我影响深远。不仅使我树立了远大的学术目标、掌握了基本的研究方法,还使我明白了许多待人接物与为人处世的道理。本论文从选题到完成,每一步都是在导师的指导下完成的,倾注了导师大量的心血。在此,谨向导师表示崇高的敬意和衷心的感谢!

其次我要感谢滁州学院信息学院的全体老师们,“不积跬步无以至千里”,这次毕业论文能够最终顺利完成,归功于各位老师两年来的认真负责,使我能够很好的掌握专业知识,并在毕业论文中得以体现。也正是你们长期不懈的支持和帮助才使得我的毕业论文最终顺利完成。

最后我要向论文评审组的老师们表示感谢,感谢你们百忙之中评阅我的论文,并给予我指导性的建议。

 

展开阅读全文

没有更多推荐了,返回首页