安卓聊天APP的设计与实现
摘要
Android在2007年由谷歌发布,移动即时通讯凭借便利快捷的用户体验在即时通讯市场大受欢迎。这个互联网时代产业的新鲜血液凭借着自身优势在互联网市场中的地位越来越重要。
聊天工具的主要功能是为基于互联网的客户端提供实时语音、文字传输的服务,它又可以被叫做IM工具或者IM软件。聊天工具所提供的服务是一种实时通讯服务,这种服务可以让用户在网络上创建某种私人聊天室。本课题的主题就是开发即时通讯的聊天软件,该软件基于互联网络开发出来,具有界面简洁,易于操作的优点。该软件的主要功能为:注册、登录、一对一聊天以及群组聊天。用户之间可以在该即时通信工具中通过服务器转发数据实现用户端之间的相互通信。
本文在认真分析了目前聊天App的未来发展之后,展望发展前景后,对系统进行了设计、实现、测试。该系统具有便利实用、操作方便、界面友好等优点。
关键词:Android 即时通信 聊天软件
Design and Implementation of Android Chat APP
Abstract
Since Google released Android in 2007, the convenient and fast user experience has made mobile instant messaging the new favorite of the instant messaging market. As an emerging industry in the Internet era, instant messaging is occupying an increasingly important position in the entire Internet market.
Chat tools, also known as IM software or IM tools, mainly provide clients based on the Internet for real-time voice and text transmission. This is a real-time communication service that allows users to establish a certain kind of private chat room on the Internet. This topic mainly studies the mobile chat system based on Android, and develops a simple interface and easy-to-operate instant communication chat software. Main functions: user registration, login, friend-one-to-one chat, group chat. In this instant messaging tool, clients communicate with each other through data forwarding by the server.
After analyzing the development prospects of the chat App in the current environment, this article designs and implements the system, and conducts a complete test of the system. The system has the characteristics of friendly interface, simple operation, convenient and practical.
Keywords: Android instant messaging chat software
目录
1.绪论
1.1开发背景
第一章 绪论
1.1开发背景
网络应用在移动网络通信方面得到了重要的体现。该聊天系统主要适用于客户端与客户端通过服务器的信息传输。本聊天程序使跨距离的交流更加方便和快捷,更能高效率的体现现代即时通信的特点。
安卓是Android的中文名字,其最初的含义是指机器人,在2007年,Google公司声明安卓作为开源手机操作系统的名字,从那以后Android常常以操作系统的身份出现在人们视野。Android操作系统得益于开放性、开源性的特点,促使大量安卓应用软件的诞生。
目前安卓聊天软件通常分为两种架构模式:(一)B/S架构:浏览器/服务器模式,省去了下载客户端软件这一步,直接在浏览器上使用类似于客户端的界面来进行信息的发送与接收。较为常见的有:微信网页版,webQQ等; (二)C/S架构:∶客户/服务器模式,用户先下载客户端软件,通过客户端软件来进行信息的交流。较为常见的有:QQ、微信、陌陌、YY等。
1.2课题意义
在互联网飞速发展的今天,“网虫”在互联网上聊天已经成为一种习惯,IM程序设计就是一个多点通信程序,C/S体系架构在软件开发中越来越流行,应用软件使用这种架构可以充分发挥数据库系统优势,速度更快,从用户体验的角度来更好的满足人们对聊天软件的需求,有一个前提,频宽充足,大部分IM服务事实上提供实时通讯的能力。实时传讯与电子邮件最大的不同在于不用等候,不需要每隔两分钟就按一次“传送与接收”,只要两个人都同时在线,就能像多媒体电话一样,传送文字、档案、声音、影像给对方,只要有网络,无论对方隔得多远都没有距离。
本论文将对基于Android的聊天软件系统进行可行性分析、实现设计、界面设计、关键代码编写、应用功能优化、系统测试等工作,实现登录功能、向XMPP服务器发送信息包功能、用户好友通讯录获取及相关管理功能、个人信息管理功能、好友文字。因此本课题具有重要的实际意义和应用价值。
1.3研究内容
第一章:绪论。主要描述项目的背景、产品的现实意义、未来发展前景,简单介绍常见一些线上聊天方式、聊天软件,分析了为什么需要开发这样一款软件的原因,最后指出论文的主要工作。
第二章:对Android的架构作了系统的分析,从Android的特征,工作机制,对需求进行分析,来体现Android的优势。
第三章:系统设计,对软件的功能进行概要分析,同时从系统逻辑和物理流程图来清晰的展现全局,系统所包含的模块各个功能进行详细的介绍。
第四章:系统实现,从服务端和客户端两方面入手,主要对聊天、通讯录、设置的功能模块条目进行详尽的介绍,以及功能和软件实现的关键代码的呈现。
第五章:系统测试。展示系统的测试用例和系统各功能的运行情况。
第六章:反思与展望。陈述软件存在的缺陷与不足,介绍完成整个项目的经验,对软件未实现的新功能展开假设与设想。
1.4本章小结
本章着重阐述了这款应用软件的开发背景、课题意义和研究内容。有了上述三个部分的介绍,为接下来的需求分析做好铺垫。
第二章 Android的架构分析
Android一词的英文本义指‘机器人’,它是Google公司于2007年11月宣布的基于Linux 平台的开源手机操作系统,该平台由操作系统,中间件,用户界面和应用软件组成,为移动终端打造的真正开放和完整的移动软件平台。目前主流的应用在手机操作系统还有IOS,BlackBerry,Symbian.这些操作系统都大同小异,用于移动智能终端设备。
2.1 Android概述
Android 是一个开源的,基于 Linux 的移动设备操作系统,如智能手机和平板电脑。Android 是由谷歌及其他公司带领的开放手机联盟开发的。 Android 提供了一个统一的应用程序开发方法,这意味着开发人员只需要为 Android 进行开发,这样他们的应用程序就能够运行在不同搭载 Android 的移动设备上。
Android 开发优势
开放源代码
众多开发者及强大的社区
不断增长的市场
国际化的 App 集成
低廉的开发成本
更高的成功几率
丰富的开发环境
2.2 技术介绍
2.2.1 软件开发的工具和环境
开发环境: Android studio
开发语言:Java、XML
模拟器平台:AVD
手机运行平台: Android2.0及以上版本
开发软件辅助的插件:SDK、JDK
2.2.2 Android studio介绍
它是谷歌发布的一款Android集成开发工具,是一个新的Android开发环境,类似于eclipse,并且提供了集成的Android开发工具用来开发和调试。
2.2.3安装SDK和JDK
SDK安装:在安装Android studio时,会顺带安装SDK,注意SDK安装时要设置相应的路径。
JDK安装:根据电脑的系统配置,在oracle官网下载相应的JDK,下载完后再电脑上进行安装。安装完成,以Windows操作系统为例,进入DOS系统将位置切换到安装Java目录的bin文件,输入Java,查看是否成功安装。上述正常,接着配置Java。在桌面找到计算机(不同电脑名称有所不同),打开属性-高级系统设置-环境变量,(1)系统变量中添加系统变量,变量名:JAVA_HOME,变量值填下载时相应的路径;(2)修改系统变量path,双击path值进入编辑模式,新建%JAVA_HOME%\bin、%JAVA_HOME%jre \bin点击确定;(3)再添加一个系统变量,变量名: CLASS_PATH,变量值为。;JAVA_HOME%\libldt.jar;%JAVA_HOME% \lib\tools.jar;。完成上面三步,再次进入DOS系统,输入Java进行验证是否配置成功。
2.3 Android架构
Android的系统架构采用了分层架构的思想,如图所示。从上层到底层共包括四层,分别是应用程序层,应用程序框架层,系统库和运行时,Linux内核。
分层架构图
Linux内核
在所有层的最底下是 Linux - 包括大约115个补丁的 Linux 3.6。它提供了基本的系统功能,比如进程管理,内存管理,设备管理(如摄像头,键盘,显示器)。同时,内核处理所有 Linux 所擅长的工作,如网络和大量的设备驱动,从而避免兼容大量外围硬件接口带来的不便。
程序库
在 Linux 内核层的上面是一系列程序库的集合,包括开源的 Web 浏览器引擎 Webkit ,知名的 libc 库,用于仓库存储和应用数据共享的 SQLite 数据库,用于播放、录制音视频的库,用于网络安全的 SSL 库等。
Android程序库
这个类别包括了专门为 Android 开发的基于 Java 的程序库。这个类别程序库的示例包括应用程序框架库,如用户界面构建,图形绘制和数据库访问。一些 Android 开发者可用的 Android 核心程序库总结如下:
android.app - 提供应用程序模型的访问,是所有 Android 应用程序的基石。
android.content - 方便应用程序之间,应用程序组件之间的内容访问,发布,消息传递。
android.database - 用于访问内容提供者发布的数据,包含 SQLite 数据库管理类。
android.opengl - OpenGL ES 3D 图片渲染 API 的 Java 接口。
android.os - 提供应用程序访问标注操作系统服务的能力,包括消息,系统服务和进程间通信。
android.text - 在设备显示上渲染和操作文本。
android.view - 应用程序用户界面的基础构建块。
android.widget - 丰富的预置用户界面组件集合,包括按钮,标签,列表,布局管理,单选按钮等。
android.webkit - 一系列类的集合,允许为应用程序提供内建的 Web 浏览能力。
看过了 Android 运行层内的基于 Java 的核心程序库,是时候关注一下 Android 软件栈中的基于 C/C++ 的程序库。
Android运行时
这是架构中的第三部分,自下而上的第二层。这个部分提供名为 Dalvik 虚拟机的关键组件,类似于 Java 虚拟机,但专门为 Android 设计和优化。Dalvik 虚拟机使得可以在 Java 中使用 Linux 核心功能,如内存管理和多线程。Dalvik 虚拟机使得每一个 Android 应用程序运行在自己独立的虚拟机进程。Android 运行时同时提供一系列核心的库来为 Android 应用程序开发者使用标准的 Java 语言来编写 Android 应用程序。
应用框架
应用框架层以 Java 类的形式为应用程序提供许多高级的服务。应用程序开发者被允许在应用中使用这些服务。
活动管理者 - 控制应用程序生命周期和活动栈的所有方面。
内容提供者 - 允许应用程序之间发布和分享数据。
资源管理器 - 提供对非代码嵌入资源的访问,如字符串,颜色设置和用户界面布局。
通知管理器 - 允许应用程序显示对话框或者通知给用户。
视图系统 - 一个可扩展的视图集合,用于创建应用程序用户界面。
s
应用程序
顶层中是包含全部安卓程序的。自己开发的程序也被安装在此。其中就包括了视频软件,游戏等。
2.4 Android工作机制
Android程序是要由四个不同功能的组件构成的,分别是“Activity",“Service”,“Content Provider”和“BroadCast Receiver”。每一个应用程序都要由以上组件的一个或多个。使用这些组件之前要先在AndroidMainfest.xml中进行配置。安卓系统的主要构成和工作的流程如下图所示。
2.4.1 Activity
组件Activity指的是在打开用户界面时的单一屏幕,比如说我们熟悉的Java 的窗口或者帧。在安卓系统中的Activity属于ContextThemeWrapper 类的子类。具体来说就是,安卓系统中的Activity类似于C、C++、Java语言编程中程序始于main() 函数,安卓系统初始化的程序是始于Activity中onCreate() 回调的调用。通过有一序列的回调去启动Activity,同时有一序列的方法来关闭Activity,如下面的活动声明周期图所示:
接下来,我将详细介绍Activity 类中不同回调的定义,但这并不意味着所有的回调方法都得实现,但了解其中的每一个非常的重要。为了达到应用行文是用户所期望的,那么就很有必要去实现这些。
回调 描述
onCreate() 这是第一个回调,在活动第一次创建时调用
onStart() 这个回调在活动为用户可见时被调用
onResume() 这个回调使用的情况是用户与应用程序可以开始交互时
onPause() 被暂停的活动无法接受用户输入,不能执行任何代码。当前活动将要被暂停,上一个活动将要被恢复时调用
onStop() 当活动不在可见时调用
onDestroy() 当活动被系统销毁之前调用
onRestart() 当活动被停止以后重新打开时调用
2.4.2 Service
组件Service指的是在后台运行的内容,它与Activity是同等级的。由于Service是在后台运行的服务,因此是没有可以看得见的界面这类东西。Service的功能种类很多,比如说可以通过Service定位,甚至是记录你的位置改变,或者打开音乐,或是去监听某种动作。目前,服务基本上包含两种状态:第一种,Started。利用Activity通过startService()开启了Service,那么此时的Service属于Started状态。Started状态很明显的特点是,一旦开启了Service,那么这种Service将在后台无限期的一直运行,即便是在启动它的组件被销毁的条件下。第二种,Bound。利用Activity通过bindService()绑定了Service,那么此时的Service属于Bound状态。Bound状态最明显的特征是,它会提高给客户服务器接口允许组件和Service之间的交互,比如说,发生请求,然后获得结果,甚至是通过IPC进行跨进程通信。
由于Service具有生命周期方法,因此它可以监控Service的状态变化,并且在合适的阶段去执行工作。如下图所示,左侧流程图呈现了Service将如何通过startService()创建时的生命周期;右侧流程图呈现的是Service将如何通过bindService()创建时的生命周期。
创建Service的前提是创建继承自Service基类或者它的已知子类的Java类。
接下来,我将详细介绍Service基类中不同回调的定义,但这并不意味着所有的回调方法都得实现,但了解其中的每一个非常的重要。为了达到应用行文是用户所期望的,那么就很有必要去实现这些。
回调 描述
onStartCommand() 其他组件(如活动)通过调用startService()来请求启动服务时,系统调用该方法。如果你实现该方法,你有责任在工作完成时通过stopSelf()或者stopService()方法来停止服务
onBind 当其他组件想要通过bindService()来绑定服务时,系统调用该方法。如果你实现该方法,你需要返回IBinder对象来提供一个接口,以便客户来与服务通信。你必须实现该方法,如果你不允许绑定,则直接返回null。
onUnbind() 当客户中断所有服务发布的特殊接口时,系统调用该方法。
onRebind() 当新的客户端与服务连接,且此前它已经通过onUnbind(Intent)通知断开连接时,系统调用该方法。
onCreate() 当服务通过onStartCommand()和onBind()被第一次创建的时候,系统调用该方法。该调用要求执行一次性安装
onDestroy() 当服务不再有用或者被销毁时,系统调用该方法。你的服务需要实现该方法来清理任何资源,如线程,已注册的监听器,接收器等。
2.5需求分析
2.5.1 功能需求
这款基于Android的智能聊天软件主要实现智能聊天、音乐播放等功能,分为两大模块:聊天主界面模块、其他控制模块。
(一)聊天主界面模块:主要有展示聊天信息的界面区域、聊天信息输入框、发送按钮。
(二)背其他控制模块:由应用栏的菜单键实现,用来控制各类功能。
2.5.2 性能需求
依据上面的分析,性能需求是对系统的可靠性和用户体验等方面进行考虑。在项目设计时,遵循如下原则:
(一)可操作性∶用户在使用软件时,界面要简洁、直观、形象。在使用过程中要有必要的提示,例如断网提示、未输入聊天信息的提示,来保证用户正确使用该应用。
(二) 可移植性︰软件具有在不同版本的Android系统、不同的Android手机上正常运行。
(三)实用性:要从用户的实际需求出发去开发软件的功能。
(四)可靠性:系统需要具备一个优良的运行环境,保证长时间操作不出错、系统性能稳定,让用户能有耐心的使用该软件。
(五)可维护性:软件在研发的过程中不仅要确保用户需求功能的实现,同时还要考虑未来用户需求发生变化时,如何去更改和完善软件的功能,从而来保证软件的可持续性。
2.6 本章小结
本章对Android的构造、特征、工作机制做了详细的介绍,并对项目功能需求、性能需求进行介绍,确定了方向。
第三章即时通讯系统
即时通讯系统的总体框架和与之有关的解决方案是本章介绍的主要内容。此外,还会详细介绍以环信即时通讯云为基础,如何实现客户端与客户端之间的即时通信。
3.1 即时通讯简介
即时通信(IM),顾名思义指的是即时发送、接收信息等业务。IM于1998年面世,此后快速发展,尤其是在近几年。随着不断的发展,即时通信的功能也越来越丰富,比如说包含着电子邮件、网游、网剧、微博和搜索等各种各样的功能。它不再单指聊天工具,已经成功发展为交流、娱乐、电子商务、办公协作和企业客户服务等于一体的综合化信息平台。
遥想当初,是由AOL、微软、雅虎、腾讯等独立于电信运营商提供的即时通信。但是随着即时通信的功能丰富化,应用普遍化,电信运营商们也被迫采取措施去积极应对目前需要面临的挑战:在即时通信增强软件的功能后,开始分流甚至是替代了传统电信业务。
即时通信软件就是通过即时通信技术实现在线聊天和沟通交流的软件。
即时通讯软件是一种利用即时通讯技术在网上聊天和沟通交流的程序。即时通讯软件一共有两种架构形式,其中第一种为: C/S架构(客户端/服务器)。比如说我们熟悉的QQ、Sina UC、MSN等服务器,用户若想要使用软件,那就得下载安装客户服务端软件。第二种为:B/S架构(浏览器/服务端)。这种架构类型我们比较熟悉的软件是Websitelive 、 53KF、live800等服务器,用户不需要安装软件,借助互联网就可以直接进行沟通对话。
3.2 环信简介
2013年4月份,环信即时通信云成立了。环信即时通信云是一种具有可移动即时通信能力的云计算。
云端开放的 Rest API 和客户端 SDK 包的方式提供给开发者和企业的能力,基于移动互联网的即时通信等简单的交谈、群聊天、发语音 ,图像实时音频、视频等方式。让应用程序像以前网页中嵌入的聊天室功能一样简单。所有这些支持在线、电流、长连接、语言、位置和网站的平台都被充分地用于移动开发者,确保其开发尽可能低端。经过很长时间的延展,智能手机应用程序都变得可以使用。
3.3 系统架构
本系统采用c/s架构,拥有服务器端和客户端。
客户端是指在安卓空间开发,连接GPRS或无线网络、和互联网进行连接,即时通信可以使用户于Android客户端或与在电子计算机服务器上的连接。客户端的目的是将通信程序初始化然后发起请求去创建连接。
通过五个模块对客户端设计与开发:
模块一、登陆与注册模块:让用户注册客户端的账号,实现登陆。(扩展:可以自动登陆,并且掉线后可以自动连接上线)
模块二、会话界面:显示当前会话列表,管理会话列表,实现会话的创建,删除。
模块三、好友管理界面:该界面可以显示所有好友及其信息,具有添加好友、删除好友以及查看好友资料、修改备注等多功能。
模块四、设置界面:可以对系统设置进行个性化修改,比如说新消息提示、聊天框设置以及退出登陆按钮。
模块五、通讯模块:用户与用户之间的沟通交流,实现即时通讯。
服务器端:使用环信云作为服务器可以同时允许多个客户端登陆账号,然后连接到同一个服务器。服务器的作用是对客户端进行验证,然后创建会话,这样客户端就能与服务器实现在该会话下的通讯。
3.4 网络的通信
1.TCP/IP(Transmission Control Protocol/Internet Protocol),即传输控制协议/网际协议,属于网络通信协议,是对互联网上所有通信设备进行规范,特别是主机与主机之间的数据往来格式以及传送方式。TCP/IP是互联网的基本协议,是数据打包和寻址的标准方法。数据传送的方式我们可以将它形象的比喻为两个信封,即TCP信封和IP信封。要被传递的数据将会被分成若干小段,然后将每小段数据分别放入TCP信封中,并记录好,再将TCP 信封一起放入相对更大的IP信封里,发送至网络,在接收数据端口处收集信封,然后拆开并抽出信封里的数据按照原本的顺序进行排列,并进行校验,如果数据信息有差错,那么TCP就会发出重新发出数据的请求。因此,TCP/IP协议在传送数据上几乎无差错。
TCP/IP协议大致可以分为四层,每一层负责不同的功能:
2.第一层:数据链路层,(又被称为链路层)通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。
3.第二层:传输层,通常是在链路上进行传送,因此我们就得使用具有针对性的链路层协议。每相邻两节点间传送数据时,数据链路层会将网络层传递下来的ip数据组装成帧,并在节点上传送。其中,每一帧必须得包含数据以及有必要的控制信息,比如说同步信息、地址信息。然后在接受数据时,控制信息要让控制端知道帧是从哪个比特开始,又是从哪一比特结束的。通过这样的步骤后,链路层接收到帧就能提取到所需要的数据部分,随后交给网络层。
4.第三层是运输层,提供了数据传输功能,通过这个功能两台主机之间的进程可以顺利的运行。一台主机并不是仅能运行一个进程的,它可以同时运行多个不一样的进程,也正是因为这个特点,运输层才有了复用和分用功能。通俗的来讲,复用指的就是多个应用层进程能够在使用运输层时能够同时进行,分用恰恰与此相反,分用的定义是应用层中的相应的进程是运输层分别把信息传递上来的。
运输层是有以下两种不同的协议的:
第一种是传输控制协议TCP,这种协议面向连接的,以报文段为单位传输数据的,进而提供了非常可靠的数据传输服务。
第二种是用户数据报协议UDP,这种协议与第一个协议不同,它是无连接的,以用户数据报为单位传输数据的,因此不能确保数据在传输的过程中是安全的。
5.第四层也是整个网络协议中的最高层是应用层,这一层主要是可以给应用程序提供或者消息的传输提供合适的网络接口。目前比较通用的的应用程序有FTP文件传输协议、支持电子邮件的SMTP协议、支持万维网应用的HTTP协议以及Telnet远程登录等等,而且这些程序不管是什么样的TCP/IP都会提供。
3.5 GPRS和Internet的连接
在网络中,移动终端是可以直接和GPRS无线网络相接的。用户在使用的过程中需要分组路由、隧道以及跟踪移动终端的位置等种种功能,而这些功能就需要服务支撑接点SGSN(Service GPRS Support Node)来提供。在建立连接的过程中,GPRS网络内部与外部网络是需要路由和封装的,还需要P地址,这些就需要网关支撑接点GGSN(Gateway GPRS Support Node)来提供,如此才能与Internet网络完全联通。在大多数情况下,移动终端都是在使用内网地址,然后再被NAT转换,内网地址就被转化成外网地址了,从而向Internet发送。
GPRS手机终端在处理数据的过程中,需要先把发送的数据进行大幅的处理,使其转变成GPRS分组数据然后再发送到GSM基站。下一步需要SGSN对分组数据进行分装,在GPRS骨干网的作用下,SGSN可以与网关支持接点GGSN达到实时通信的结果。分组数据需要被再次处理,最后被发送到Internet网络。如果出现了分组数据没有发送到Internet网络而是发送到了另一个GPRS终端的情况,那么GPRS骨干网将会把数据发送到SGSN上,最后在被BSS 发送到GPRS终端。
3.6 Android SDK 介绍
环信SDK开发框架
用户开发与IM相关的应用需要完善的框架,为了满足用户的需求,环信SDK就提供了一套完善的开发框架。框架主要包括了下面的几个部分:
1.SDK_Core的主要任务是实现核心的消息同步协议,基于此功能,可以实现与服务器二者之间的信息交换。
2.SDK的任务是在核心协议的情境下,达到完整的IM功能,同时可以使好友聊天,群聊天,不同形式消息的收发等功能更加完善。
3.Ease UI是一组为了帮助开发者快速集成环信 SDK的IM相关的UI控件。
为了使SDK的设计整体更加清晰,采用了模块化设计,基于此,不能模块之间的功能可以是完全不同的,用户也可以由此来按照自己的不同需求选择不同的模块。
SDK模块化
3.6 本章小结
在本章中,介绍了Android操作系统下即时通讯,了解了当下即时通讯面对的问题以及解决方式,还介绍了环信通讯云的特点和功能,然后又介绍了系统框架,以及实现的各项功能,最后介绍了网络通信协议的四层结构以及SDK。
4.软件的设计与实现
本次的系统整体采用的是C/S架构,用了环信云提供的服务器,设计本系统的主要目的是用于处理用户的请求,在此系统上还可以访问数据库中的数据以及传递消息。由于客户端是在Android平台上开发的,所以可以与服务器相连并通讯,实现不同的客户端之间的用户实时通讯。
软件整体流程图
5.1相关类介绍
开发软件用到很多类,为了梳理各个类在该软件中所承担的任务,将对各个类所具有的功能进行简明的介绍。
(一)ChatActivity:核心工作类,对软件的界面进行初始化,显示第一次聊天对话的问候语。在该类中通过调用其它类来实现软件的全部功能,同时还实现了一个软件界面设计问题——在现实手机运行该软件可以看到在应用栏的菜单键。
(二)ChatMessage:聊天消息实体类,主要实现了ChatMessage对象的初始化,其中还定义了ChatMessage对象的一些方法,比如获取聊天信息、设置聊天信息、获取聊天信息的类型、设置聊天信息的类型、获取聊天的日期与时间、设置聊天的日期与时间。
(三)ChatMessageAdapter:聊天消息适配器工具类,是用来创建聊天消息适配器对象,该适配器是连接后端数据和前端UI界面的桥梁。其中包含ChatMessageAdapter对象的初始化,还重新定义了一些方法,比如获取项目item数量、获取当前选项、获取当前选项的ID、获取项目视图的类型、获取当前的项目界面。
(四)Config:配置类,是用来连接图灵机器人平台的关键,其中只包含URL_KEY、APP_KEY两个属性,属性的值直接到图灵机器人平台去申请。
(五)DateUtils:格式化日期时间工具类,其中只有一个方法,用来设置日期和时间的格式并以字符串的形式进行显示。
(六)HttpUtils:网络请求类,里面有两个重要的方法,它们的作用是:发送信息到服务器、接收服务器返回的消息。
(七) Result:服务器回复信息类,是用来映射服务器返回数据,其中涵盖四个方法分别为∶获取code码、安置code码、获取信息、安置信息。
(八)SettingsActivity:选项设置布局类,用来定义应用栏菜单键对应的专属界面,其中拥有两个方法,分别为:创建这个专属界面、判断以bgsound命名的系统属性是否存在。
4.2服务端模块
在本模块中同样选择了环信云端服务器作为服务器,环信的主要功能是开发云储存,因此本模块中设计了一个后台管理系统,这个后台加在了聊天软件中,使软件更加方面管理还可以保存客户端产生的重要信息。在这个系统中,如果没有账号需要先注册,注册的时候可以申请创建数据库,数量不限,然后就可以得到相应的密钥,最后需要下载与我们的需求相符的SDK程序包,将程序包加入到我们需要的软件程序当中。可以保存相应过程中产生的数据。也可以对其进行删除,修改等其他操作。云端服务器是此系统的优势点,不仅使用方面而且操作简单容易上手。
在使用本系统的时候需要使用智能手机登录软件,输入数据,主页面同其他聊天软件一样是好友聊天的界面,可以选择不同的好友和其聊天,系统会自动向服务端传输数据。数据一经输出,服务端会立刻对其分析,之后便将数据传到客户端,判断完数据的类型之后,对其进行反馈。
4.2.1 登录
登录是系统中很重要的一步,只有登录之后才能享受系统的各项功能。用户需要在页面输入自己的账号和密码,服务端会从数据库中调取该账号的密码,判断该密码是否和数据库中的密码一致。如果一致的话,就可以成功登录系统。用户就可实时获取系统上的信息。反之,就会弹出提示用户检查账号密码的通知。
4.2.2注册
当用户没有账号的时候需要在客户端注册一个账号,在注册页面编辑自己的账号以及密码,这些信息会被加密打包发送到后台的数据库进行保存,发送到服务器上,接受的服务器会反馈出一个cookie值,此后用户每次登录的时候,都会对用户的信息与注册时设定的信息进行对比,相同时,就会成功登录。
4.2.3聊天
系统在服务端会创建一个Server Socket对象,这个对象的任务是在端口处监听,当客户发送数据的时候,他在接收到客户的需求后将消息发送给客户指定的用户,如果客户没用发送消息,线程就会处于停滞状态。
4.2.4下线
。服务端会对系统做出一个判断,判断是否还存在连接,并且断开和客户端的长链接,将用户的状态保存在数据库中,如果其他用户需要知道该用户的状态信息时,需要从数据库中将状态调取出来,准确表示出该用户的状态是下线。
4.3客户端模块
登录功能:建立与服务器的连接并登录,能显示登录错误信息。
界面显示:主界面是类似于微信的好友聊天界面,此界面主要展示参与了会话的好友列表。同时还有一个子界面,其主要展示加入黑名单的好友的界面还有好友的资料信息。
聊天功能:在和好友聊天的时候会显示聊天会话框,左边是聊天对象发送的信息,右侧是自己发送的信息,在下方的输入框就可以输入自己想要发送的消息,还可以发送语音,表情包,图片等,点击发送或回车即可发送。
聊天纪录:只要不实时删除,向上拉就可以查看历史聊天记录。当已经浏览到最开始的一条聊天记录的时候,便会提示已加载全部聊天记录呢。
信息提示:当收到消息的时候,系统会发出弹窗,同时会发出提示声音。
后台运行:当用户在使用其他系统的时候,本系统会自动在后台运行,如果在这个过程中,有别人发送消息,就会直接广播消息内容及来源。
4.3.1数据存储
本系统主要采用的数据库是SQLite,这款数据库的主要特点是轻型,而且是遵守ACID的关系型数据库管理系统,还是在一个比较小的C库中,主要是嵌入式实现设计目标的,就目前来说,已经有很多嵌入式的产品选择了这款数据库,它仅占用很少的资源。但是在对其进行操作的时候需要利用xUtils框架。
User表:用来存储用户的用户名和密码信息。
字段名 类型 描述
id int 用户编码
username char 用户名
realname char 备注
User表结构
Name表:用来储存当前用户的用户名。
字段名 类型 描述
id int 用户编码
name char 当前用户名
Name表结构
4.3.2注册登录界面
登录功能:只有登录之后才能享受系统的各项功能。用户需要在页面输入自己的账号和密码,服务端会从数据库中调取该账号的密码,判断该密码是否和数据库中的密码一致。如果一致的话,就可以成功登录系统。用户就可实时获取系统上的信息。反之,就会弹出提示用户检查账号密码的通知
关键代码:
//调用回调函数,把主页上收到的用户名,密码的信息进行验证,进行登录操作
EMChatManager.getInstance().login(username,password,new EMCallBack());
//若登录成功,则返回onSuccess
public void onSuccess(){
runOnUiThread(new Runnable( {
public void run( {
EMGroupManager.getInstance().loadAllGroups();
EMChatManager.getInstance(.loadAllConversations();
}
}
//若登录失败,则返回onError
public void onError(int code,String message){
}
4.3.3好友列表读取
获取好友列表和获取会话列表是差不多的,都需要把获取信息存入listview中,之后再对Adapter加载,然后就可以显示出所需信息。具体代码的实现主要是调用EMContactManager.getInstance().getContactUserNames()获取到登录用户的好友列表信息,将信息加载到页面中。可以就listView添加一个单击事件,就可以创建出一个会话信息,还可以修改好友的备注信息。
4.3.4发送和接受信息
成功登录后,会话列表就会在主页面显示,好友列表也会在好友列表的界面显示,如果想要向某个好友发送消息,单击就会创建出一个聊天会话的界面,然后就可以向该好友发送消息环信SDK的接口可以判断消息是否发送成功。当有消息发送回来的时候,系统会发送一个声音提醒有消息进入。根据对方的ID来判断是好友列表中的哪个人,如果不是已经创建了聊天窗口的人,系统会自动创建一个聊天窗口帮助聊天。属性“t-o"”用来代表消息的接受者,属性“from”用来代表消息的发送者,属性“body”用来代表消息内容,属性“type”用来代表消息类型。
发送信息:
EMChatManager.getInstance().sendMessage(message,new EMCallBack(){
@Override
public void onError(int arg0,String argl) {
// TODO Auto-generated method stub
runOnUiThread(new Runnable(){
public void run(){
Toast.makeText(ChatActivity.this,“发送失败”,Toast.LENGTH_SHORT).show();
}});
}
@Override
public void onProgress(int arg0,String argl) {
// TODO Auto-generated method stub
}
@Override
public void onSuccess( {
//TODO Auto-generated method stub
runOnUiThread(new Runnable(){
public void run(){
Toast.makeText(ChatActivity.this,“发送成功”,Toast.LENGTH_SHORT).show();
}
});
}});
}else{
Toast.makeText(getApplicationContext(),”不能发送空消息”,Toast.LENGTH_SHORT).show();
}
}});
}
接收信息:
String msgld = intent.getStringExtra(“msgid”);//发送方
String username = intent.getStringExtra(“from”);
//收到这个广播的时候,message已经在db和内存里了,可以通过id获取mesage对象
EMMessage message = EMChatManager.getInstance().getMessage(msgld);
EMConversation conversation = EMChatManager.getInstance().getConversation(username);
if (!username.equals(username)) {
//消息不是发给当前会话,return
return;
}
conversation.addMessage(message);
dataAdapter.notifyDataSetChanged();
listView.setAdapter(dataAdapter);
listView.setSelection(listView.getCount()-l);
4.3.5设置界面
本界面的任务有:开启声音,开启震动,退出登录,接收或者屏蔽消息。
关键代码:
public void onCreate(Bundle savedInstanceState){
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
mSharedUtil = mApplication.getSpUtil();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment_set,container,false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
//TODO Auto-generated method stub
super. onActivityCreated(savedInstanceState);
initView();
initData();
}
4.3.6退出程序
需要连续按两次返回键才可以退出程序功能,完成这一步需要在代码中,在Application类(android的 application类)中设置一个数据类型为布尔型的数据默认为false,还要在Activity中重写onKeyDown()方法。用户需要点击两次返回键才能退出,如果用户只点击了一次就会通知修改布尔值修改成true,然后开始倒计时,如果两秒之内没有再次按下返回键的话就会退出程序。
4.4本章小结
本章主要介绍了系统的各项功能以及功能实现的方法,在所有功能中,登录和注册是系统的主要功能,只有成功登录才能完成以上的各项功能。因为本系统主要是实现聊天的功能,所以聊天页面非常主要,要确保聊天功能的完善性,可以发送聊天信息,语音,位置等有助于聊天更方便的功能。
第五章 基于Android平台的聊天系统测试
所有的软件在完成之后都需要对其进行多次的测试来确保软件的实用性。在多次的测试过程中来发现系统中难以发现的bug,从而可以使系统更加完善,服务更加周到。第一步要测试服务端,测试服务器是否可以正确开启服务端的服务,是否可以分析处理客户端传过来的数据。第二步要测试客户端的应用程序,测试在智能手机端是不是可以完整的展示系统的所有界面,测试数据在收取和发送的过程中是否是正常的工作状态,相应的过程是否是否是正常的。第三步是把客户端和服务端一起测试,测试客户端和服务端能不能正常的连接,运行,能否正常实现登录,注册,聊天等功能。
本次系统中主要采用了C/S架构,还需要采用环信云服务器,在Android平台上对客户端进行开发,客户端可以用安卓系统自带的数据库存储客户的信息,并对客户的信息进行不同程度的修改。还可以实现不同客户端之间的通信功能。
5.1 用户登录和注册
5.2获取会话列表和好友列表
5.3消息发送和接受
5.4 本章小结
本章主要展示了测试的过程,从注册登录过程,再到聊天界面,好友列表界面以及会话列表界面都进行了详细的测试,对每一次测试的过程中的信息进行了详细的记录,也根据每次测试中发现的问题进行了反思,修改。
结论和展望
致谢