“昨夜西风凋碧树,独上高楼,望尽天涯路”
为何要保存登录信息
由于APP都有登录的功能,所以你一定知道,使用一个软件登陆之后,短时间内再次进入到该软件不用再次登录(时间太久登录状态会失效需要重新登录),一些用户信息也被保存,那这个是怎么实现的呢?下面我们来捋一捋使用SharedPreferences 实现自动登录的逻辑。
实现逻辑
1,首先应该建立一个User类(一般也会new一个User常量),这个类我们后面会用,USer类将会存access-token(这个在发起网络请求时要用到的)等重要信息,这个很简单,不必多说。
2,在有了User类之后,发起登录请求时,如果登录成功,首先需要对User常量做出处理,解析JSON数据存下需要的数据(比如name,id,access-token等等),然后把User常量转为String,使用SharedPreferences保存这个userInfo。代码如下:
//ConstantData.user是一个user常量,使用GSON解析这里就不再赘述
String userInfo;
userInfo= new Gson().toJson(ConstantData.user);
//开始使用SharedPreferences 保存用户信息
//获取SharedPreferences对象
SharedPreferences sharedPre=context.getSharedPreferences("loginInfo", context.MODE_PRIVATE);
//获取Editor对象
SharedPreferences.Editor editor=sharedPre.edit();
//设置参数
editor.putString("userInfo", userInfo);
//提交
editor.commit();
3,经过上面的两步,说明你已经有了一个用户并且登录成功(注意是登录成功,也就是后端登录接口返回成功信息,一般是code=200),那么软件已经有你这个用户的信息了,如果你此时按下返回键回到手机菜单或者软件因为其他原因被关掉,下次又怎么判断你已经登录过了或者登陆状态已经不可用了呢?来到第四步。
4,考虑三种情况:
a,第一次使用该软件,跳到登录页
b,已经登录过,跳到主页面
c,token过期,跳到登录页重新登录(往往是发起网络请求的时候服务器返回token过期的提醒,这时需要在Activity中处理,也很简单,就是关掉所有Activity页面并跳转到登陆页)。
我们重点看看情况a和b怎么处理,一般情况下是在启动页中判断之前是否登陆,直接上代码:
启动页也是有很多需要处理的事情,之后也要专门学习。
SharedPreferences sharedPre=getSharedPreferences("loginInfo", MODE_PRIVATE);
String userstr = sharedPre.getString("userInfo", "");
if(!StringUtils.isEmpty(userstr) ){
//StringUtils是一个工具类,很简单,代码放在下面
Gson gson = new GsonBuilder().serializeNulls().create();
Type type = new TypeToken<User>() { }.getType();
ConstantData.user = gson.fromJson(userstr, type);
to =1;
}else{
to=0;
}
//to就是一个变量,我们假定默认值为零,跳到登录页,值为1跳到APP主页面。在启动页进行跳转的时候就可以根据这个值跳到对应的页面啦。
public class StringUtils {
/**
* 判断字符串是否为空
* @return
*/
public static boolean isEmpty(String str){
if(str == null || str.equals("null")|| str.length() == 0){
return true;
}else {
return false;
}
}
}
总结
小弟是第一次写博客,身为菜鸟还是有很多不足的地方,如果各位觉得代码有些问题或者有更好的实现思路,欢迎指正和交流,学技术的道路漫长而遥远,写博客也是想记录下学到的东西,以便以后忘记的时候再拿出来读读,小牛的第一篇博客就这样诞生啦!
最后说说第一行引用的意思,这是学习三种境界的第一种,有兴趣的可以去了解一下王国维先生提出的治学三种境界,我在这里只是引用,加油,共勉!