当我关闭并重新打开应用程序时,为什么它会进入登录活动而不是停留在仪表板活动中?

问题描述 投票:0回答:1

我在 Android Studio 中使用 Kotlin 创建了一个简单的应用程序。一切正常,整个应用程序中有 0 个错误。但有一个小问题,请高手帮帮我!所以,我在整个堆栈溢出中回顾了所有类似的问题,但它们根本不是我想要的,它们导致尝试了很多方法,但它们对我没有帮助。这就是我想要的:

我希望当我使用电子邮件和密码登录并进入仪表板活动时,应用程序保留在 DashboardActivity.kt 中,但当我关闭应用程序并重新打开它时,应用程序将注销并开始登录活动。

这是我的代码: ActivityMain.kt:

class MainActivity : AppCompatActivity() {
private lateinit var auth: FirebaseAuth
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
    initData()
}
private fun initData(){
    auth = FirebaseAuth.getInstance()
    checkIfUserIsLoggedIn()
}
private fun checkIfUserIsLoggedIn(){
    val currentUser = auth.currentUser
    if (currentUser != null){
        startActivity(Intent(this,DashbordActivity::class.java))
        finish()
    }else{
        startActivity(Intent(this,LoginActivity::class.java))
        finish()
    }
}
}

DashboardActivity.kt:

class DashbordActivity : AppCompatActivity() {
private lateinit var auth: FirebaseAuth
private lateinit var binding: ActivityDashbordBinding
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityDashbordBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
    initData()
}
private fun initData(){
    auth = FirebaseAuth.getInstance()
    setUserEmail()
    clickListener()
}
private fun clickListener(){
    binding.btnSignOut.setOnClickListener {
        auth.signOut()
        startActivity(Intent(this,LoginActivity::class.java))
        finish()
    }
}
private fun getCurrentUserEmail():String?{
    return  auth.currentUser?.email
}
private fun setUserEmail(){
    binding.tvUserEmail.text = "welcome " + getCurrentUserEmail()
}
}

登录活动.kt:

class LoginActivity : AppCompatActivity() {
private lateinit var binding: ActivityLoginBinding
private lateinit var auth: FirebaseAuth
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityLoginBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
    initData()
}
private fun initData(){
    auth = FirebaseAuth.getInstance()
    clickListener()
}
private fun clickListener(){
    binding.llNewUser.setOnClickListener {
        startActivity(Intent(this,RegisterActivity::class.java))
        finish()
    }
    binding.btnLogin.setOnClickListener {
        getUserData()
    }
}
private fun getUserData(){
    val email = binding.etEmail.text.toString()
    val password = binding.etPassword.text.toString()
    if (email.isNotEmpty() && password.isNotEmpty()){
        authUser(email,password)
    }else{
        Toast.makeText(this,"All inputs required ...",Toast.LENGTH_LONG).show()
    }
}
private fun authUser(email: String, password: String){
    auth.signInWithEmailAndPassword(email,password)
        .addOnCompleteListener {
            checkResult(it.isSuccessful)
        }
}
private fun checkResult(isSuccess: Boolean){
    if (isSuccess){
        startActivity(Intent(this,DashbordActivity::class.java))
        finish()
    }else{
        Toast.makeText(this,"Authentication failed ...",Toast.LENGTH_LONG).show()
    }
}
}

注册活动.kt:

class RegisterActivity : AppCompatActivity() {
private lateinit var auth: FirebaseAuth
private lateinit var binding: ActivityRegisterBinding
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    auth = FirebaseAuth.getInstance()
    binding = ActivityRegisterBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
    initData()
}
private fun initData(){
    auth = FirebaseAuth.getInstance()
    clickListener()
}
private fun clickListener(){
    binding.btnRegister.setOnClickListener {
        createUser()
    }
    binding.llHaveAccount.setOnClickListener {

    }
}
private fun createUser(){
    val email = binding.etEmail.text.toString()
    val password = binding.etPassword.text.toString()
    val cPassword = binding.etcPassword.text.toString()
    if (email.isNotEmpty() && password.isNotEmpty() && cPassword.isNotEmpty()){
        if (password == cPassword){
            saveUser(email,password)

        }else{
            Toast.makeText(this,"Password mismatch",Toast.LENGTH_LONG).show()
        }
    }else{
        Toast.makeText(this,"All inputs required",Toast.LENGTH_LONG).show()
    }
}
private fun saveUser(email: String, password: String){
    auth.createUserWithEmailAndPassword(email,password)
        .addOnCompleteListener {
            checkResults(it.isSuccessful)
        }
}
private fun checkResults(isSuccess: Boolean){
    if (isSuccess){
        startActivity(Intent(this,LoginActivity::class.java))
        finish()
    }else{
        Toast.makeText(this,"Create to create your account",Toast.LENGTH_LONG).show()
    }
}
}

我再说一遍:没有错误,应用程序工作完美,但是当我登录应用程序时,它会转到 DashboardActivity,但是当我关闭应用程序并重新打开它时,它会从 LoginActivity 开始。我希望登录后,当我关闭并重新打开应用程序时,它会保留在 DashboardActivity 中。

谢谢帮助我的人:)

android firebase kotlin android-studio firebase-authentication
1个回答
0
投票

据我从您的问题和评论中了解到,第二次打开应用程序时,

currentUser
对象是
null
,即使您之前已通过身份验证。发生这种情况是因为
currentUser
对象没有及时更新。如果您想跟踪身份验证状态,正如 @FrankvanPuffelen 在他的评论中提到的那样,您必须使用 AuthStateListener,当身份验证状态发生更改时会调用它。因此,根据身份验证状态,您应该将用户重定向到相应的活动。

© www.soinside.com 2019 - 2024. All rights reserved.