问题描述
我正在使用共享首选项登录和注销应用程序的用户。一旦用户登录,在应用程序被杀死并重新启动后,登录屏幕不会再次显示。但是当我进入应用程序并转到登录页面后的屏幕并按后退按钮时,它再次显示登录屏幕。即使按下后退按钮,我也不希望再次显示登录屏幕。我希望它在按下后退按钮时完全退出应用程序。 这是我的登录代码:
val sp = getSharedPreferences("login",MODE_PRIVATE)
if (sp.getBoolean("logged",false))
{
login()
}
loginButton.setonClickListener() {
login()
sp.edit().putBoolean("logged",true).apply()
Log.v("Login Msg","Login button clicked")
getusername = findViewById(R.id.usernameEditText)
var username = usernameEditText.text
Log.v("username",username.toString())
getpass = findViewById(R.id.passEditText)
var pass = passEditText.text
Log.v("pass",pass.toString()) }
fun login() {
val i = Intent(this,HomeActivity::class.java)
startActivity(i)
}
这是注销的代码:
logoutButton.setonClickListener(){
logout()
val sp = getSharedPreferences("login",MODE_PRIVATE)
sp.edit().putBoolean("logged",false).apply()
Log.v("logout msg","logout button clicked")
}
fun logout(){
val i = Intent(this,LogInActivity::class.java)
startActivity(i)
}
解决方法
实际上我们可以在每个活动中覆盖“返回按钮”方法。
下面我重用你的代码来管理按下后退按钮时的注销,也许这就是你要找的
override fun onBackPressed() {
super.onBackPressed()
val sp = getSharedPreferences("login",MODE_PRIVATE)
sp.edit().putBoolean("logged",false).apply()
logout()
}
,
发生这种情况是因为登录活动在转到 HomeActivity 后仍然在后台堆栈中。要实现您的要求,您必须在转到 HomeActivity 之前从返回堆栈中删除所有内容。
将您的登录功能替换为以下功能。
fun login() {
val i = Intent(this,MainActivity::class.java)
i.run {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
startActivity(i)
}
这里我们基本上是向意图添加一组标志。
Intent.FLAG_ACTIVITY_CLEAR_TOP 清除当前视图下的所有视图
Intent.FLAG_ACTIVITY_CLEAR_TASK 我们正在删除现有任务
Intent.FLAG_ACTIVITY_NEW_TASK我们正在为 HomeActivity 创建一个新任务。
Intent.FLAG_ACTIVITY_CLEAR_TASK 和 Intent.FLAG_ACTIVITY_NEW_TASK 应该一起使用。