Android 使用SharedReferences创建用户登录会话

Android 使用SharedReferences创建用户登录会话,android,session,sharedpreferences,Android,Session,Sharedpreferences,首先,请允许我指出,我是android开发新手,目前正试图使用SharedReferences存储用户登录会话,并为自己创建了一个类SessionManager来处理这个问题,我没有任何错误,但每次登录时,我都会很快重新定向到LoginActivity SessionManager.java package com.example.drawerlayout; 导入android.content.Context; 导入android.content.Intent; 导入android.conten

首先,请允许我指出,我是android开发新手,目前正试图使用SharedReferences存储用户登录会话,并为自己创建了一个类SessionManager来处理这个问题,我没有任何错误,但每次登录时,我都会很快重新定向到LoginActivity

SessionManager.java

package com.example.drawerlayout;
导入android.content.Context;
导入android.content.Intent;
导入android.content.SharedReferences;
导入java.util.HashMap;
公共类会话管理器{
SharedReferences SharedReferences;
公共共享参考。编辑;
公共语境;
int PRIVATE_MODE=0;
私有静态最终字符串PREF_NAME=“LOGIN”;
私有静态最终字符串LOGIN=“IS_LOGIN”;
公共静态最终字符串NAME=“NAME”;
公共静态最终字符串EMAIL=“EMAIL”;
公共静态最终字符串TYPE=“TYPE”;
公共会话管理器(上下文){
this.context=上下文;
SharedReferences=context.getSharedReferences(首选名称,私有模式);
editor=SharedReferences.edit();
}
public void createSession(字符串名称、字符串电子邮件、字符串类型){
编辑器.putBoolean(PREF_NAME,true);
编辑器.putString(名称、名称);
编辑器.putString(电子邮件,电子邮件);
编辑器.putString(类型,类型);
editor.apply();
}
公共布尔值isLoggedIn(){
返回SharedReferences.getBoolean(登录,false);
}
公共void checkLoggin(){
如果(!this.isLoggedIn()){
意图i=新意图(上下文、LoginActivity.class);
背景。起始触觉(i);
((MainActivity)context.finish();
}
}
公共HashMap getUserDetails(){
HashMap用户=新建HashMap();
user.put(NAME,sharedReferences.getString(NAME,null));
user.put(EMAIL,SharedReferences.getString(EMAIL,null));
user.put(类型,SharedReferences.getString(类型,null));
返回用户;
}
公开作废注销(){
编辑器.clear();
commit();
意图i=新意图(上下文、LoginActivity.class);
背景。起始触觉(i);
((MainActivity)context.finish();
}
}
SessionManager.java在LoginActivity中使用,如下所示:

String name=details.getString(“用户名”).trim();
String email=details.getString(“email”).trim();
String type=details.getString(“type”).trim();
//创建会话
createSession(名称、电子邮件、类型);
MainActivity.java中

sessionManager=新的sessionManager(这个);
sessionManager.checkLoggin();

您在
createSession
方法中更新了错误的键

createSession
中的
PREF_NAME
替换为
LOGIN
。您的代码将按预期工作

public void createSession(String name, String email, String type){

    // Check below line...
    editor.putBoolean(LOGIN, true);

    editor.putString(NAME, name);
    editor.putString(EMAIL, email);
    editor.putString(TYPE, type);
    editor.apply();
}

很可能您忘记在会话管理器的创建会话中放置布尔字段登录。。修改createSession方法,如下所示

public void createSession(String name, String email, String type,Boolean isLoggedIn){

    editor.putString(NAME, name);
    editor.putString(EMAIL, email);
    editor.putString(TYPE, type);
    editor.putBoolean(LOGIN,isLoggedIn)
    editor.apply();
}
然后,如果登录活动中登录成功,则按如下方式调用

    String name = details.getString("username").trim();
String email = details.getString("email").trim();
String type = details.getString("type").trim();

//CREATE SESSION
sessionManager.createSession(name,email,type,true);

再次查看字符串变量名

  • String PREF\u NAME
    用于获取首选项。

  • String LOGIN
    用于寻址值以检查用户是否登录

你的错误:
  • 函数创建会话(字符串名称、字符串电子邮件、字符串类型)
  • 您正在更新
    String PREF_NAME
    的值,而不是
    String LOGIN
解决方案:
  • 函数创建会话(字符串名称、字符串电子邮件、字符串类型)
  • 更新SessionManager.java的第29行中的
    String LOGIN
    值,而不是
    String PREF_NAME

好的,SharedReference值保存在包含其键和值的xml文件中,因此在首次尝试登录时将生成每个值,所以为什么不通过这种方式检查SharedReference中是否存在任何值。。将此代码放入sessionHandler

 public static boolean preferenceExists(String key){
    return  sharedPreferences.contains(key);
}
如果存在或不存在任何值,它将返回布尔标志,因此只需检查首选项是否存在()。。。。如果没有,则重定向到登录活动,否则重定向到您想要的位置


建议:创建splashscreen,您可以在其中验证这些内容

您能否澄清您面临的实际问题和预期结果?好主意@黑曼巴蛇