Kotlin 使用共享首选项登录和注销

问题描述

我正在使用共享首选项登录和注销应用程序的用户。一旦用户登录,在应用程序被杀死并重新启动后,登录屏幕不会再次显示。但是当我进入应用程序并转到登录页面后的屏幕并按后退按钮时,它再次显示登录屏幕。即使按下后退按钮,我也不希望再次显示登录屏幕。我希望它在按下后退按钮时完全退出应用程序。 这是我的登录代码

    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_TASKIntent.FLAG_ACTIVITY_NEW_TASK 应该一起使用。