我正在尝试创建一个使用用户名和密码登录的应用程序,然后只要用户没有注销就保持登录状态 - 或者当然没有删除应用程序数据 - 据我所知,SharedPreferences是最好这样做。我该如何正确实现?
我已经尝试创建SharedPreferences对象然后编辑对象以检查启动应用程序是否存储了用户名和密码的数据,如果是,则自动登录。然后,对于注销,单击一次注销按钮,将从SharedPreferences中删除用户名和密码密钥。但我不确定,我猜我是以错误的方式完成的,所以应用程序不起作用。
下面是我想要做的一个简单示例(假设所有XML文件和ID都正确,因为应用程序在添加SharedPreferences之前工作正常):
login activity.Java:
public class LoginActivity extends AppCompatActivity {
private Button button_login;
private EditText editText_username;
private EditText editText_password;
private SharedPreferences pref;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
perf = getApplicationContext().getSharedPreferences("user_pref", 0);
SharedPreferences.Editor editor = perf.edit();
if(!(sharedPref.getString("username", null)).isEmpty() && !(sharedPref.getString("password", null)).isEmpty()){
doLogin(sharedPref.getString("username", null), sharedPref.getString("password", null));
}
//define editText_username, editText_password and button_login
button_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!TextUtils.isEmpty(editText_username.getText()) && !TextUtils.isEmpty(editText_password.getText())){
doLogin(editText_username.getText().toString().trim(), editText_password.getText().toString().trim());
}
}
});
}
public void doLogin(String username, String password) {
Intent loginIntent = new Intent(LoginActivity.this, HomeActivity.class);
SharedPreferences.Editor editor = perf.edit();
editor.putString("username", username);
editor.putString("password", password);
startActivity(loginIntent);
finish();
}
}
home activity.Java:
public class HomeActivity extends AppCompatActivity {
private SharedPreferences perf;
private Button button_logout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
perf = getApplicationContext().getSharedPreferences("user_pref", 0);
//button_logout define
button_logout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = perf.edit();
editor.remove("username");
editor.remove("password");
Intent logoutIntent = new Intent(HomeActivity.this, LoginActivity.this);
startActivity(logoutIntent);
finish();
}
});
}
我没有得到任何结果,它崩溃了。所以我不确定我是否正确做到了。
创建一个AppPreference类: -
public class AppPrefrences {
private static SharedPreferences mPrefs;
private static SharedPreferences.Editor mPrefsEditor;
public static boolean isUserLoggedOut(Context ctx) {
mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
return mPrefs.getBoolean("id_logged_in", true);
}
public static void setUserLoggedOut(Context ctx, Boolean value) {
mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
mPrefsEditor = mPrefs.edit();
mPrefsEditor.putBoolean("id_logged_in", value);
mPrefsEditor.commit();
}
public static String getUserName(Context ctx) {
mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
return mPrefs.getString("name", "");
}
public static void setUserName(Context ctx, String value) {
mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
mPrefsEditor = mPrefs.edit();
mPrefsEditor.putString("name", value);
mPrefsEditor.commit();
}
}
现在在AppPreference类中设置详细信息: -
AppPreference.setUserLoggedOut(this, false);
AppPreference.setUserName(this, "pass username here");
并得到这样的用户名: -
AppPreference.getUserName(this);
或者在启动画面上检查用户是否被记录: -
if (isUserLoggedOut(StartActivity.this)) {
//user not logged in
} else {
//User is logged in
}
您必须提交或应用在编辑器中进行的更改。所以之后
editor.putString("username", username);
editor.putString("password", password);
editor.apply(); // or editor.commit()
你所做的是正确的,唯一的是你没有提交你的偏好值。
所以你的功能看起来像这样
public void doLogin(String username, String password) {
Intent loginIntent = new Intent(LoginActivity.this, HomeActivity.class);
SharedPreferences.Editor editor = perf.edit();
editor.putString("username", username);
editor.putString("password", password);
editor.apply(); //This line will make necessary changes in SharedPreferences file
startActivity(loginIntent);
finish();
}
在button_logout
点击添加相同的行
此外,我建议您为SharedPreference操作创建一个实用程序类。
使用PowerPreference
简化操作,以便将用户存储为对象
创建一个User
类
class User{
String userName;
String password;
}
当用户点击登录按钮时:
String userName = editText_username.getText().toString().trim();
String password = editText_username.getText().toString().trim();
doLogin(new User(userName,password);
然后使用PowerPreference
,您可以将用户对象存储在共享首选项中
public void doLogin(User user) {
PowerPreference.getDefaultFile().putObject("key",user);
Intent loginIntent = new Intent(LoginActivity.this, HomeActivity.class);
startActivity(loginIntent);
finish();
}
下次用户进入登录界面onCreate()使用
User user = PowerPreference.getDefaultFile().getObject("key",User.class)
if (user!=null){
doLogin(user.userName,user.password)
}
为了能够使用PowerPreference
,请将此添加到您的gradle中
implementation 'com.aliassadi:power-preference-lib:1.4.1'