You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 自动登录跳转MainActivity后按返回键闪退问题排查

问题1:跳转后按返回的行为

正常情况下,你在LoginActivity(Activity A)跳转MainActivity(Activity B)后调用finish(),LoginActivity会被立即移出返回栈,此时在MainActivity按下返回键会直接回到手机主屏幕,不会触发LoginActivity的任何生命周期方法。

崩溃原因分析

你的报错核心是findViewById(R.id.phone_num) must not be null空指针异常,根因有两个:

  1. 对finish()的执行逻辑理解错误:调用finish()只会标记Activity需要销毁,并不会立即中断当前onCreate方法的执行,finish()之后的代码仍然会全部执行完毕。
  2. 代码逻辑位置错误:你把setContentView(R.layout.activity_login)放在了isLoggedIn=false的else分支中,但是后续的控件初始化(findViewById)、点击事件绑定逻辑全部写在了if-else分支之外。当用户已经登录时,不会执行setContentView加载布局,此时执行findViewById自然找不到对应控件,返回null值,而你用Kotlin非空类型接收null,就会直接抛出空指针。

至于为什么首次登录正常、清空RAM后才崩溃:

  • 首次登录时isLoggedIn为false,会走else分支执行setContentView,布局加载完成后再找控件不会有问题。
  • 应用被系统后台杀死(清空RAM)后重新打开,系统会尝试恢复应用原有任务栈,首先启动入口Activity也就是LoginActivity,此时isLoggedIn为true,走跳转+finish逻辑,但后续的findViewById代码仍会执行,没有布局就找控件直接触发崩溃。

修复方案

把所有和布局相关的代码全部移到未登录的分支中,也可以在finish()后加return直接终止onCreate后续执行,双重保险:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    SharedPreferences = getSharedPreferences(getString(R.string.Prefereces_file_name), Context.MODE_PRIVATE)

    val isloggedIn = SharedPreferences.getBoolean("isLoggedIn",false)

    if (isloggedIn){
        val intent = Intent(this@LoginActivity, MainActivity::class.java)
        startActivity(intent)
        finish()
        // 直接终止方法执行,避免后续代码运行
        return
    }
    // 以下代码仅在未登录需要展示登录页时执行
    setContentView(R.layout.activity_login)
    title = "Log In"

    phone_num = findViewById(R.id.phone_num)
    password_num = findViewById(R.id.password_num)
    button_login = findViewById(R.id.button_login)
    txtForgotPassword = findViewById(R.id.txtForgotPassword)
    RegisterYouself = findViewById(R.id.RegisterYouself)

    button_login.setOnClickListener{
        // 原有点击逻辑保持不变
        val mobilenumber = phone_num.text.toString()
        val password = password_num.text.toString()
        var nameOfAvenger = "Avenger"
        val intent = Intent(this@LoginActivity, MainActivity::class.java)
        if (mobilenumber == ValidMobileNumber){
            if (password == ValidPassword[0]){
                nameOfAvenger = "Iron Man"
                savePreferences(nameOfAvenger)
                startActivity(intent)
                // 建议此处也加finish,避免登录成功后按返回回到登录页
                finish()
            }
            else if (password == ValidPassword[1]){
                nameOfAvenger = "Captain America"
                savePreferences(nameOfAvenger)
                startActivity(intent)
                finish()
            }
            else if(password == ValidPassword[2]){
                nameOfAvenger = "Hulk"
                savePreferences(nameOfAvenger)
                startActivity(intent)
                finish()
            }
            else if (password == ValidPassword[3]){
                nameOfAvenger = "The Avenger"
                savePreferences(nameOfAvenger)
                startActivity(intent)
                finish()
            }
            else {
                Toast.makeText(
                    this@LoginActivity, "账号或密码错误", Toast.LENGTH_LONG
                ).show()
            }
        }
        else {
            Toast.makeText(
                this@LoginActivity, "账号或密码错误", Toast.LENGTH_LONG
            ).show()
        }
    }
}

内容的提问来源于stack exchange,提问作者Mustafa Dahodwala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:45:00