Android 用户Session管理的设计方案

 更新时间:2017年12月12日 11:26:37   投稿:mrr  
这篇文章主要介绍了Android 用户Session管理的设计方案,需要的朋友可以参考下

相信大家都知道,每一个App都需要登录,登录信息都保存在本地文件中,然后我们就写一堆的操作SharedPreferences的代码了。

现在,你可以完全抛弃这种方法,一句代码搞定登录信息,用户信息管理。实现全局操作。为你的程序解耦。

public void sessionDemo() {
    // 获取登录信息
    TokenInfo token = SessionManager.getDefault().getUserToken();
    // 获取用户信息
    UserInfo userInfo = SessionManager.getDefault().getUser();
    // 是否登录
    boolean isLogin = SessionManager.getDefault().isLogin();
    // 退出登录
    SessionManager.getDefault().clear();
    // 登录成功后,设置用户信息
    SessionManager.getDefault().setUser(new UserInfo());
    // 登录成功后,设置登录信息
    SessionManager.getDefault().setUserToken(new TokenInfo());
    // 这句请在Application onCreate 的时候调用初始化配置信息
    SessionManager.initWithConfig(
        new SessionManager.ConfigBuilder()
            .context(this)
            .tokenClass(TokenInfo.class)
            .userClass(UserInfo.class)
            .build());
    Log.i("rae", "登录信息:" + token);
    Log.i("rae", "用户信息:" + userInfo);
    Log.i("rae", "是否登录:" + isLogin);
  }

一、设计

抽象工厂模式,整体UML如下图,整体思路为:

抽象出SessionManager类,实际还是PreferencesSessionManager实现了这个抽象类,进行本地SharePreferences保存。

Config:负责维护实体类的class,用来做JSON序列化保存到本地的。这个类起到泛型解析的作用,getUser()返回的对象就由这个类去维护了。从而达到了解耦的作用。

ConfigBuild:构建者模式,提供方便的会话配置。

SessionManager.getDefault(); 默认返回的是PreferencesSessionManager的实例。

二、自定义SessionManger

如果不想用SharePreferences来保存用户信息,也可以继承SessionManger类实现抽象方法实现自定义的Session管理。

如果你的自定义也想全局访问,那么可以新增一个AppSessionManger的类,来实现一个单例方法,返回你自定义的实现。

参考SessionManger.getDefault()的实现就可以了。

三、 SessionManger 代码实现

/**
 * 会话管理
 * Created by ChenRui on 2017/4/28 0028 17:27.
 */
public abstract class SessionManager {
  public static class Config {
    Class<?> userTokenClass;
    Class<?> userClass;
    Context context;
  }
  public static class ConfigBuilder {
    private final Config mConfig;
    public ConfigBuilder() {
      mConfig = new Config();
    }
    public ConfigBuilder tokenClass(Class<?> cls) {
      mConfig.userTokenClass = cls;
      return this;
    }
    public ConfigBuilder userClass(Class<?> cls) {
      mConfig.userClass = cls;
      return this;
    }
    public ConfigBuilder context(Context applicationContext) {
      mConfig.context = applicationContext;
      return this;
    }
    public Config build() {
      return mConfig;
    }
  }
  private static Config sConfig;
  private static WeakReference<SessionManager> managerWeakReference;
  /**
   * 获取默认的会话管理器,默认的为cookie 管理器。
   * 使用之前请使用{@link #initWithConfig(Config)} 来进行初始化配置。
   */
  public static SessionManager getDefault() {
    if (sConfig == null) {
      Log.w("SessionManager", "session config from default");
      sConfig = new ConfigBuilder().tokenClass(SessionToken.class).userClass(SessionUserInfo.class).build();
    }
    if (managerWeakReference == null || managerWeakReference.get() == null) {
      synchronized (SessionManager.class) {
        if (managerWeakReference == null || managerWeakReference.get() == null) {
          managerWeakReference = new WeakReference<SessionManager>(new PreferencesSessionManager(sConfig));
        }
      }
    }
    return managerWeakReference.get();
  }
  /**
   * 初始化会话管理器
   */
  public static void initWithConfig(Config config) {
    if (sConfig != null) {
      sConfig = null;
      System.gc();
    }
    sConfig = config;
  }
  SessionManager() {
  }
  /**
   * 是否登录
   */
  public abstract boolean isLogin();
  /**
   * 清除会话信息,即退出登录。
   */
  public abstract void clear();
  /**
   * 获取当前登录的用户信息,在调用该方法之前请先调用{@link #isLogin()}来判断是否登录
   */
  public abstract <T> T getUser();
  /**
   * 设置当前用户信息
   */
  public abstract <T> void setUser(T user);
  /**
   * 设置用户授权信息
   *
   * @param token 授权信息
   */
  public abstract <T> void setUserToken(T token);
  /**
   * 获取用户授权信息
   */
  public abstract <T> T getUserToken();
}

本文结束,非常简单的实现,但是却非常实用!

GitHub开源:https://github.com/raee/retrofit-ext.git

总结

以上所述是小编给大家介绍的Android 用户Session管理的设计方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Android中使用ViewFlipper进行手势切换实例

    Android中使用ViewFlipper进行手势切换实例

    这篇文章主要介绍了Android中使用ViewFlipper进行手势切换的方法,以实例形式详细讲述了XML文件的定义及功能函数的实现过程,需要的朋友可以参考下
    2014-10-10
  • Android指纹识别功能深入浅出分析到实战(6.0以下系统解决方案)

    Android指纹识别功能深入浅出分析到实战(6.0以下系统解决方案)

    指纹识别在现实应用中已经很多了,本篇文章主要介绍了Android指纹识别功能,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • android文件上传示例分享(android图片上传)

    android文件上传示例分享(android图片上传)

    最近在做项目是用到Android上传功能,就写了个Android上传组件,支持拍照录用录视频和选择文件,需要的朋友可以参考下
    2014-04-04
  • ViewPager+Fragment实现侧滑导航栏

    ViewPager+Fragment实现侧滑导航栏

    这篇文章主要为大家详细介绍了ViewPager+Fragment实现侧滑导航栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • 制作独立的Android模拟器实现方法

    制作独立的Android模拟器实现方法

    本文主要介绍如何制作独立的Android模拟器,这里给大家提供详细的制作流程,有需要的小伙伴可以参考下
    2016-08-08
  • android自定义view制作圆形进度条效果

    android自定义view制作圆形进度条效果

    这篇文章主要为大家详细介绍了android自定义view制作圆形进度条效果的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android使用SqLite实现登录注册功能流程详解

    Android使用SqLite实现登录注册功能流程详解

    这篇文章主要介绍了使用Android Studio自带的sqlite数据库实现一个简单的登录注册功能,SQLite是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • DataBinding onClick的七种点击方式

    DataBinding onClick的七种点击方式

    这篇文章主要给大家介绍了关于DataBinding onClick的七种点击方式,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Android仿淘宝订单页面效果

    Android仿淘宝订单页面效果

    这篇文章主要介绍了Android仿淘宝订单页面效果,电商项目的订单管理模块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 详解Android中的Service

    详解Android中的Service

    这篇文章主要介绍了Android中的Service,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03

最新评论