是否应手动调用finish()方法结束Activity?
嘿,我来帮你把这个事儿掰明白!首先得先纠正一个常见的小误区:finish()不是调用在Intent对象上的,它是Android里Activity类的成员方法,作用是销毁当前的Activity实例,把它从系统的Activity栈中移除。你同学大概率是表述的时候混淆了,应该是说「启动新Activity之后,要不要调用当前Activity的finish()」对吧?
接下来给你拆解几种核心的适用场景,以及绝对不能用的情况:
应该调用finish()的场景
单向跳转,不需要返回的页面:比如启动页(SplashActivity)跳转到首页、完成登录后从LoginActivity跳转到主页面这类场景。跳转后当前页面已经完成了它的使命,用户不需要再回到这个页面,调用
finish()可以销毁当前Activity,既符合用户操作预期(按返回键不会回到启动页/登录页),还能节省系统内存。
举个代码例子:// 启动页中的跳转代码 val goToMainIntent = Intent(this, MainActivity::class.java) startActivity(goToMainIntent) finish() // 启动首页后,销毁当前启动页完成流程闭环的收尾:比如用户在填写完表单提交成功后,从FormActivity跳转到ResultActivity,这时候表单页面已经不需要保留了,调用
finish()可以避免用户返回后重复提交表单。
绝对不能调用finish()的场景
需要接收新Activity返回结果的时候:如果你用
startActivityForResult()(或者Jetpack里的registerForActivityResult())启动新Activity,打算从新页面获取数据返回给当前页面,那绝对不能在启动后调用finish()——因为当前Activity被销毁后,就无法接收和处理返回的结果了。
错误示例(千万别这么写):// 主页面中启动选图页面的错误代码 val pickImageIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) startActivityForResult(pickImageIntent, REQUEST_CODE_PICK_IMAGE) finish() // 调用这个会直接销毁主页面,根本收不到选图结果用户可能需要返回上一步操作的场景:比如从商品列表页跳转到商品详情页,用户看完详情大概率要返回列表继续浏览,这时候就不能在跳转后调用列表页的
finish()。
总结一下判断逻辑
核心就一句话:跳转之后,当前Activity还有没有存在的价值?
如果用户不需要再回到这个页面、页面使命已经完成,就调用finish();如果还需要回来操作或者接收结果,就绝对不能调用。
内容的提问来源于stack exchange,提问作者Jason Holt

