开发实训10---Android---注册登录功能实现1
用户在观看完应用介绍页面之后,会点击进入应用按钮,这时由于用户是第一次运行,所以会弹出注册页面。如果是老用户,启动应用时,在Splash页面之后,如果应用记录着用户的登录信息,测直接进入主页面,如果从本地取不到用户登录信息,则将显示登录页面。
注册和登录功能看起来很简单,但是由于我们这里需要实现一个完整的应用支撑基础设施,因此需要分几个部分来进行。我们首先会讨论怎样创建并使用Activity中会用到的Model类,在这中间我们会采用Application对象作为中心信息仓库,每个Model类只是中心信息仓库的视图,便于对应的Activity类来使用;接着我们会讨论Activity类的基类,在其中包装诸如按回退键提示退出等功能;接着我们会讨论网络请求的实现,这里我们采用异步任务的方式来进行,协议采用Json Over Http,因此会顺便介绍Json的解析。
在进入正文之前,首先解释一个问题,我们什么时候检查版本更新。一般你可以在很多点来检查版本更新,我在这里采用进入主页面前检查版本更新,为什么这样做呢?因为在实际项目中,我们可能会有些小范围测试的版本,我们会采用灰度更新的机制,即只有一部分用户会收到更新通知,试用最新版本,如果反响很好,我们再向普通用户推出版本更新,因此检查版本更新放在了登录之后。
好了,我们先来看怎样实现MVC中的Model。我们首先在WkyLib工程中,定义Model的基类WkyModel,代码如下所示:
[java] view plaincopy
public class WkyModel {
public static WkyModel getInstance(String objectId, Class cls) {
if (models.containsKey(objectId)) {
return models.get(objectId);
}
WkyModel model = (WkyModel)WkyReflection.callPrivateConstructor(cls);
model.setObjectId(objectId);
Log.e("wky", "cls:" + cls.getCanonicalName() + "!");
if (null == model) {
model = new WkyModel();
}
models.put(objectId, model);
return model;
}
public static void removeObject(String objectId) {
models.remove(objectId);
}
public static void removeInstance(String objectId) {
models.remove(objectId);
}
/**
* 在Activity.onDestroy中调用,判断是否需要将实例从models中移除
* @return
* 【闫涛 2015.09.17】初始版本
*/
public boolean isShared() {
return isShared;
}
/**
* 如果想要在多个界面中使用同一个Model对象,则需要调用此函数,
* 将isShared设置为true,这时在Activity.onDestroy中就不会将本实例从models中移除了
* @param isShared
* 【闫涛 2015.09.17】初始版本
*/
public void setShared(boolean isShared) {
this.isShared = isShared;
}
public String getObjectId() {
return objectId;
}
public void setObjectId(String objectId) {
this.objectId = objectId;
}
private static HashMap<String, WkyModel> models = new HashMap<String, WkyModel>();
protected boolean isShared = false;
protected String objectId = null;
}
假设一个Activity有对应的Model类时,例如JysRegisgetrLoginActivity需要JysRegisterLoginModel类对象时,会通过调用getInstance方法来获取实例。每个Model类,可以同时存在多个实例,保存在models属性中。一般情况下,Activity在onCreate或在启动此Activity时,会生成一个Model类的实例,当该Activity退出时,在onDestroy回调函数中将该实例从models属性中移除。但是如果设置了isShared为ture时,则onDestroy方法中就不会移除此对象,就可以在不同的Activity实例中使用了。
在上面的代码中,我们用到了Java的反射机制,根据getInstance方法第二个参数的类,调用该类的私有无参数构造函数,生成该类的对象,我们引入了一个反射工具类WkyReflection,代码如下所示:
[java] view plaincopy
public class WkyReflection {
/**
* 调用类的私有无参数构造函数,生成该类对象并返回该对角
* 例子:
* WkyRegisterLoginModel model = (WkyRegisterLoginModel)WkyReflection.callPrivateConstructor(WkyRegisterLoginModel.class);
* @param cls
* @return
* 【闫涛 2015.09.17】初始版本
*/
public static Object callPrivateConstructor(Class cls) {
Constructor[] constructor = cls.getDeclaredConstructors();
constructor[0].setAccessible(true);
Object rst = null;
try {
rst = constructor[0].newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rst;
}
}
在本节开头我们就提到,我们的信息保存在应用的中心信息仓库中,每个Model里保存的,只是其中的一部分,在Android平台下,我们可以利用Application子类来作为中心信息仓库,代码如下所示:
[java] view plaincopy
/**
* model类将所有信息均保存在HashMap中,这样信息可以在Model之间共用
* @param key
* @param val
* 【闫涛 2015.09.17】初始版本
*/
public static void putObject(String key, Object val) {
params.put(key, val);
}
/**
* 从HashMap中取出相应的信息,调用者需要将其转化为正确的类
* @param key
* @return
* 【闫涛 2015.09.17】初始版本
*/
public static Object getObject(String key) {
return params.get(key);
}
public void exitApp() {
System.exit(1);
}
public static WkyApplication instance = null;
private static HashMap<String, Object> params = new HashMap<String, Object>();
下面我们来看注册登录的基类WkyRegisterLoginModel类的实现:
[java] view plaincopy
public class WkyRegisterLoginModel extends WkyModel {
protected WkyRegisterLoginModel() {
WkyApplication.putObject(WkyConstants.ROLE_ID, Integer.valueOf(WkyConstants.ROLE_JYS));
WkyApplication.putObject(WkyConstants.REGISTER_LOGIN_STATE, Integer.valueOf(STATE_LOGIN));
roleId = (Integer)WkyApplication.getObject(WkyConstants.ROLE_ID);
state = (Integer)WkyApplication.getObject(WkyConstants.REGISTER_LOGIN_STATE);
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public int getRoleId() {
return roleId;
}
public void setRoleId(int roleId) {
this.roleId = roleId;
}
public final static int STATE_REGISTER = 1;
public final static int STATE_LOGIN = 2;
public final static int STATE_FORGET_PWD = 3;
public final static int STATE_ACTIVATE = 4;
private int state = STATE_LOGIN;
private int roleId = WkyConstants.ROLE_JYS;
}
在上面的代码中,里面有两个属性比较重要,第一个state代表注册登录Activity所处的状态,一共有四种:注册、登录、忘记密码、激活,第二个属性roleId代表用户的角色,可以是基因师也可以是大众。需要注意的是,在构造函数中,这两个属性的值是存到中心信息仓库中的。
下面看具体应用WkgJys中,怎样定义具体的Model类JysRegisterLoginModel:
[java] view plaincopy
public class JysRegisterLoginModel extends WkyRegisterLoginModel {
protected JysRegisterLoginModel() {
super();
isShared = false;
}
}
在这里,由于没有特别的需要,没有定义新的属性,因此代码很简单。但是需要注意的是isShared = false,意味着在onDestroy方法中,这个实例将被移除,不会被共享。
好了,有了上述代码,Model体系就创建完成了。在下一节中,我们将讲到怎样实现MVC中的C,即Activity的实现方式。
开发实训10---Android---注册登录功能实现1相关推荐
- Android实训内容及过程,Android项目开发实训大纲.doc
Android项目开发实训大纲Android项目开发实训大纲 黎明职业大学信息与电子工程学院 <Android项目开发> 实训指导书 2014年6月 <Android项目开发> ...
- 一步步开发自己的博客 .NET版(3、注册登录功能)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) ...
- 手机短信验证码一键注册登录功能开发 2
1. 上一篇我们开发好了 短信验证码的发送功能, 接下来开发 我们的 一键登录注册功能 2. 有前端的视图我们可以看到, 传入的参数为手机号和验证码,我们用BO对其进行统一的封装,同时使用valid ...
- java坦克大战 实训报告_坦克大战系统《Java程序开发实训》综合实训报告.doc
坦克大战系统<Java程序开发实训>综合实训报告 <Java程序开发实训>综合实训报告 题目: 坦克大战系统 姓名: 方庆 学号: 2010203206 班级: 10软件(2) ...
- 写数字android实训报告,android实训报告..doc
实习报告 实习性质: 学 院: 信息工程学院 班 级: 学生姓名: 学 号: 指导老师: 实习时间: 实训目的和任务 实训任务 android视频播放器系统的设计与实现 2.实训目的 本学期我们学习了 ...
- 安卓仿美团开发实训课程
系列文章目录 课程设计开发的是一款网上订餐的应用,该项目与我们平常看到的外卖界面比较类似,展示的内容包括店铺.菜单.购物车.订单与支付等信息. 文章目录 系列文章目录 前言 一.效果展示 二.项目结构 ...
- 3d游戏开发实训结项总结
学校的3d游戏开发实训在历时一个多月之后终于告一段落了,回顾整个实训的过程,自己主要承担了游戏客户端大部分的开发任务,包括角色和镜头的控制,AI逻辑的实现等等,也在实际的编码过程中锻炼了技术.在前期还 ...
- 01: 实现注册登录功能
目录:抽屉项目之js最佳实践 01: 实现注册登录功能 02: 实现发布帖子功能 03: 将帖子展示到页面.点赞 04: 层级评论 目录: 1.1 显示.隐藏 "登录/注册" 菜单 ...
- 8、ABPZero系列教程之拼多多卖家工具 添加手机注册登录功能
现在网站基本都用手机注册,很少用邮箱注册,本篇内容比较多,代码我会尽量加备注,有些操作需要连续添加几个文件才不报错,如果VS显示错误,请继续后续步骤. 前面已经有一篇文章讲到集成短信发送模块:http ...
- JavaWeb实现注册登录功能并将用户数据写进数据库(商城系统第一部分)
JavaWeb实现注册登录功能并将用户数据写进数据库(商城系统第一部分) 声明:本人并非项目原创,该商城系统原创来自撩课高新强老师:https://study.163.com/course/intro ...
最新文章
- Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法
- docker desktop 镜像_Spring Boot实战工具4 - Docker
- IOS 9人机界面指南(1):UI设计基础
- 使用计算机仿真的作用是什么,计算机仿真及其在制造业中的应用
- Oracle学习之DATAGUARD(八) Switchover与failover
- 2017 年大数据、物联网与 AI 的趋势预测
- 【EOS】EOS环境基础
- 关于文章cisco漏洞4786
- nginx伪静态php如何配置文件,nginx实现thinkphp伪静态的配置例子
- 报童问题模型matlab,报童模型matlab
- 单片机 最小系统原理图
- 最新PHP全开源京东淘宝唯品会自动抢单系统源码
- js 校验是否合法的中国身份证
- ff14 人最多的服务器,记录FF14全服人数最少的服务器红茶川
- 数据库连接查找不到数据库_查找具有受保护的健康信息的数据库
- 参数服务器——分布式机器学习的新杀器
- 【C++算法题】求三角形边长
- 阿里云对象存储OSS标准型(LRS)存储包详解
- [2]无线通信--CDMA多址技术(1)
- 7-4 森森旅游 (20 分)