版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章绪论即时通讯的概念即时通讯的国内外发展状况课题内容简介第二章即时通讯系统设计与分析2。1 需求分析2。1。1 功能需求2。1。1.1用户注册2。1。1。2用户登录2。1.1.3刷新好友列表2.1.1。4好友管理。1。5用户查询2。1.1.6聊天概要设计2。2。1系统框架设计2。2。2系统拓扑结构功能设计2。3。1用户注册模块2用户登录模块2。3.3好友管理模块2。3.4查找用户模块2。3.5即时通讯模块6刷新好友列表模块2。4数据库设计第三章 系统客户端、服务器开发平台搭建系统客户端开发平台搭建3。1。1开发Android程序软件需求2开发Android程序硬件最低需求3JDK的安装3。1.4Android开发环境的安装3。1。5安装Eclipse插件ADT系统服务器开发平台搭建第四章系统客户端设计与实现4。1Android系统简介4。2客户端使用到的接口介绍4。3客户端实现4。3。1用户注册模块实现4。3.2用户登录模块实现4。3。3刷新好友列表模块实现4。3.4好友管理模块实现4。3.5用户查询模块实现4.3。6聊天模块实现第五章系统服务器设计与实现5.1GoogleAppEngine简介5.2服务器端实现5.2。1服务器用户注册5。2.2服务器用户登录5。2。3服务器在线服务第六章结论与展望第一章绪论即时通讯的概念即时通讯(InstantMessenger,简称IM),是指能够即时发送和接收互联网消息等的业务。自1998年面世以来,特别是近几年的迅速发展,即时通讯的功能日益丰富,逐渐集成了电子邮件、博客、音乐、电视、游戏和搜索等多种功能.即时通讯不再是一个单纯的聊天工具,它已经发展成集交流、资讯、娱乐、搜索、电子商务、办公协作和企业客户服务等为一体的综合化信息平台.是一种终端连网即时通讯网络的服务。即时通讯不同于e-mail在于它的交谈是即时的。大部分的即时通讯服务提供了状态信息的特性一一显示联络人名单,联络人是否在在线与能否与联络人交谈。即时通讯的最大特点是在网上进行信息的实时交流.它的产生有着深刻的社会和技术的原因。大凡人们都有渴望社交、获得社会尊重、实现自我的需求,这正是即时通讯软件风行的驱动力。而物质文明的日益发达所带来的副作用,又使得人们习惯地与周围的人保持距离,以致人们更愿意对陌生人敞开心扉.与传统通讯方式相比,即时通讯具备快捷、廉价、隐秘性高的特点,在网络中可以跨年龄、身份、行业、地域的限制,达到人与人、人与信息之间的零距离交流。从这点上讲,即时通讯的出现改变了人们的沟通方式和交友文化,大大拓展了个人生活交流的空间。近年来,随着无线通信的快速发展,移动互联网为传统的Internet注入了新的活力,同时也为即时通讯带来了一场革命,交互双方已经不再局限于以网络终端设备为唯一的接入手段,PC机在传统的网络即时通讯中所起的作用正在被手机、平板电脑所取代。这使得即时通讯更加大众化和人性化,即使不会使用电脑的人现在也可以享受到即时通讯给人们带来的变化.另外,即时通讯软件被加入了越来越多的新功能,使它正从毫无商业价值的聊天、游戏转变出来,成为能为商业带来商机和实惠的领域,所有这一切都让人们对即时通讯赋予了越来越多的注意力。可以说,即时通讯的发展把后PC时代的特征体现的淋漓尽致,人们从来没有像今天这样感受到天涯咫尺。纵观即时通讯软件业的迅速发展,设计并开发一个即时通讯平台,对于现阶段的学习和研究,都是极为有意义的,基于这个前提和起因,我选择了设计即时通讯系统作为我的毕业设计。即时通讯的国内外发展状况即时通讯软件,几乎是每一个上网用户都必备的联络工具.即时通讯软件除了能够让您迅速地在网上找到自己的朋友和工作伙伴,还可以实时交谈和传递信息,而且,现在不少即时通讯软件还集成了文件共享、语音聊天、网络会议等功能。截止到目前,全球约有近3亿多人使用即时通讯软件进行交流,正因为即时通讯软件拥有数以亿计的用户和迅速增长的市场,所以各个公司都盯上了中国这个潜在的最大市场,一时间,即时通讯市场硝烟四起。除了腾讯QQ和国外的几款著名即时通讯软件纷纷推出新版本,网易也推出了一种新的即时通讯软件一-网易泡泡。朗玛公司也推出了名为UC的通讯工具。即时通讯软件最早发布于1996年11月15日,以色列特拉维文的MirabilisLtd.发表了一个题为《E.TSURFHOME:MIRABILISLTD。PROVIDESNEWSOLUTIONSFORPEER—TO—PEERINTERNETCOMMUNICATIONS》的新闻稿,同时发布了他们新产品ICQ(ISeekYou)的Beta测试版。这天标志着Internet上的第一个成热的即时通讯系统(InstantMessageSystem)的诞生。即时通讯服务在诞生之后的几年时间得到了迅猛发展,成为新增Internet用户的3个主要应用之一(WEB,电子邮件和即时通讯)。在国内,1999年2月,深圳腾讯公司正式发布OICQ99betabuild0210,开通腾讯即时通讯服务。2000年5月,腾讯QQ同时在线用户突破10万;2001年2月l0日,腾讯QQ同时在线用户突破100万。2004年4月份腾讯QQ同时在线人数最高记录已经突破了600万大关,现在腾讯公司正在把即时通讯系统往移动通讯方向扩展,如今已经将即时通讯与手机短信息(SMS)成功结合起来。即时通讯软件涉及和影响的领域已近越来越广,其竞争也越来越激烈.国内QQ最大的敌手朗玛UC从2001年开始研发,2002年的12月份UC正式发布,并且首创了很多技术:UC是国内第一个做场景聊天的;UC是第一个把同学录和校友录结合的;第一个把即时通讯与休闲游戏相结合的;第一个把发送动画与即时通讯相结合的。在一年的发展里,UC一度达到峰值在线30万人,注册用户达到7000万.与此同时,信息化建设的加速将促进企业即时通讯市场发展。中国政府积极推进企业信息化应用的发展。国家有关部门已经提出,要加快建立企业信息化应用的公共服务平台,对于中小企业由政府组织并给予一定的资金扶持。当前,政府的有关部门已经着手中小企业电子商务应用的经验交流、技术推广、人才培训等方面的工作。企业即时通讯作为企业信息化建设的一部分,同样能从该政策中得到发展机会。服务商市场开拓中,也把为企业服务作为工作的重点之一,越来越多的软件开发商把企业即时通讯应用产品的开发作为软件开发的重点之一。政府积极促进企业提高认识,加深对信息化的重要性和必要性以及内涵的理解,间接提高了企业对即时通讯应用的自觉性和紧迫性,把即时通讯建设作为加速企业发展的助推器。统一通信成为发展趋势。与个人即时通讯需求相比,企业即时通讯要求融入更多的通信手段,单一的PC对PC消息传输必定无法满足企业的需求,由于企业对效益的追求,导致企业对效率的要求不断增高,而信息的有效传达是确保企业内部效率提升的必要条件,这就要求未来即时通讯服务商能够提供短信、邮件、电话、传真等多渠道的解决方案,以及支持文字、音频、视频等多媒体的服务平台。代理渠道萎缩,合作伙伴加强。渠道中除总代理、行业代理和区域分销商外,增值代理商和解决方案业务伙伴将成为未来企业即时通讯产品渠道的重要发展环节,在渠道建设中地位也将逐步提高,他们将成为服务商收入的主要来源之一。原因有两方面:首先,代理商对于企业即时通讯软件服务商来说不够稳定。首先,代理商有自己选择代理产品的权利;其次,服务商无法满足企业客户对技术不断调整的需求;再次,代理商会削弱服务商对客户的掌控能力,一旦客户存在技术需求,服务商难以直接、高效的提供服务,将直接导致客户对服务商产品的满意度。其次,合作伙伴具有自己的核心技术,比如ERP、OA等产品,在集成企业即时通讯模块的过程中,对产品有一个很好的衡量和认识,一旦产品优秀,合作伙伴将会充分的向客户推荐该服务商提供的产品;此外,合作伙伴和服务商之间存在互利关系,合作伙伴可以从所集成的企业即时通讯服务中获利。而更为重要的是,服务商可以直接的接触到最终客户,为其提供完善的服务.课题内容简介通过以上对即时通讯软件发展状况的分析,再加上国内3G时代的到来,互联网速度的飙升,开发一款简单实用大众化地即时通讯产品在后PC时代的信息产业领域具有旺盛的生命力.不仅为大众提供了通讯的方便,也是对自我四年大学学习的重大考验。产品定位:大多数人能够使用,操作者有无相关专业知识都可主要功能有:用户注册用户登陆刷新好友列表好友管理即时通讯用户查询实现技术:基于HTTP协议的网络编程GoogleAppEngine发技术多线程编程WEB开发技术Androic平台开发使用软件:JDKMyEclipse8.5GoogleAppEngineSDKForJavaEclipse3.4第二章即时通讯系统设计与分析需求分析2。1.1功能需求1。1用户注册用户第一次使用本系统时,可以点击手机界面上的注册按钮进行新用户注册。注册时用户需提供密码、用户名、头像、电话、性别、年龄、居住地、昵称信息,但不是所有的都必须填。用户注册如图2—1—1:图2—1—1用户注册用例图1。2用户登录系统启动默认进入登录界面,已经拥有账号的用户可以直接输入ID、密码进行登录。只有在ID、密码由服务器验证通过后才可正确登录.用户注册如图2-1—2:图2-1—2用户登录用例图1.3刷新好友列表当用户通过ID、密码验证正确登录之后,就可以看到好友列表界面.用户可通过菜单选择刷新好友列表,这时需要更新用户的好友列表。刷新好友列表如图2—3:图2-1—3刷新好友列表用例图2。1.1。4好友管理在好友管理中,用户可以选择添加其他用户为其好友,待对方接受之后就完成添加好友。用户也可以选择删除自己的好友,此过程无需对方确认。好友管理如图2—1—4:图2—1—4好友管理用例图1。5用户查询在用户登录成功之后可以查看其他用户,可以根据ID、用户名、是否在线这些条件来更加精确地进行用户查找。用户查找如图2—1—5:图2—1-5用户查找用例图1.6聊天用户可以选择自己的一个好友,进入聊天界面进行聊天,关闭与一个好友的聊天界面之后回到主界面。即时通讯如图2-1—6:图2—1-6即时通讯用例图概要设计.1系统框架设计本系统总体框架如图2-2—1:图2—2-1系统总体框架图。2系统拓扑结构系统拓扑结构如图2-2—2:图2—2-2系统拓扑结构图本系统采用星型拓扑结构进行构建,使用本系统的每一个实体都必须通过客户端进行注册,才可登录并使用本系统。在本系统的通信上采用Http协议来承载XML格式的私有协议,HTTP是为分布式超媒体信息系统设计的一个协议。它是无状态、面向对象的协议.HTTP一般用于名字服务器和分布式对象管理。由于HTTP1.0能够满足WWW系统客户与服务器通信的需要,从而成为WWW发布信息的主要协议。一、HTTP的主要特点:1、客户/服务器模式HTTP支持客户(浏览器)与服务器间的通信,相互传送数据.一个服务器可以为分布在世界各地的许多客户服务。HTTP定义的事务处理由以下四步组成:-客户与服务器建立连接;-客户向服务器提出请求;-如果请求被接受,则服务器送回应答,在应答中包括状态码和所要的文件;-客户与服务器断开连接。2、简单HTTP本身既简单,又能有效地处理大量请求。在客户与服务器连接后,客户必须传送的信息只是请求方法和路径.HTTP规范说明了定义的几种请求方法,实际上常用的只是其中的三种GET、HEAD、POST。每种方法规定客户与服务器联系的类型不同。正是因为HTTP简单,使得HTTP服务器程序规模小,而且简单。这样做的直接效果是经由HTTP的通信速度很快。与其它协议相比,时间开销小得多。3、灵活HTTP允许传输任意类型的数据对象。Content-Type标识正在传输的数据类型。如果把数据看成是装在”罐”里的东西,那么Content-Type是贴在罐上的标签,它告诉人们里面装的是什么东西。4、无连接HTTP是一个无连接协议。它的含义是限制每次连接只处理一个请求。客户与服务器连接后提交一个请求,在客户接到应答后马上断开连接。5、无状态HTTP是无状态的协议。它既是优点也是缺点.一方面,由于没有状态,协议对事务处理没有记忆能力.如果后续事务处理需要前面处理的有关信息,那么这些信息必须在协议外面保存。缺少状态意味着所需要的前面信息必须重现,势必导致每次连接要传送较多的信息。另一方面,也正是由于缺少状态使得HTTP累赘少,运行速度高,服务器应答较快。2。3功能设计系统功能设计如图2—3—1:图2-3—1系统功能设计图2.3.1用户注册模块用户需要正确填写自己的提供密码、用户名、头像、电话、性别、年龄、居住地、昵称信息,注册成功后,系统会返回给用户一个由6位数字组成的ID,用户必须记住此ID,以便登录时使用。用户注册流程如图2—3-2:图2-3-2用户注册流程图2。3。2用户登录模块用户需要正确填写自己成功注册时获取的ID、密码,如果验证通过,则可以进入到本系统主界面,给自己好友留言或与在线好友进行即时通讯。用户登录如图2—3-3:图2—3—3用户登录流程图2。3。3好友管理模块好友管理模块包括对好友的添加与删除。添加好友过程中,好友不能为空,不能加自己为好友,要添加的好友必须存在并且不能有重复的好友。删除好友过程中,只要选定好友列表中的一个,选择Menu中的删除好友即可删除成功。好友管理如图2-3—4:图2-3-4好友管理流程图4查找用户模块在用户登录成功之后可以查看其他用户,可以根据ID、用户名、是否在线这些条件来更加精确地找到其他用户,查找好友如图2-3-5:图2-3-5查找好友流程图2。3。5即时通讯模块当用成功登录之后,可以选择自己的一个好友,进入聊天界面进行聊天,关闭与一个好友的聊天界面之后回到主界面。聊天流程如图2-3—6:图2-3—6即时通讯流程图6刷新好友列表模块用户通过菜单选择刷新好友列表,这时需要更新用户的好友列表,其流程如图2—3-7:图2—3-7刷新列表流程图数据库设计在本系统中数据的存储采用GoogleAppEngine提供的数据存储区来进行存储。AppEngine数据存储区存储数据对象(称为“实体")并对其执行查询。一个实体具有一个或多个属性(若干受支持数据类型中某一类型的命名值)。属性可以是对另一实体的引用。数据存储区可以在一个事务中执行多个操作,如果任一操作失败则回滚整个事务。这对于分布式网络应用程序尤其有用,在这种分布式网络应用中,多个用户可以同时访问或处理同一数据对象。与传统数据库不同,该数据存储区使用分布式体系结构管理向超大型数据集的扩展.AppEngine应用程序可以通过描述数据对象之间的关系,以及定义查询的索引,来优化数据的分布方式。AppEngine数据存储区具有高度的一致性,但不是关系数据库.虽然该数据存储区接口有许多与传统数据库相同的功能,但也具有独特的特征,它采用了不同的数据设计和管理方式,可以充分利用自动扩展功能。即时通讯系统中需要对用户信息、好友关系、留言等各方面信息进行管理。这些信息都保存在数据存储区中,因此需要建立相应的表结构来存储这些相应的数据。所有表结构设计如下:表汇总:表名功能说明t_user存放用户个人信息t_buddylist存放好友关系t_message存放离线用户收到的留言信息表t_user:表名t_user列名数据类型是否为空字段说明u_idVarchar(20)否用户登录IDpasswordVarchar(20)否密码u_nicknameVarchar(20)是昵称u_sexVarchar(4)是性别u_ageInt(4)是年龄u_phoneVarchar(20)是电话u_signatureVarchar(20)是签名iconVarchar(20)是头像cityVarchar(20)是所在地表t_buddylist:表名t_buddylist列名数据类型是否为空字段说明u_id_aVarchar(20)否用户a的IDu_id_bVarchar(20)否用户b的ID表t_message:表名t_message列名数据类型是否为空字段说明from_u_idVarchar(20)否信息来源to_u_idVarchar(20)否信息去向packageVarchar(300)。是一,信息包第三章系统客户端、服务器开发平台搭建系统客户端开发平台搭建3。1。1开发Android程序软件需求JDK(建议安装JDK1.6及其以上版本,可以在官方网站上下载)AndroidSDKEclipse3.4(Ganymede)ADT(AndroidDevelopmentTools,开发Android程序的Eclipse插件)3。1.2开发Android程序硬件最低需求CPUPII以上,64M内存,100M硬盘空间3。1.3JDK的安装运行jdk1。6.0.exe,安装过程中可以设置安装路径、选择组件,系统默认安装路径C:\ProgramFiles\Java\jdk1.6.0,默认组件选择是全部安装.安装成功后,JDK的目录结构如图3—1-1:图3—1-1JDK的目录结构由于Java是平台无关的,安装JDK是Java不会自动设置路径,也不会修改注册表,需要用户自己设置环境变量,但不需要修改注册表。Windows中需要设置两个环境变量path和classpath。path变量指出Java提供的可执行文件的路径,classpath变量指出Java包的路径。下面开始设置环境变量:右键单击“我的电脑",在弹出的快捷菜单中选择“属性”,在弹出的“系统属性"对话框中选择“高级”选项卡,单击【环境变量】按钮,系统弹出“环境变量”对话框,如图3-1-2:图3-1-2“环境变量”对话框path是Windows已定义的变量,找到“Path",单击【编辑】按钮,将“;C:\ProgramFiles\Java\jdk1.6.0_02\bin”加到“变量值”文本框后边,然后单击【确定】按钮。通常Windows中没有classpath环境变量,需要新建。单击【新建】按钮,变量名为“classpath",变量值为“。;C:\ProgramFiles\Java\jdk1.6。0_02\lib",这是JDK包的路径.至此,JDK安装完成。3.1。4Android开发环境的安装首先下载最新版本的AndroidSDK,下载地址:/iintl/zh-CN/sdk/index。htmlhttp:///sdk/index。html注意,AndroidSDK是在线安装,在安装AndroidSDK之前要保证有稳定而快速的Internet连接。如果完全安装AndroidSDK,安装时间会比较长,请耐心等待.如果安装AndroidSDK时下载文件失败,可以将如图3-1-3所示的安装界面右下角的第1个复选框选中,然后重新安装。如果安装顺利,将出现如图3-1-4所示的安装界面。图3—1—3使用http下载文件图3-1-4安装过程的下载界面AndroidSDK安装成功后,会看到如图3-1-5所示的AndroidSDK根目录结构Platforms目录包含了当前SDK支持的所有版本,如图3-1-6所示。图3-1—5AndroidSDK根目录图3-1—6所有AndroidSDK版本3.1。5安装Eclipse插件ADTEclipse的安装直接解压即可使用,在此不再细说。安装ADT插件:打开已经安装好的Eclipse,单击【help]>[SoftwareUpdates]菜单项。在显示的对话框中单击【AvailableSoftware]标签页,然后单击【Addsite.。.]按钮.在显示的对话框的文本框中输入如下地址:/android/eclipse/单击【OK】按钮关闭对话框。回到【AvailableSoftware】标签页,选中刚才增加的地址,然后单击右侧的【Install】按钮开始安装ADT插件。在弹出的安装对话框中选中AndroidDDMS和AndroidDevelopmentTools两项,单击【Next】按钮进入下一个安装界面,选中接受协议复选框,最后单击【Finish】按钮开始安装。当成功安装ADT后,重启Eclipse,这时需要设置一下AndroidSDK的安装目录。单击【Windows】〉【InstallNewSoftware.。。】菜单项.在弹出的对话框中选中左侧的【Android】节点.在右侧的【SDKLocation]文本框中输入AndroidSDK的安装目录,如图3—1—7所示:图3—1—7设置AndroidSDK安装目录至此,客户端开发环境正式安装完成,可以进行客户端的开发。3。2系统服务器开发平台搭建首先依然是需要下载各种需要的软件如JDK、Eclipse3.4(Ganymede)、EclipseGoogle插件。JDK和Eclipse的安装在上面已经完成,不在重复.因此,直接进行EclipseGoogle插件的安装,此插件的安装方式有两种。其一:下载插件包到自己的电脑上进行本地安装;其二:通过Eclipse进行在线安装,所以需要有稳定的Internet连接。在这里介绍第二种安装方法:打开已经安装好的Eclipse,单击【help】〉[SoftwareUpdates]菜单项。在显示的对话框中单击【AvailableSoftware】标签页,然后单击【Addsite.。。]按钮.在显示的对话框的文本框中输入如下地址:/eclipse/plugin/3.4单击【OK】按钮关闭对话框。回到【AvailableSoftware1标签页,选中刚才增加的地址,然后单击右侧的【Install]按钮开始安装GoogleEclipse插件。弹出的安装对话框如图3-1-8:图3—1-8GoogleEclipse插件安装选项单击【Next】按钮进入下一个安装界面,选中接受协议复选框,最后单击行皿1$八】按钮开始安装。当成功安装GoogleEclipse后,重启Eclipse.这时插件及AppEngineSDK均安装成功,可以进入本系统服务器的开发工作了。第四章系统客户端设计与实现Android系统简介系统客户端采用Google开源项目Android手机终端作为承载设备,Android系统架构如图4—1-1所示:Android系统架构由5部分组成,分别是:LinuxKernelsAndroidRuntime、Libraries、ApplicationFramework、Applications.1、LinuxKernelAndroid基于Linux2。6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。LinuxKernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务.2、AndroidRuntimeAndroid包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机.Dalvik虚拟机可执行文件格式是.dex,dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的.两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大.dex是一套工具,可以将Java.class转换成.dex格式。一个dex文件通常会有多个.class。由于dex有时必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。Dalvik虚拟机依赖于Linux内核提供基本功能,如线程和底层内存管理.3、LibrariesAndroid包含一个C/C++库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(applicationframework)暴露给开发者.下面列出一些核心库:系统C库—一标准C系统库(libc)的BSD衍生,调整为基于嵌入式Linux设备媒体库--基于PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4、H0264、MP3、AAC、AMR、JPG、PNG界面管理-—管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层LibWebCore——新式的Web浏览器引擎,驱动Android浏览器和内嵌的web视图SGL——基本的2D图形引擎3D库--基于OpenGLES1.0APIs的实现。库使用硬件3D加速或包含高度优化的3D软件光栅FreeType--位图和矢量字体渲染SQLite—-所有应用程序都可以使用的强大而轻量级的关系数据库引擎4、ApplicationFramework通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序.开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等,很多很多。开发者可以完全使用核心应用程序所使用的框架APIs.应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全限制)。这一机制允许用户替换组件。所有的应用程序其实是一组服务和系统,包括:视图(View)-—丰富的、可扩展的视图集合,可用于构建一个应用程序。包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器内容提供者(ContentProviders)—-使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据资源管理器(ResourceManager)——提供访问非代码资源,如本地化字符串、图形和布局文件使所有的应用程序能够在状通知管理器(NotificationManager)使所有的应用程序能够在状态栏显示自定义警告活动管理器(ActivityManager)—-管理应用程序生命周期,提供通用的导航回退功能5、ApplicationsAndroid装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置.所有应用程序都是用Java编程语言写的.由此可知Android的架构是分层的,非常清晰,分工很明确。Android本身是一套软件堆叠(SoftwareStack),或称为「软件叠层架构」,叠层主要分成三层:操作系统、中间件、应用程序。客户端使用到的接口介绍接口名解释说明android.app。AlertDialogAlertDialog是一种能构造默认的一、二、三个按钮的对话框和单选或多选的的选择对话框android.app.Dialog对话框android.contentoContextAndroid上下文对象androidocontent.Dialoginterface对话框接口androidoos。Bundle数据传递对象androidoview。ViewAndroid可视化界面的父类android.view.View.OnClickListener界面监听器android.widget.Button按钮android.widget.EditText可编辑文本框androidowidget。ImageButton图片按钮androidowidget。TextView文本显示框android.app。ActivityAndroid应用程序的入口,一个Activity代表一个可视化界面android.os。HandlerHandler在android里负责发送和处理消息androidoos.Message一个包含描述信息和任意数据的对象这个对象可以被传递给Handler类
android。widget。LinearLayout界面载体android.contentoIntent界面控件之间数据传递对象android。app.ProgressDialogProgressDialog是继函大自人七八口13108,除了AlertDialog功能外,它还能显视进度圈或条的对话框android.view。KeyEvent界面键盘事件对象android.view。MotionEvent触摸事件对象android.view。View.OnTouchListener触摸事件监听器对象android.widgetcCheckBox复选框对象android.app.Notification通知信息类android。app.NotificationManager通知信息管理器android。app。PendingIntentPendingIntent可以看作是对Intent的包装,供当前App之外的其他App调用android。app。TabActivitytabActivity继承自Activity,其内部定义好了TabHost,可以通过getTabHost()获取android。util.Log日志android。view。Menu菜单对象android。view.Menuitem菜单选项android.widget.AdapterView界面适配器android。widget.ImageView图片界面android。widget。SimpleAdapter简单适配器android。widget。TabHost存放Tab的容器android。widget.ListView界面列表android。widget。Toast提示信息android.widget.AdapterView 。OnItemClickListener列表对象单击事件监听器android.widget 。 TabHost 。OnTabChangeListenerTab变换事件监听器android.graphics.drawable。Drawable绘画对象android。widget.ArrayAdapter数组适配器android。widget.SpinnerSpinner用来显示列表项,类似于一组单选框RadioButtonandroid 。 widget.AdapterView 。OnItemSelectedListener列表项被选中事件监听器android.widget.RadioGroupRadioButton组android。widget.RadioButton为用户提供由两个或多个互斥选项组成的选项集客户端实现客户端采用MVC的设计模式,将数据模型、界面和逻辑有效合理地分离,使得客户端条理清晰,便于功能的改善和扩充。客户端的设计加入了Java多线程技术,除了用户界面的主线程外,客户端使用独立的线程与服务器进行交互,避免了将所有处理放在单一的线程中造成网络连接时界面的卡死现象。4。3。1用户注册模块实现在用户填写注册信息并点击注册按钮之后,进行新用户注册。如果注册成功则返回一个由6位数字组成的ID号,用户必须记住此ID号,他是用户登录的唯一凭证。如果因各种原因,如网络连接等注册失败则,提示用户注册失败,待用户确认之后回到登录界面。注册界面如图4-3-1,注册界面主要类类图如图4—3—2。注册消息包如下:客户端申请注册:(PC000)〈package><type>request〈/type〉<purpose〉register</purpose〉<password>password</password〉<name〉name</name>〈icon〉icon</icon><phone〉phone</phone〉〈sex〉男|女〈/sex〉〈age〉age</age><city〉city</city>〈signature>signature</signature〉〈/package>图4—3-1注册界面图4—3-2注册类类图注册主要代码如下:publicclassRegistViewextendsDialogimplementsOnClickListener{privateContextcontext;publicRegistView(Contextcontext){super(context);this.context=context;}privateButtonsubmit;privateEditTextpassword;privateEditTextensurepassword;privateEditTextname;privateSpinnersex;privateEditTextage;privateEditTextcity;privateEditTextphone;privateEditTextsignature;privateImageButtoniconButton;privatestaticString[]sexArray={”男",”女”};privateArrayAdapter〈String>adapter;privateintposition=0;publicvoidsetIconButton(DrawableiconDrawable){this.iconButton.setImageDrawable(iconDrawable);}privateStringicon;publicvoidsetIcon(Stringicon){this.icon=icon;}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super。onCreate(savedlnstanceState);this。setContentView(R。layout。registview);this.initItems();}/***初始化组件*/privatevoidinitItems(){icon="icon0";submit=(Button)this.findViewByld(R。id。submitFORregist);submit.setOnClickListener(this);password=(EditText)this。findViewById(R.id。passwordFORregist);ensurepassword=(EditText)this。findViewById(R。id。ensurepasswordFORregist);name=(EditText)this。findViewById(R.FORregist);sex=(Spinner)this.findViewById(R。id。sexFORregist);adapter=newArrayAdapter<String>(context,R.layout。itemforregistsex,sexArray);adapter.setDropDownViewResource(R.layoutoitemforregistsex);sex。setAdapter(adapter);sex.setOnItemSelectedListener(newOnItemSelectedListener(){@OverridepublicvoidonItemSelected(AdapterView<?〉arg0,Viewarg1,
intarg2,longarg3){position=arg2;}©OverridepublicvoidonNothingSelected(AdapterView〈?>arg0){}});age=(EditText)this.findViewById(R。id。ageFORregist);city=(EditText)this。findViewById(R.id。cityFORregist);phone=(EditText)this。findViewByld(R。id.phoneFORregist);signature=(EditText)this。findViewById(R.id.signatureFORregist);iconButton=(ImageButton)this.findViewById(R.id。imageFORregist);iconButton。setOnClickListener(this);}©OverridepublicvoidonClick(Viewv){intid=v。getId();if(id==submit。getId()) {StringpasswordStr=password。getText()。toString();StringensurepasswordStr=ensurepassword。getText().toString();StringnameStr=name.getText().toString();StringsexStr=sexArray[position];StringageStr=age.getText()。toString();StringcityStr=city。getText()。toString();StringphoneStr=phone。getText().toString();StringsignatureStr=signatureogetText().toString();if(if(passwordStr.length()0){newMyAlertDialog(context,”密码不能为空”).show();password。setText("“);ensurepassword。setText("”);return;}if(!passwordStr。equals(ensurepasswordStr)){newMyAlertDialog(context,”两次输入密码不同,请重新输A”).show();password.setText(””);ensurepassword.setText("");return;}try{if(IntegeroparseInt(ageStr) >=100||Integer。parseInt(ageStr)<=0) {newMyAlertDialog(context,”请输入正确年龄").show();password。setText("“);ensurepassword。setText(””);return;}}catch(Exceptione){newMyAlertDialog(context,”请输入正确年龄”).show();password.setText(”");ensurepassword。setText("“);return;}this.showDialog();RegistImpl.getRegistlmpl()。regist(nameStr,passwordStr,sexStr,ageStr,cityStr,phoneStr,signatureStr,icon);}elseif(id==iconButton.getId()){newImageDialogFORRegist(context,this).show();}}/***错误信息提示,当用户输入的数据不符合规定时出现*/privateclassMyAlertDialogextendsAlertDialog{protectedMyAlertDialog(Contextcontext,Stringcontent) {super(context);this.setButton("确定",newandroid。contentoDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacearg0,intarg1){arg0odismiss();}});this.setMessage(content);this。setCancelable(false);}}privatevoidshowDialog() {Bundlebundle=newBundle();Messagemsg=newMessage();bundle.putString("status”,”showdialog");msg.setData(bundle);ListStore.getLoginHandler()。sendMessage(msg);
4.3。2用户登录模块实现在用户注册成功之后,服务器会返回给用户一个ID。用户确认之后回到登录界面.用户可以通过此ID和注册时的密码来进行登录。登录界面设计如图4-3—3,登录主要类图如图4—3-4。登录消息包如下:客户端申请登录(PC001):<package〉<type〉request</type>//声明包类型登录//用户id//用户密码〈//声明包类型登录//用户id//用户密码〈id>99999999〈/id><password>a~z1~9〈/password〉〈/package〉图4—3—3登录界面图4-3-4登录类类图登录主要代码如下:protectedvoidonCreate(BundlesavedInstanceState) {super。onCreate(savedInstanceState);setContentView(R.layout.login_view);context=this;userNameEdit=(EditText)this。findViewByld(R。id。id_userId);passwordEdit=(EditText)this.findViewById(R.idoid_password);loginButton=(Button)this.findViewById(R.id.id_login);resetButton=(Button)this。findViewById(R。id。id_reset);//quitButton=(Button)this。findViewById(R.id。id_quit);isSavedCheckBox=(CheckBox)this.findViewById(R。id。isSaved);registButton=(Button)this.findViewById(R。id。id_regist);//添加侦听器isSavedCheckBox。setOnTouchListener(this);loginButton.setOnClickListener(this);}}resetButton.setOnClickListener(this);//quitButton。setOnClickListener(this);registButton。setOnClickListener(this);//提示亚。「卜1门9状态pd=newProgressDialog(this);pd.setTitle("请稍后");pd.setIcon(R.drawable.icon);TOC\o"1-5"\h\zhandler=newHandler() {@OverridepublicvoidhandleMessage(Messagemsg) {Bundlebundle=msg。getData();Stringstatus=bundle.getString("status");reason=bundle.getString(”content");if("successe”。equals(status)) {if(pd。isShowing()){pd。dismiss();}Intentintent=newIntent();intent。setAction("cqupt。team。view.action°MainView”);startActivity(intent);}elseif("timeout”.equals(status)) {//构造界面,展示原因HttpConnectorImpl。getHTTPConn().cleanSession();Intentintent=newIntent();intentoputExtras(bundle);startNewActivity(intent);}elseif("regist_success"oequals(status)){if(pd。isShowing()) {pd。dismiss();
registView。dismiss();newMyAlertDialog(context,”注册成功!\r\n您的账号:“+reason+”,请妥善保管!").show();}elseif("regist_error".equals(status)) {if(pd.isShowing()) {pd。dismiss();}registView。dismiss();newMyAlertDialog(context,”注册失败!\r\n原因:"+reason)。show();}elseif(”showdialog".equals(status)) {pd.setMessage("正在提交注册信息”);pd.show();}else{if(pd.isShowing()) {pd.dismiss();}newMyAlertDialog(context,reason)。show();}}};//判断是否为掉线Intentintent=this。getIntent();Bundlebundle=intent.getExtras();if(bundle!=null) {reason=bundle.getString("content”);newMyAlertDialog(context,reason)。show();}bundlenullbundlenull;ListStore。setLoginHandler(handler);//判断上次登录是否保存密码IdManageridManager=newIdManager();Stringcontent=idManager。getId();if(content!=null) {try{if(!("\r\n".equals(content))) {String[]array=content.split(”\r\n”);userNameEdit。setText(array[0]);passwordEdit。setText(array[1]);isSavedCheckBox.setChecked(true);}}catch(Exceptione) {}}}/***将错误提示显示给用户火@authordai**/privateclassMyAlertDialogextendsAlertDialog{protectedMyAlertDialog(Contextcontext,Stringcontent){super(context);this。setButton(“确定",newandroid.content.DialogInterface。OnClickListener(){©OverridepublicvoidonClick(DialogInterfacearg0,intarg1)arg0。dismiss();}});this。setMessage(content);this.setCancelable(false);}}@OverrideprotectedvoidonPause(){super。onPause();}@OverrideprotectedvoidonStop() {super.onStop();}privatevoidstartNewActivity(Intentintent){intent.setClass(this,LoginView。class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);this.startActivity(intent);}/***监听器,对按键作出相应*大@authordai*/@OverridepublicvoidonClick(Viewview){if(view.equals(resetButton)) {this.userNameEdit.setText(””);this。passwordEdit。setText("”);this.isSavedCheckBox。setChecked(false);}elseif(view。equals(registButton)){registView=newRegistView(this);registView.show();}elseif(view。equals(loginButton)){//判断是否选择了保存密码,Stringusername=userNameEdit。getText().toString();Stringpassword=passwordEdit。getText().toString();if(username.length()==0IIpassword.length()==0)//提示不能为空newMyAlertDialog(context,”用户名和密码都不能为空!”)。show();}else{if(isSavedCheckBox。isChecked()) {(newIdManager()).saveId(username,password);}else{//如果没有选择保存密码,清空文件中的内容(newIdManager()).saveId("", ”");}pd。setMessage("正在登陆中”);pd。show();//调用登录LoginImpl.getLoginImpl().login(username,password);}}}/***对是否选择保存密码作出相应*@authordai*/@OverrideMotionEventmotionevent){publicbooleanonTouch(MotionEventmotionevent){isSavedCheckBox.toggle();returnfalse;}//覆盖返回按钮的事件处理publicbooleanonKeyDown(intkeyCode,KeyEventevent){if(keyCode==4) {newQuitDialog(this).show();returntrue;}elsereturnsuper.onKeyDown(keyCode,event);}/**当用户点击返回按钮用时对话框形式提醒用户是否确认退出@authordai*/privateclassQuitDialogextendsAlertDialog{protectedQuitDialog(Contextcontext) {super(context);this。setCancelable(false);this。setButton(“确定“,newandroid.content.DialogInterface。OnClickListener(){@OverridepublicvoidonClick(DialogInterfacearg0,intarg1){//处理关闭事件Intentsigle=newIntent();sigle。setAction("cqupt.team。view.Loading");sigle.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);sigle。putExtra("what”,"off");startActivity(sigle);}});this。setButton2("取消",newandroid。content.DialogInterface。OnClickListener(){©OverridepublicvoidonClick(DialogInterfacearg0,intarg1){arg0。dismiss();}});this.setMessage(“确定要退出整个程序吗?");this.setCancelable(false);}}4。3。3刷新好友列表模块实现用户成功登录之后,进入主界面。点选主界面菜单中的刷新好友列表就可以手动更新好友列表界面.主要类类图如图4—3-5。刷新好友列表消息包如下:客户端请求刷新好友列表(PC003)<package〉<type〉request</type〉<purpose>refreshbuddylist</purpose〉〈id>999999</id>〈/package>图4—3—5刷新好友列表类类图刷新好友主要代码如下:publicclassRefreshBuddylistImplimplementsRefreshBuddylistInterface/**获得网络连接对象/privateHttpConnectorImplhttpConn;/**获得构造消息包对象/privateProtocolPackageImplppi;privateRefreshBuddylistlmpl() {httpConn=HttpConnectorImpl.getHTTPConn();ppi=ProtocolPackagelmpl。getProtocolPackagelmpl();}/**单例模式,为整个应用提供唯一对象/privatestaticRefreshBuddylistImplrbi=null;/**提供获得单例对象的方法火@returnRefreshBuddylistImpl对象/publicstaticRefreshBuddylistImplgetRefreshBuddylistImpl() {if(rbi==null)rbi=newRefreshBuddylistImpl();returnrbi;}/**提交客户端刷新好友列表请求(PC003)@paramid当前用户账号*/@OverridepublicvoidrefreshBuddylist(Stringid){
refreshbuddlist”,StringsendPack=tocolPC003(refreshbuddlist”,id)httpConn。connect(sendPack);}}4。3。4好友管理模块实现好友管理模块可分为添加好友和删除好友两块。删除好友:当用户选中自己的一个好友之后,点选菜单中删除好友可以将此好友从好友列表中删除,删除好友主要类类图如图4—3-6。添加好友:用户可以搜索并查看符合条件的用户,添加其为好友,添加好友主要类类图如图4—3-7。客户端请求添加好友:(PC006)<package>〈type〉request〈/type〉<purpose〉addbuddy〈/purpose><from_id>id〈/from_id〉<to_id〉id</to_id>〈content>一〈/content〉〈/package>客户端响应添加好友:PC007)〈package>〈type>response〈/type><purpose〉addbuddy〈/purpose〉<from_id〉id</from_id〉〈to_id〉id〈/to_id〉〈result>accept|refuse〈/result〉(content〉…〈/content〉〈/package〉客户端申请删除好友(PC008)〈package〉〈type〉request</type>〈purpose>deletbuddy〈/purpose〉<from_id〉id</from_id〉<to_id〉id〈/to_id〉//声明为添加好友类型〃请求用户id〃准备添加的用户id//声明为添加好友类型〃请求用户id〃准备添加的用户id//申请内容//声明为添加好友类型〃请求用户id〃准备添加的用户id//用户是否同意添加好友//理由//声明为删除好友类型〃申请用户id〃准备删除的用户id图4-3-6图4-3-6删除好友类类图图4-3-7添加好友类类图删除好友主要代码如下:privateDeleteBuddylmpl() {httpConn=HttpConnectorImpl.getHTTPConn();ppi=ProtocolPackagelmpl。getProtocolPackagelmpl();}/***单例模式,为整个应用提供唯一对象/privatestaticDeleteBuddyImpldbi=null;/**提供获得单例对象的方法@returnDeleteBuddyImpl对象*/publicstaticDeleteBuddyImplgetDeleteBuddyImpl() {if(dbi==null)dbi=newDeleteBuddyImpl();returndbi;}/**提交删除好友请求(PC008)@paramfromID当前用户账号大@paramtoID被删除用户账号/@OverridepublicvoiddeleteBuddy(StringfromID,StringtoID){StringsendPack=tocolPC008(”request","deletbuddy",fromID,toID);httpConn。connect(sendPack);}添加好友主要代码如下:publicstaticAddBuddyImplgetAddBuddyImpl(){if(abi==null)abi=newAddBuddyImpl();returnabi;}/**提交添加好友的请求(PC006)@paramfromID当前用户账号(申请者)@paramtoID接受用户账号(被申请添加的用户)@paramcontent附带内容/@OverridepublicvoidaddBuddy(StringfromID,StringtoID,Stringcontent){StringsendPack=tocolPC006("request",”addbuddy”,fromID,toID,content);httpConn。connect(sendPack);}/**大提交添加好友的响应(PC007)@paramfromID当前用户账号(被申请添加的用户)大@paramtoID接受用户账号(申请者)@paramresult响应结果,accept|refuse@paramcontent附带内容/@OverridepublicvoidaddBuddy(StringfromID,StringtoID,Stringresult,Stringcontent){StringsendPack=tocolPC007("response","addbuddy”fromID,toID,result,content);httpConn.connect(sendPack);}4.3。5用户查询模块实现在用户进入系统之后,可以通过不同的条件查看符合条件的其他用户。如根据是否在线查看、根据ID查看等。用户查询模块主要类类图如图4—3-8所示。客户端查询好友信息|ID精确I昵称精确I查找在线(PC005)<package〉〈type>request〈/type><purpose>search_user〈/purpose〉 //声明为查找好友类型<search_type>idIaddnameIaddonline|all〈/search_type〉 //分类型查找〈search_info〉info</search_info> //查找类型具体信息〈/package>图4-3—8用户查询类类图用户查询主要代码如下:privateSearchUserImpl() {httpConn=HttpConnectorImpl。getHTTPConn();ppi=ProtocolPackageImpl。getProtocolPackagelmpl();
/**提供获得单例对象的方法@returnSearchUserImpl对象/publicstaticSearchUserImplgetSearchUserImpl() {if(sui==null)sui=newSearchUserImpl();returnsui;}/**提交查询用户的请求(PC005)@paramsearchType查询方式,如根据账号查询,根据昵称查询,查询当前在线用户,查询所有用户等@paramsearchinfo具体的查询条件,如账号是多少,昵称是什么等/@OverridepublicvoidsearchUser(StringsearchType,Stringsearchinfo) {StringsendPack=tocolPC005("request“,”search_user”,searchType,searchinfo);httpConn.connect(sendPack);}4.3.6聊天模块实现聊天是本系统的主要功能,用户登录之后就可以选择好友列表中的好友双,击进入聊天界面进行聊天.聊天主要类类图如图4—3-9所示。客户端请求发送消息:(PC004)〈package〉<type〉request</type〉//声明为发送消息类型〃发送用户id//目的用户id//消息内容//发送时间〈//声明为发送消息类型〃发送用户id//目的用户id//消息内容//发送时间<from_id〉99999999</from_id〉〈to_id>99999999〈/to_id>〈content>message〈/cont
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏省徐州市市级名校2025-2026学年初三九月月考英语试题含解析
- 四川省成都市浦江县市级名校2026届初三下期末考试(数学试题理)试卷含解析
- 四川省眉山市洪雅县2025-2026学年初三年级第一次调研考试语文试题含解析
- 重庆市西南大附中2025-2026学年初三一模考试物理试题试卷(理工类)含解析
- 期浙江省金华市市级名校2025-2026学年初三年级校内模拟英语试题试卷(最后一卷)含解析
- 四川省泸州泸县联考2026年初三线上测试英语试题试卷含解析
- 湖北省襄阳襄城区四校联考2026届初三英语试题下学期第四次月考试题含解析
- 期货操盘合同
- 2026年跨学科科研团队高效协作模式探索与实践
- 2026年企业品牌传播的线下活动整合策略研究
- MOOC 管理学原理-武汉理工大学 中国大学慕课答案
- 高中英语阅读教学问题链设计
- 心脏大血管护理查房课件
- 2023年江苏南京市特种设备安全监督检验研究院招考聘用高层次人才笔试历年高频考点试题含答案带详解
- 巴林特工作小组培训
- (完整版)船舶涂装
- 安徽绿沃循环能源科技有限公司12000t-a锂离子电池高值资源化回收利用项目(重新报批)环境影响报告书
- 幼儿园施工单位竣工验收自评报告
- 城市社会地理学16城市社会学研究方法
- 中央空调系统设计详细计算书
- 儿科疾病作业治疗(治疗) 作业治疗课件
评论
0/150
提交评论