首先,请允许我指出,我是Android开发的新手,此时此刻我正在尝试使用SharedPreferences存储用户登录会话,并且已经做了一些事情来为自己创建一个类SessionManager来处理这个问题,无论如何我都没有收到任何错误,但是,每次登录时,我都会很快再次重定向到LoginActivty。
会话管理器.java
package com.example.drawerlayout;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import java.util.HashMap;
public class SessionManager {
SharedPreferences sharedPreferences;
public SharedPreferences.Editor editor;
public Context context;
int PRIVATE_MODE = 0;
private static final String PREF_NAME = "LOGIN";
private static final String LOGIN = "IS_LOGIN";
public static final String NAME = "NAME";
public static final String EMAIL = "EMAIL";
public static final String TYPE = "TYPE";
public SessionManager(Context context) {
this.context = context;
sharedPreferences = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = sharedPreferences.edit();
}
public void createSession(String name, String email, String type){
editor.putBoolean(PREF_NAME, true);
editor.putString(NAME, name);
editor.putString(EMAIL, email);
editor.putString(TYPE, type);
editor.apply();
}
public boolean isLoggedIn(){
return sharedPreferences.getBoolean(LOGIN, false);
}
public void checkLoggin(){
if (!this.isLoggedIn()){
Intent i = new Intent(context, LoginActivity.class);
context.startActivity(i);
((MainActivity) context).finish();
}
}
public HashMap<String, String> getUserDetails(){
HashMap<String, String> user = new HashMap<>();
user.put(NAME, sharedPreferences.getString(NAME, null));
user.put(EMAIL, sharedPreferences.getString(EMAIL, null));
user.put(TYPE, sharedPreferences.getString(TYPE, null));
return user;
}
public void logOut(){
editor.clear();
editor.commit();
Intent i = new Intent(context, LoginActivity.class);
context.startActivity(i);
((MainActivity) context).finish();
}
}
和SessionManager.java在 LoginActivity 中使用,如下所示:
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);
在主活动中.java像
sessionManager = new SessionManager(this);
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();
}
再次查看您的字符串变量名称!
-
String PREF_NAME
是为了获得偏好。 -
String LOGIN
用于对值进行寻址以检查用户是否已登录
你的错误:
-
函数
创建会话(字符串名称、字符串电子邮件、字符串类型(
- 您正在更新
String PREF_NAME
的值而不是String LOGIN
- 您正在更新
溶液:
-
函数
创建会话(字符串名称、字符串电子邮件、字符串类型(
- 更新会话管理器第29 行中的
String LOGIN
值而不是String PREF_NAME
值.java
- 更新会话管理器第29 行中的
很可能您忘记在会话管理器的创建会话中放置一个布尔字段 LOGIN。 修改创建会话方法,如下所示
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);
好吧,共享首选项值保存在包含其键和值的 xml 文件中,因此每个值都将在第一次尝试登录时生成,所以你为什么不检查共享首选项中是否存在任何值,或者通过这种方式.. 将此代码放入您的会话处理程序
public static boolean preferenceExists(String key){
return sharedPreferences.contains(key);
}
如果存在任何值,它将返回布尔标志,因此只需检查首选项是否存在((即可。如果没有,则重定向它进行登录活动,否则重定向到您想要的位置
建议:创建启动画面,您可以在其中验证这些内容