在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)。推荐使用 ActivityResultLauncher
和 ActivityResultContracts
来替代 startActivityForResult
。
以下是如何改造你的代码以使用新的 API:
定义一个 ActivityResultLauncher
:
在你的 Activity
中定义一个 ActivityResultLauncher
,并在 onCreate
方法中初始化它。
启动 SecondActivity
:
使用 ActivityResultLauncher
启动 SecondActivity
。
处理返回结果:
在 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
方法。