如何在登录和注销时使用 SharedPreferences 控制存储用户数据?
How to control storing user data using SharedPreferences when logging in and out?
我正在尝试创建一个使用用户名和密码登录的应用程序,然后只要用户没有注销 - 或者当然没有删除应用程序数据 - 就可以保持登录状态,据我所知知道 SharedPreferences 是最好的选择。如何正确实施?
我尝试创建 SharedPreferences 对象然后创建 Editor 对象以在启动应用程序时检查是否存储了用户名和密码的数据,如果是则自动登录。然后注销,单击注销按钮后,用户名和密码密钥将从 SharedPreferences 中删除。但我不确定,我想我做错了,所以应用程序无法运行。
这是我想要做的一个简单示例(假设所有 XML 文件和 ID 都是正确的,因为应用程序在添加 SharedPreferences 之前运行良好):
LoginActivity.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();
}
}
HomeActivity.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 class :-
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 中设置详细信息 Class:-
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
}
你所做的都是对的,只是你没有承诺你的价值观。
所以你的函数看起来像这样
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 操作创建一个实用程序 class。
您必须提交或应用在编辑器中所做的更改。
所以在
之后
editor.putString("username", username);
editor.putString("password", password);
editor.apply(); // or editor.commit()
我正在尝试创建一个使用用户名和密码登录的应用程序,然后只要用户没有注销 - 或者当然没有删除应用程序数据 - 就可以保持登录状态,据我所知知道 SharedPreferences 是最好的选择。如何正确实施?
我尝试创建 SharedPreferences 对象然后创建 Editor 对象以在启动应用程序时检查是否存储了用户名和密码的数据,如果是则自动登录。然后注销,单击注销按钮后,用户名和密码密钥将从 SharedPreferences 中删除。但我不确定,我想我做错了,所以应用程序无法运行。
这是我想要做的一个简单示例(假设所有 XML 文件和 ID 都是正确的,因为应用程序在添加 SharedPreferences 之前运行良好):
LoginActivity.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();
}
}
HomeActivity.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 class :-
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 中设置详细信息 Class:-
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
}
你所做的都是对的,只是你没有承诺你的价值观。
所以你的函数看起来像这样
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 操作创建一个实用程序 class。
您必须提交或应用在编辑器中所做的更改。 所以在
之后 editor.putString("username", username);
editor.putString("password", password);
editor.apply(); // or editor.commit()