You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Second Activity需两次点击按钮才向Main Activity返回回复?

Activity返回数据异常问题解决

问题现象

使用registerForActivityResult(ActivityResultContracts.StartActivityForResult())实现从SecondActivity向MainActivity返回数据时,出现以下异常:

  • 点击SecondActivity的“Send”按钮,首次点击不会返回输入的回复;
  • 第二次点击时,无论是否输入新内容,都会回到MainActivity并显示首次输入的回复。

错误原因

MainActivity的Send按钮点击事件中,同时调用了startActivity(secondActivityIntent)和secondActivityLauncher.launch(secondActivityIntent),导致每次点击都会启动两个SecondActivity实例:

  1. 第一个实例通过普通startActivity启动,未绑定回调,关闭后不会触发MainActivity的结果监听;
  2. 第二个实例通过launch方法启动,绑定了回调,但用户首次操作的通常是第一个实例,关闭后无回调触发;
  3. 第二次点击时,后台仍存在之前通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:17:18