onActivityResult已废弃 新API下如何实现Activity.finishActivity(REQUEST_CODE)功能
Activity Result API设计初衷是将请求码的维护完全交由框架内部处理,所以没有对外暴露请求码,也没有提供对应的finishActivity等价API,我们可以通过以下两种上层自定义逻辑实现相同的批量关闭效果,两种方案都不会触发主页的新服务请求,仅使用回退栈内已有的主页实例:
方案1:本地广播通知目标Activity主动销毁
该方案实现简单、无需持有Activity实例、无内存泄漏风险,是推荐方案:
- 定义专属关闭通知的广播Action常量:
const val ACTION_FINISH_TARGET_ACTIVITY = "com.你的包名.action.FINISH_TARGET_ACTIVITY"
- 在需要被批量关闭的目标Activity中注册广播接收器:
class 你的目标Activity类名 : AppCompatActivity() { private val finishReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { if (intent?.action == ACTION_FINISH_TARGET_ACTIVITY) { finish() } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 注册应用内本地广播,不会对外泄露 LocalBroadcastManager.getInstance(this) .registerReceiver(finishReceiver, IntentFilter(ACTION_FINISH_TARGET_ACTIVITY)) } override fun onDestroy() { super.onDestroy() // 解绑广播避免内存泄漏 LocalBroadcastManager.getInstance(this).unregisterReceiver(finishReceiver) } }
- 需要批量关闭所有对应Activity时,发送广播即可,效果和原
finishActivity(REQUEST_CODE)完全一致:
LocalBroadcastManager.getInstance(this) .sendBroadcast(Intent(ACTION_FINISH_TARGET_ACTIVITY))
方案2:手动维护目标Activity实例集合
如果不想使用广播,可以自己管理实例实现批量关闭:
- 定义全局实例管理类:
object TargetActivityManager { private val runningInstances = mutableListOf<你的目标Activity类名>() fun addInstance(activity: 你的目标Activity类名) { runningInstances.add(activity) } fun removeInstance(activity: 你的目标Activity类名) { runningInstances.remove(activity) } fun finishAllInstances() { runningInstances.forEach { it.finish() } runningInstances.clear() } }
- 在目标Activity的生命周期中绑定管理类:
class 你的目标Activity类名 : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) TargetActivityManager.addInstance(this) } override fun onDestroy() { super.onDestroy() TargetActivityManager.removeInstance(this) } }
- 调用批量关闭方法:
TargetActivityManager.finishAllInstances()
内容的提问来源于stack exchange,提问作者JustASimpleLineOfCode
相关产品推荐
相关产品推荐

