安卓应用开发 -- 柚信 -- “模仿微信即时通讯软件“

1. 设计内容及要求

1.1. 综述

1.1.1. 系统概述

我们要做的就是类似微信这样的面向大众的聊天软件,基本功能和微信类似。首先,系统分为两大部分,第一部分是客户端,是用户使用的部分,第二部分是服务器,所有的客户端都是通过服务器来进行用户身份验证及聊天转接的。客户端提供主要的界面及服务请求,如:登录界面、注册界面、主窗体界面、聊天界面、信息查看界面等。客户端主要提供服务请求界面,核心的业务逻辑处理主要由服务器提供,并向客户端发送请求的结果。同时,服务器要能提供服务的开启、及客户端登录日志。

1.1.2. 开发环境

运行环境:Idea集成开发环境jdk1.8版本
使用语言:JAVA语言
使用数据库:MySQL数据库

1.2. 需求分析

1.2.1. 需求背景

即时通信软件为我们提供了诸多的方便,使我们逐步享受信息时代的便捷。大家最熟悉的即时通信软件就是微信了,因为它几乎已经融入了我们每个人的日常生活。没有了微信,没有了手机,我们或许真的“活不了了”。由此可见,生活在信息时代的人们对即时通信、聊天软件有巨大的需求,这样的软件也将为我们节省大量的时间和金钱,或许还能成为我们发家致富的工具,比如:产品的推介、售后服务及技术交流等。
然而,既然已经有了微信如此强大的即时通信软件,我们再去做这样的软件还有什么竞争力吗?微信已经深入人心,要想再去做可能没有任何竞争力。此时,我们可以换一个角度,调整用户对象。如今,企业内部信息在这个信息时代就是金钱,尤其是一些大企业的内部信息,如果这些信息泄露,可能会造成巨大的经济损失,甚至将导致企业破产。但是,为了便捷企业员工之间的交流,做这样的一个企业内部即时通信、聊天软件还是很有市场的。我们的目标就是做的像微信,但面向企业内部使用。
企业内部为了方便员工之间便捷的交流,需要开发一款适合企业内部员工进行即时通信的软件,这样的软件既满足了企业内部员工之间便捷的交流,同时,也防止企业内部信息的外流,开发这样一块面向企业内部的即时通信软件,对于企业来说获益良多。
在开发这款软件时,为了使习惯了使用微信的用户,更加方便的使用本软件,我们将很大程度上,模仿微信的用户界面设计,以适应用户的使用习惯,方便用户使用。

1.2.2. 功能需求

  1. 客户端:提供登录、主窗体及聊天等界面及对应的业务逻辑,向服务器发送相应的服务请求,并接受相应的处理结果。客户端是轻量级的软件,只负责链接远程服务器,并发出相应的服务请求,并不进行核心业务逻辑的处理。具体的处理交给服务器,而客户端只接收服务器处理的结果并显示给用户。

  2. 服务器:监控登录信息及在线用户信息,接收客户端的服务请求,并做相应的处理,然后将处理结果发送给客户端。服务器负责处理核心的业务逻辑,并负责连接数据库,保存和读取数据。因此,服务器端设计的好坏也直接影响即时通信软件的质量。

1.2.3. 用例描述

客户端:
在这里插入图片描述
服务器:
在这里插入图片描述

2. 设计原理及方案

2.1. 总体设计

2.1.1. 系统架构设计

  1. 前端使用MVC进行开发 后端使用Springboot + JPA开发
  2. 文件组织:
    • 客户端:
      在这里插入图片描述
      在这里插入图片描述
    • 服务器:
      在这里插入图片描述
    1. 采用基于网路的三层C/S模式
      在这里插入图片描述

2.1.2. 功能模块设计

  1. 客户端:
    在这里插入图片描述
  2. 服务器:
    在这里插入图片描述

2.1.3. 数据库设计

  1. 概念结构设计
    在这里插入图片描述
  2. 逻辑结构设计
    用户表(柚信ID,姓名,头像ID,简拼,手机号,密码,缩写,个性签名)
    聊天记录表(信息ID,发送者ID,接受者ID,发送日期,发送内容,发送类型)
    好友表(好友关系ID,本人ID,好友ID,好友备注)
    信息列表表(列表ID,对方备注,本人ID,好友ID,最新内容,头像ID)
  3. 表结构设计
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.1.4. 通信协议设计

计算机之间传送数据由两种,即TCP通信和UDP通信。TCP是可靠的面向连接的通信协议,UDP是不可靠的面向无连接的通信协议。这里我们采用了TCP的方式。
基于TCP的通信
在进行登录用户验证、添加好友、删除好友、发送消息等操作时,采用基于TCP的通信协议。

2.1.5. 缓存数据设计

  1. 用户消息Bean
    为了保存用户及好友的个人信息,此处设计用户信息缓存数据,当用户登录时,将用户个人及好友的基本信息保存,以备用户查询,就不用再次连接数据库获取了。
  2. 消息信息Bean
    用户在聊天时,需要传递必要的信息,此处消息bean数据结构就是存储收发用户的ID、IP地址、消息内容等信息。

2.2. 详细设计

2.2.1. 系统流程图

在这里插入图片描述

2.2.2. 设计模式使用

中介者模式:
所有的用户都通过服务器进行通信,服务器起中介的作用。
观察者模式:
当有消息发出时,不管好友在不在线,都会发送出去并写入数据库。

2.2.3. 通信协议的实现

TCP/IP协议

2.2.4. 数据访问层实现

JPA

2.2.5. 界面层实现

主界面的主要内容有消息列表显示,创建消息列表所需要的信息是从服务端获得的;还有一些辅助界面,比如查看好友资料或者查看自己的资料界面,查找好友界面,添加好友界面等。

3. 实现效果

欢迎页

登录界面
在这里插入图片描述
密码填写
在这里插入图片描述
注册账号
在这里插入图片描述
主页面
在这里插入图片描述
右上角弹出气泡
在这里插入图片描述
好友列表页
在这里插入图片描述
发现页
在这里插入图片描述
个人主页
在这里插入图片描述
扫码页面
在这里插入图片描述
个人信息页面
在这里插入图片描述
二维码生成界面
在这里插入图片描述
好友信息界面
在这里插入图片描述
聊天界面
在这里插入图片描述

4. 技术难点与解决方案

4.1. 前端部分

4.1.1. 顶部沉浸式状态栏

顶部为了加强用户体验,使用了windowManager对象控制顶部占用系统状栏。
在这里插入图片描述

Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

4.1.2. 改变顶部状态栏文字颜色

顶部改为沉浸式状态栏时,发现系统会自动将顶部状态栏文字的颜色进行该改变,并不是系统根据背景去主动变色,而是我们需要去手动改变系统状态栏的文字颜色(可以参看上图状态栏)。
查阅了小米开发文档发现,可以采用以下android的标准方法。

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

为了让界面文字自适应的不显示在状态栏,我们选择的办法是在每个Activity里添加一个状态框布局,为其添加fitsSystemWindow属性,即可达到效果。
在这里插入图片描述

4.1.3. 右上角悬浮框

右上角悬浮框采用了PopupWindow 组件,背景是自己用 PS 绘制的一个气泡图形,解决了布局定位问题,以及渐入渐出的动画效果。

4.1.4. 聊天界面底部输入框动效

输入框获取到焦点时,消息列表界面向上滚动,下部布局向上浮动。。。。。。。

4.1.5. 登录状态记录

要实现记住登录,我们当然需要将一些数据保存到什么地方。android为我们提供了以下几种保存数据的机制

  1. SharedPreference 最简单,也是我们要使用的
  2. sqlite数据库 可以实现,但是操作要麻烦一些
    这里我们使用了SharedPreference来记录。

4.1.6. 气泡动态改变大小

在这里插入图片描述

4.1.7. 加好友广播:

当收到好友申请时,手机顶部会弹出加好友信息。得写一个广播接收器,接收请求后弹出notification状态栏。

4.1.8. 底部导航栏:

底部导航栏使用的是RadioGroup+ViewPager,这是一种比较常见了的,下面4个tab的导航按钮,可以切换不同的页面,这里页面使用了ViewPager+Fragment的组合,实现了滑动的页面效果。4个Fragment对应四个不同的tab分别对应微信、通讯录、发现、我四个页面

4.2. 后端部分

4.2.1. 项目架构

该项目后端选用 springboot 进行开发,简便快捷,同时前端部分使用OKHttp 请求框架,volley 需要依靠httplcient,而google在android 6.0 sdk 中去掉了httpcient,所以 OKHttp 更好用一些。
数据库的选择:SQLite VS MySQL。SQLite 简单轻量级,很适合 android 应用开发,但是相对于一个 C/S 应用程序,MySQL 表现更加出色,故这里选择在服务器中搭建一个 MySQL 环境。

4.2.2. OkHttp JSON 数据处理

由于获取的 response 对象需要通过 在这里插入图片描述
转化成字符串,我们需要将它解析成JSON数组对象,然后取值。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张甜不拉几

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值