Android 自动登录跳转MainActivity后按返回键闪退问题排查
问题1:跳转后按返回的行为
正常情况下,你在LoginActivity(Activity A)跳转MainActivity(Activity B)后调用finish(),LoginActivity会被立即移出返回栈,此时在MainActivity按下返回键会直接回到手机主屏幕,不会触发LoginActivity的任何生命周期方法。
崩溃原因分析
你的报错核心是findViewById(R.id.phone_num) must not be null空指针异常,根因有两个:
- 对finish()的执行逻辑理解错误:调用
finish()只会标记Activity需要销毁,并不会立即中断当前onCreate方法的执行,finish()之后的代码仍然会全部执行完毕。 - 代码逻辑位置错误:你把
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
相关产品推荐
相关产品推荐

