Android studio数据回传kotlin
时间: 2025-06-08 22:09:45 浏览: 14
### Kotlin 实现 Android 数据回传功能
#### 一、数据回传概述
在 Android 开发中,数据回传是指从一个 Activity 或 Fragment 返回数据到之前的页面。这通常涉及启动一个新的 Activity 并在其关闭时接收返回的结果[^1]。
---
#### 二、使用 `startActivityForResult` 和 `setResult` 实现数据回传
这是经典的实现方式之一,适合简单场景下的数据回传。
##### 代码示例
**发起方(Parent Activity)**
```kotlin
val intent = Intent(this, ChildActivity::class.java)
val REQUEST_CODE = 100
startActivityForResult(intent, REQUEST_CODE)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
val returnedData = data?.getStringExtra("result_key")
textView.text = returnedData ?: "No data"
}
}
```
**目标方(Child Activity)**
```kotlin
button.setOnClickListener {
val resultIntent = Intent()
resultIntent.putExtra("result_key", "This is the returned data")
setResult(RESULT_OK, resultIntent)
finish()
}
```
上述代码展示了如何通过 `startActivityForResult` 和 `setResult` 完成基本的数据回传[^2]。
---
#### 三、使用现代 API —— `ActivityResultLauncher`
随着 AndroidX 的发展,推荐使用 `ActivityResultAPI` 替代传统的 `startActivityForResult`,因为它更加简洁且易于维护。
##### 代码示例
**发起方(Parent Activity)**
```kotlin
private lateinit var launcher: ActivityResultLauncher<Intent>
launcher = registerForActivityResult(StartActivityContract()) { result ->
if (result != null && result.hasExtra("result_key")) {
val returnedData = result.getStringExtra("result_key")
textView.text = returnedData ?: "No data"
}
}
button.setOnClickListener {
val intent = Intent(this, ChildActivity::class.java)
launcher.launch(intent)
}
```
**目标方(Child Activity)**
```kotlin
button.setOnClickListener {
val resultIntent = Intent()
resultIntent.putExtra("result_key", "This is the returned data")
setResult(RESULT_OK, resultIntent)
finish()
}
```
这种方式不仅减少了样板代码,还提高了代码的可读性和可靠性[^3]。
---
#### 四、使用广播机制实现跨组件数据回传
如果需要在不同组件之间传递数据,可以借助广播机制。
##### 代码示例
**发送方(Child Component)**
```kotlin
LocalBroadcastManager.getInstance(this).sendBroadcast(
Intent("CUSTOM_ACTION").putExtra("data", "Returned Value")
)
```
**接收方(Parent Component)**
```kotlin
val broadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val action = intent?.action
if ("CUSTOM_ACTION" == action) {
val receivedData = intent.getStringExtra("data")
textView.text = receivedData ?: "No data"
}
}
}
registerReceiver(broadcastReceiver, IntentFilter("CUSTOM_ACTION"))
```
广播机制适用于解耦程度较高的场景,但需要注意及时注销广播以避免内存泄漏[^4]。
---
#### 五、使用 ViewModel 共享数据
对于复杂的 UI 结构,比如两个 Fragment 之间的数据共享,推荐使用 `SharedViewModel`。
##### 代码示例
**定义 SharedViewModel**
```kotlin
class SharedViewModel : ViewModel() {
private val _returnedData = MutableLiveData<String>()
val returnedData: LiveData<String> = _returnedData
fun setData(data: String) {
_returnedData.value = data
}
}
```
**Fragment A(发送数据)**
```kotlin
viewModel.setData("This is the returned data")
```
**Fragment B(接收数据)**
```kotlin
viewModel.returnedData.observe(viewLifecycleOwner) { data ->
textView.text = data
}
```
这种方式特别适合 MVVM 架构的应用程序,能够显著提高代码的可维护性[^5]。
---
#### 六、总结
根据不同场景可以选择合适的方案:
- 简单场景:`ActivityResultAPI` 是首选。
- 复杂场景或多组件交互:广播机制或 `SharedViewModel` 更加合适。
无论哪种方式,都需要关注生命周期管理和资源释放问题,以免引发潜在的 Bug。
---
###
阅读全文
相关推荐


















