使用registerForActivityResult时,ActivityResult是否包含回传结果的Activity信息?
问题解答
默认情况下,registerForActivityResult回调中的ActivityResult参数不会包含返回结果的Activity的类名或标识信息——因为你没有通过setResult()传入携带数据的Intent,系统不会主动附加这类信息到回调结果里。
如果不想通过setResult()传递Intent数据,你可以用以下几种方式区分返回结果来自哪个Activity:
1. 为每个目标Activity单独注册ResultLauncher
这是最稳妥的方案,完全不需要额外传递数据,通过不同的launcher回调直接区分来源:
// 对应Activity B的启动器 private val launcherB = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { // 此处处理Activity B返回的结果 } } // 对应Activity C的启动器 private val launcherC = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { // 此处处理Activity C返回的结果 } } // 点击按钮启动Activity B launcherB.launch(Intent(this, B::class.java)) // 点击按钮启动Activity C launcherC.launch(Intent(this, C::class.java))
2. 记录最后启动的Activity类(单一launcher场景)
如果必须使用同一个resultLauncher,可以在启动前用变量记录最后启动的Activity类,回调时根据这个变量判断来源:
private var lastLaunchedActivity: Class<*>? = null private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { when(lastLaunchedActivity) { B::class.java -> { /* 处理Activity B的返回结果 */ } C::class.java -> { /* 处理Activity C的返回结果 */ } } } } // 启动Activity B lastLaunchedActivity = B::class.java resultLauncher.launch(Intent(this, B::class.java)) // 启动Activity C lastLaunchedActivity = C::class.java resultLauncher.launch(Intent(this, C::class.java))
注意:这种方式存在风险——如果用户快速连续点击两个启动按钮,lastLaunchedActivity会被覆盖,可能导致回调判断错误。
内容的提问来源于stack exchange,提问作者Thái Quốc Toản
相关产品推荐
相关产品推荐

