为何Second Activity需两次点击按钮才向Main Activity返回回复?
Activity返回数据异常问题解决
问题现象
使用registerForActivityResult(ActivityResultContracts.StartActivityForResult())实现从SecondActivity向MainActivity返回数据时,出现以下异常:
- 点击SecondActivity的“Send”按钮,首次点击不会返回输入的回复;
- 第二次点击时,无论是否输入新内容,都会回到MainActivity并显示首次输入的回复。
错误原因
MainActivity的Send按钮点击事件中,同时调用了startActivity(secondActivityIntent)和secondActivityLauncher.launch(secondActivityIntent),导致每次点击都会启动两个SecondActivity实例:
- 第一个实例通过普通
startActivity启动,未绑定回调,关闭后不会触发MainActivity的结果监听; - 第二个实例通过
launch方法启动,绑定了回调,但用户首次操作的通常是第一个实例,关闭后无回调触发; - 第二次点击时,后台仍存在之前通过
launch启动的实例,用户关闭该实例时,回调触发并返回首次输入的内容。
修复方案
移除startActivity(secondActivityIntent)调用,仅保留secondActivityLauncher.launch(secondActivityIntent)——launch方法已经负责启动目标Activity并绑定结果回调,无需额外调用startActivity。
修复后的MainActivity.kt代码
package com.example.twoactivities import android.app.Activity import android.content.Intent import android.os.Bundle import android.widget.Button import android.widget.EditText import android.widget.TextView import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { private val secondActivityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data: Intent? = result.data val replyMessage = data?.getStringExtra("REPLY_KEY_VALUE") if (replyMessage != null) { val headerTextView: TextView = findViewById(R.id.reply_header) val textView: TextView = findViewById(R.id.reply_message) textView.text = replyMessage headerTextView.text = "Reply Received" } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val mMessageEditText: EditText = findViewById(R.id.editText_send) val buttonSend: Button = findViewById(R.id.button_send) buttonSend.setOnClickListener { val secondActivityIntent = Intent(this, SecondActivity::class.java) val message = mMessageEditText.text.toString().trim() secondActivityIntent.putExtra("SEND_KEY_VALUE", message) // 仅保留launch方法调用,移除startActivity secondActivityLauncher.launch(secondActivityIntent) } } }
可选优化:SecondActivity的Intent无需指定目标类
SecondActivity中返回数据时,不需要创建指向MainActivity的Intent,直接使用空Intent即可(因为setResult仅传递数据,目标Activity由启动时的上下文决定):
buttonReply.setOnClickListener { // 替换为空Intent,无需指定MainActivity::class.java val resultIntent = Intent() val replyMessage = rReplyEditText.text.toString().trim() resultIntent.putExtra("REPLY_KEY_VALUE", replyMessage) setResult(RESULT_OK, resultIntent) finish() }
验证效果
修复后,点击MainActivity的Send按钮仅启动一个SecondActivity实例,输入内容点击Send后,MainActivity会立即收到并显示回复,无延迟或重复现象。
内容的提问来源于stack exchange,提问作者Shane
相关产品推荐
相关产品推荐

