SharePreference的应用---完成自动登录功能

实现思路

所需类

userHelp

在程序中需要显示/使用手机号时,能提供当前登录用户的手机号
由于一个app只能由一个用户进行使用,故这个类要使用单例模式

public class UserHelp {
    private static UserHelp instance;//null
    private UserHelp(){

    }
    public static UserHelp getInstance(){
        if (instance ==null){
            synchronized (UserHelp.class){
                if (instance == null){
                    instance = new UserHelp();
                }
            }
        }
        return instance;
    }
    private String phone;

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

SPUtils

将使用sharedPreference的方法都放在里面,主要有三个方法
添加Token,验证Token是否存在,删除Token

**
 * @ 功能处理所有有关SharedPreferences 操作
 * Ctreate by barry on 2020/10/17.
 */
public class SPUtils {
    /**
     *当用户登陆时,利用 sharedPreference 来做标记(手机号)--保存手机号
     */
    public static boolean saveUser(Context context,String phone){
        boolean result = false;
        SharedPreferences.Editor editor = context.getSharedPreferences(SPConstance.SP_NAME,Context.MODE_PRIVATE).edit();
        editor.putString(SPConstance.SP_KEY,phone);
        result = editor.commit();
        return result;
    }

    /**
     * 是否存在用户,他是作为之前登录过的标志,故只能存在一个值,有即可
     */
    public static boolean isLoginUser(Context context){
        boolean result =false;
        SharedPreferences pref= context.getSharedPreferences(SPConstance.SP_NAME,Context.MODE_PRIVATE);
        String phone =pref.getString(SPConstance.SP_KEY,"");
        if (!TextUtils.isEmpty(phone)){
            result =true;
//            如果有,直接给UserHelp 赋值
            UserHelp.getInstance().setPhone(phone);
        }
        return result;
    }
    /**
     * 登出时,去除标志
     */
    public static boolean removeUser(Context context){
        boolean result =false;
        SharedPreferences.Editor editor= context.getSharedPreferences(SPConstance.SP_NAME,Context.MODE_PRIVATE).edit();
        editor.remove(SPConstance.SP_KEY);
        result = editor.commit();
        return result;

    }
}

逻辑呈现

1.用户登录
1.当用户登陆时,利用 sharedPreference 来做标记(手机号)–保存手机号
2.利用单例模式创建UserHelp --保存用户信息(一个app只有一个用户)
(两个时间点)
1.用户登入之后
2.用户打开应用程序时,检测SharedPreferences 中是否存在登录用户的标记如果有,直接给UserHelp 赋值,并且进入主页。如果不存在,则进入用户页面。
2.用户退出
1.删除掉SharedPreferences 保存的标记,回退到登录界面。

代码实现

1

当用户登陆时,利用 sharedPreference 来做标记(手机号)–保存手机号
1.保存标记

  /**
 * 保存标记
 */
private static boolean saveToken(Context context, String phone) {
    boolean isSave = false;
    isSave = SPUtils.saveUser(context, phone);
    return isSave;
}

按下登录建,跳转到主界面之前要进行验证

```java
  if (!UserUtils.validateLogin(this,phone,password)){
            return;
        }
//        跳转到主页面
        Intent intent = new Intent( this,MainActivity.class);
        startActivity(intent);
//        关闭当前页面
        finish();

所以会在validateLogin 的函数内调用 保存标记的方法

  1.当用户登陆时,利用 sharedPreference 来做标记(手机号)--保存手机号
        if (!UserUtils.saveToken(context, phone)) {
            toastShow(context, "系统错误");
            return false;
        }

2

利用单例模式创建UserHelp --保存用户信息(一个app只有一个用户)

  利用单例模式创建UserHelp --保存用户信息(一个app只有一个用户)
        UserHelp userHelp = UserHelp.getInstance();
            userHelp.setPhone(phone);

3

2.用户打开应用程序时,检测SharedPreferences 中是否存在登录用户的标记
同时,在isLoginUser中完成对 userHelp的赋值
打开程序,进入的第一个界面是欢迎界面,故要在那个界面中调用 SPUtils 的 验证Token是否存在(isLoginUser),根据返回结果,判决是转入登入界面,还是主界面。

 final boolean isLogUser=UserUtils.validateUserLogin(this);
        mTimer = new Timer();
        mTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                Log.d("WelcomeActivity", "当前线程:"+ Thread.currentThread().getName());
//                toMain();
         if (isLogUser){
             toMain();
         }else {
             toLogin();
         }
            }
        },2*1000);

4

用户退出时,删除掉SharedPreferences 保存的标记,回退到登录界面。

   if (!SPUtils.removeUser(context)){
            toastShow(context, "系统错误");
            return ;
        }
        Intent intent = new Intent(context, LoginActivity.class);
//        添加intent标识符,清理activity返回栈,并且新生成task栈
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
        ((Activity) context).overridePendingTransition(R.anim.open_enter, R.anim.open_exit);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值