用户在观看完应用介绍页面之后,会点击进入应用按钮,这时由于用户是第一次运行,所以会弹出注册页面。如果是老用户,启动应用时,在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相关推荐

  1. Android实训内容及过程,Android项目开发实训大纲.doc

    Android项目开发实训大纲Android项目开发实训大纲 黎明职业大学信息与电子工程学院 <Android项目开发> 实训指导书 2014年6月 <Android项目开发> ...

  2. 一步步开发自己的博客 .NET版(3、注册登录功能)

    前言 这次开发的博客主要功能或特点:     第一:可以兼容各终端,特别是手机端.     第二:到时会用到大量html5,炫啊.     第三:导入博客园的精华文章,并做分类.(不要封我)     ...

  3. 手机短信验证码一键注册登录功能开发 2

    1. 上一篇我们开发好了 短信验证码的发送功能, 接下来开发 我们的 一键登录注册功能 2. 有前端的视图我们可以看到, 传入的参数为手机号和验证码,我们用BO对其进行统一的封装,同时使用valid ...

  4. java坦克大战 实训报告_坦克大战系统《Java程序开发实训》综合实训报告.doc

    坦克大战系统<Java程序开发实训>综合实训报告 <Java程序开发实训>综合实训报告 题目: 坦克大战系统 姓名: 方庆 学号: 2010203206 班级: 10软件(2) ...

  5. 写数字android实训报告,android实训报告..doc

    实习报告 实习性质: 学 院: 信息工程学院 班 级: 学生姓名: 学 号: 指导老师: 实习时间: 实训目的和任务 实训任务 android视频播放器系统的设计与实现 2.实训目的 本学期我们学习了 ...

  6. 安卓仿美团开发实训课程

    系列文章目录 课程设计开发的是一款网上订餐的应用,该项目与我们平常看到的外卖界面比较类似,展示的内容包括店铺.菜单.购物车.订单与支付等信息. 文章目录 系列文章目录 前言 一.效果展示 二.项目结构 ...

  7. 3d游戏开发实训结项总结

    学校的3d游戏开发实训在历时一个多月之后终于告一段落了,回顾整个实训的过程,自己主要承担了游戏客户端大部分的开发任务,包括角色和镜头的控制,AI逻辑的实现等等,也在实际的编码过程中锻炼了技术.在前期还 ...

  8. 01: 实现注册登录功能

    目录:抽屉项目之js最佳实践 01: 实现注册登录功能 02: 实现发布帖子功能 03: 将帖子展示到页面.点赞 04: 层级评论 目录: 1.1 显示.隐藏 "登录/注册" 菜单 ...

  9. 8、ABPZero系列教程之拼多多卖家工具 添加手机注册登录功能

    现在网站基本都用手机注册,很少用邮箱注册,本篇内容比较多,代码我会尽量加备注,有些操作需要连续添加几个文件才不报错,如果VS显示错误,请继续后续步骤. 前面已经有一篇文章讲到集成短信发送模块:http ...

  10. JavaWeb实现注册登录功能并将用户数据写进数据库(商城系统第一部分)

    JavaWeb实现注册登录功能并将用户数据写进数据库(商城系统第一部分) 声明:本人并非项目原创,该商城系统原创来自撩课高新强老师:https://study.163.com/course/intro ...

最新文章

  1. Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法
  2. docker desktop 镜像_Spring Boot实战工具4 - Docker
  3. IOS 9人机界面指南(1):UI设计基础
  4. 使用计算机仿真的作用是什么,计算机仿真及其在制造业中的应用
  5. Oracle学习之DATAGUARD(八) Switchover与failover
  6. 2017 年大数据、物联网与 AI 的趋势预测
  7. 【EOS】EOS环境基础
  8. 关于文章cisco漏洞4786
  9. nginx伪静态php如何配置文件,nginx实现thinkphp伪静态的配置例子
  10. 报童问题模型matlab,报童模型matlab
  11. 单片机 最小系统原理图
  12. 最新PHP全开源京东淘宝唯品会自动抢单系统源码
  13. js 校验是否合法的中国身份证
  14. ff14 人最多的服务器,记录FF14全服人数最少的服务器红茶川
  15. 数据库连接查找不到数据库_查找具有受保护的健康信息的数据库
  16. 参数服务器——分布式机器学习的新杀器
  17. 【C++算法题】求三角形边长
  18. 阿里云对象存储OSS标准型(LRS)存储包详解
  19. [2]无线通信--CDMA多址技术(1)
  20. 7-4 森森旅游 (20 分)

热门文章

  1. ubuntu校准时间
  2. 计算机图形学(二)输出图元_6_OpenGL曲线函数_5_其他曲线
  3. 亚媒社和亚洲传媒集团的发展,亚洲传媒集团,亚洲传媒集团怎么样,亚洲传媒,亚太传媒
  4. python 编程4,和7 幸运数字
  5. bzoj1085 骑士精神
  6. 三毛的诗 I 如果有来生
  7. 第二次作业--分析微博
  8. Simscape Multibody Contact Forces Libray
  9. 字符串处理函数---strpos()
  10. 二叉树(树,森林,二叉树互转)