Android Kotlin:Activity关闭后执行操作是否可行?如何实现特定需求?
在Activity2关闭后执行Activity1的function1的实现方案
当然可行!在Android Kotlin环境下,我们有两种成熟的方案来实现这个需求——其中推荐使用官方现在主推的Activity Result API(替代已弃用的startActivityForResult),另一种是兼容旧代码的传统方式,我给你一步步讲清楚:
方法1:使用Activity Result API(推荐)
这是Google在AndroidX中推出的新API,用来替代旧的startActivityForResult和onActivityResult,更安全也更灵活。
步骤1:在Activity1中注册Activity Result Launcher
在Activity1的类中(比如onCreate方法里或者类成员位置)注册一个启动器,用来监听Activity2的返回事件:
import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity class Activity1 : AppCompatActivity() { // 注册Activity Result Launcher private val activityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> // 只要Activity2关闭,这个回调就会触发 // 如果需要判断是否正常关闭,可以加上resultCode的判断 // if (result.resultCode == RESULT_OK) { function1() // 执行你要调用的方法 // } } private fun function1() { // 你的业务逻辑代码 } // ...其他代码 }
步骤2:用Launcher打开Activity2
替换你原来的startActivity代码,改用这个launcher来启动Activity2:
val intent = Intent(this, Activity2::class.java) activityLauncher.launch(intent)
方法2:使用已弃用的startActivityForResult(兼容旧项目)
如果你维护的是旧项目,还在使用非AndroidX的库,或者习惯传统写法,可以用这个方式(注意:该API已被官方标记为弃用,新项目不推荐):
步骤1:定义请求码并启动Activity2
首先在Activity1中定义一个自定义的请求码常量,然后用startActivityForResult启动Activity2:
class Activity1 : AppCompatActivity() { private val REQUEST_CODE = 1001 // 自定义请求码,用来区分不同的启动请求 // 启动Activity2的代码 private fun startActivity2() { val intent = Intent(this, Activity2::class.java) startActivityForResult(intent, REQUEST_CODE) } // ...其他代码 }
步骤2:重写onActivityResult方法
在Activity1中重写onActivityResult方法,监听返回事件并执行function1:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) // 判断请求码是否匹配,确保是从Activity2返回的 if (requestCode == REQUEST_CODE) { // 如果不需要判断是否正常关闭,可以直接调用function1 // 若需要判断,可加上resultCode == RESULT_OK的条件 function1() } } private fun function1() { // 你的业务逻辑代码 }
额外说明
- 不管用哪种方式,只要Activity2通过
finish()方法关闭(不管是用户点击返回键还是代码主动调用),都会触发Activity1中的回调,进而执行function1。 - 如果需要从Activity2传递数据回Activity1,可以在Activity2中调用
setResult(RESULT_OK, intent)(把数据放到intent里),然后再finish(),这样在Activity1的回调中就能通过result.data拿到传递的数据。
内容的提问来源于stack exchange,提问作者MrMe
相关产品推荐
相关产品推荐

