android - 即使重新启动,我的应用程序仍保持登录状态
问题描述
我正在为我的家庭作业项目制作简单的登录应用程序。我希望用户在我的应用程序被销毁后保持登录状态。我做到了,但现在即使没有输入电子邮件和密码,他也总是登录。我希望能够保持登录状态直到他按下注销按钮,但即使他按下它,他也会返回登录页面,但是当应用程序重新启动时,它会再次登录
我试过这个:如何让android应用程序始终处于登录状态?
登录页面:
public class MainActivity extends AppCompatActivity {
private EditText email, password;
private SharedPreferences sharedPreferences;
public static final String PREF_NAME = "sp_name";
ConstraintLayout constraintLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
email = findViewById(R.id.email_view);
password = findViewById(R.id.pass_view);
constraintLayout = findViewById(R.id.activity_main);
sharedPreferences = getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
// //uzimam email vrednost iz sharedprefernce
String storedEmail = sharedPreferences.getString("EMAIL", null);
//uzimam password vrednosti
String storedPass = sharedPreferences.getString("PASSWORD", null);
if(storedEmail != null && storedPass != null){
// login automatically with username and password
goToPocetnaStranica();
}
Button loginButton = findViewById(R.id.login_button);
//kada je dugme za login stisnuto loguje se na pocetnu stanu i skladisti login informacije
//u sharedpreference tak da sledeci put moze da se autologuje bez ponovnog unosa login informacija
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//uzimam email i password
String getEmail = email.getText().toString();
String getPass = password.getText().toString();
//proveravam da li je neko polje prazno
if (TextUtils.isEmpty(getEmail) || TextUtils.isEmpty(getPass)) {
Toast.makeText(MainActivity.this, R.string.obavestenje_za_unos, Toast.LENGTH_SHORT).show();
} else {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("EMAIL", getEmail);
editor.putString("PASSWORD", getPass);
editor.apply();
email.setText("");
password.setText("");
goToPocetnaStranica();
}
}
});
}
private void goToPocetnaStranica(){
Toast.makeText(MainActivity.this, R.string.uspesno_logovanje, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this, PocetnaStranica.class);
startActivity(intent);
}
}
和我登录后的页面:
public class PocetnaStranica extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pocetna_stranica);
Button logoutButton = findViewById(R.id.logout_button);
logoutButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = settings.edit();
editor.remove("PASSWORD");
editor.clear();
editor.apply();
finish();
}
});
}
}
解决方案
@Sebastian 提出了一个很好的观点,即您需要在 if 语句中使用 AND 运算符而不是 OR 运算符。那是因为它会检查电子邮件是否存在或密码是否存在。您发布的只是删除了密码,因此电子邮件仍然存在。该程序将其视为已登录。此外,无需单独删除密码和电子邮件,只需使用:
sharedPreferences.clear() //Clears every single value
这也有助于删除缓存文件并节省浪费的内存空间。
编辑: 错误实际上是在您的第二段代码中。此代码获取共享首选项:
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
这确实获得了默认的共享首选项,但不是获得您保存电子邮件和密码的首选项,而是返回一组完全不同的共享首选项。你应该做的是:
SharedPreferences pref = getApplicationContext().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
这与您在 MainActivity.java 中所做的相同,这就是错误:它必须相同。在这里String PREF_NAME = "sp_name";
。首选项名称/ID,它们的存在是为了识别共享首选项。
如果您想了解有关共享首选项及其工作原理的更多信息,请查看文档:https ://developer.android.com/reference/android/content/SharedPreferences
推荐阅读
- chromium - 你能在 iframe 中删除 chromium 的文件未找到对话框吗
- flutter - 将颤振列表添加到 Firebase RealTimeDatabase
- postgresql - 无法通过 SSH 连接到用于 ssh 隧道的 docker 容器 - “load pubkey”/ssh_key/id_rsa.pem“:格式无效”
- outlook - 办公室插件可以在文件夹(例如收件箱)的消息列表中添加列或图标吗?
- python - 强化学习在以 30:10 战胜随机开始时表现良好,但随后学习崩溃并且无法恢复
- java - 仅限于 JDK 8,但 com.github.snowdrop:java-buildpack-client:jar:main-9ea258e874-1:compile 包含针对 JDK 11 的 dev/ContainerUtils$1.class
- php - 无法从 vue axios 检索文件到 laravel
- amazon-web-services - 与配置文件连接的cyberduck
- html - 如何在不使用任何类的情况下使 td 中的右对齐文本都从同一点开始?
- sql - 一个可以统计每个老师出现次数的查询?