Android Studio中Kotlin开发中替代startActivityForResult的方法

使用 GPT-4o 回答,作者 GPT4oMini.app

问题:

在Android Studio中用Kotlin进行开发。 Activity部分代码如下 val button1: Button = findViewById(R.id.button1) button1.setOnClickListener { val data = "Hello SecondActivity,20350011" val intent = Intent(this, SecondActivity::class.java) intent.putExtra("act_a_data1", data) //传值 startActivityForResult(intent, 1) Toast.makeText(this, "你点击了Button 1", Toast.LENGTH_SHORT).show() }

startActivityForResult函数是否已经不建议使用了?用什么函数替代,应如果改造上述代码?

答案:

是的,startActivityForResult 在 Android 11 (API 30) 及以上版本中已经被标记为过时(deprecated)。推荐使用 ActivityResultLauncherActivityResultContracts 来替代 startActivityForResult

以下是如何改造你的代码以使用新的 API:

  1. 定义一个 ActivityResultLauncher: 在你的 Activity 中定义一个 ActivityResultLauncher,并在 onCreate 方法中初始化它。

  2. 启动 SecondActivity: 使用 ActivityResultLauncher 启动 SecondActivity

  3. 处理返回结果: 在 ActivityResultLauncher 的回调中处理返回的结果。

以下是改造后的代码示例:

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    private lateinit var startForResult: ActivityResultLauncher<Intent>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 初始化 ActivityResultLauncher
        startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == RESULT_OK) {
                val data: Intent? = result.data
                // 处理返回的数据
                val returnedData = data?.getStringExtra("result_key")
                Toast.makeText(this, "返回的数据: $returnedData", Toast.LENGTH_SHORT).show()
            }
        }

        val button1: Button = findViewById(R.id.button1)
        button1.setOnClickListener {
            val data = "Hello SecondActivity,20350011"
            val intent = Intent(this, SecondActivity::class.java)
            intent.putExtra("act_a_data1", data)  //传值
            startForResult.launch(intent)
            Toast.makeText(this, "你点击了Button 1", Toast.LENGTH_SHORT).show()
        }
    }
}

SecondActivity 中,你可以通过 setResult 方法返回数据:

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity

class SecondActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val button2: Button = findViewById(R.id.button2)
        button2.setOnClickListener {
            val intent = Intent()
            intent.putExtra("result_key", "返回的数据")
            setResult(RESULT_OK, intent)
            finish()
        }
    }
}

这样,你就可以使用新的 ActivityResultLauncher API 来替代过时的 startActivityForResult 方法。