当前位置: 首页 > news >正文

Android 开发:从 View Activity 向 Compose Activity 传递数据的多种实现方式

在 Android 中从 View-based Activity 传递数据到 Compose Activity

在 Android 应用中,从传统的基于 View 的 Activity 向基于 Jetpack Compose 的 Activity 传递数据有几种常见方法。以下是几种实现方式:

方法一:使用 Intent 传递数据

这是最简单直接的方式,适用于传递简单数据。

在 View Activity 中发送数据:

// ViewBasedActivity.kt
val intent = Intent(this, ComposeActivity::class.java).apply {putExtra("key_string", "Hello Compose")putExtra("key_int", 123)putExtra("key_parcelable", myParcelableObject)
}
startActivity(intent)

在 Compose Activity 中接收数据:

// ComposeActivity.kt
class ComposeActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val stringValue = intent?.getStringExtra("key_string") ?: ""val intValue = intent?.getIntExtra("key_int", 0) ?: 0val parcelableValue = intent?.getParcelableExtra<MyParcelable>("key_parcelable")setContent {MyAppTheme {// 在 Compose 中使用这些值Greeting(stringValue, intValue, parcelableValue)}}}
}@Composable
fun Greeting(text: String, number: Int, data: MyParcelable?) {// 你的 Compose UI
}

方法二:使用 ViewModel 共享数据

如果两个 Activity 需要共享更复杂的状态,可以使用共享 ViewModel。

1. 创建共享 ViewModel

class SharedViewModel : ViewModel() {private val _sharedData = MutableStateFlow<MyData?>(null)val sharedData: StateFlow<MyData?> = _sharedData.asStateFlow()fun setSharedData(data: MyData) {_sharedData.value = data}
}

2. 在 View Activity 中设置数据

// ViewBasedActivity.kt
val viewModel: SharedViewModel by viewModels()
viewModel.setSharedData(MyData(...))val intent = Intent(this, ComposeActivity::class.java)
startActivity(intent)

3. 在 Compose Activity 中获取数据

// ComposeActivity.kt
class ComposeActivity : ComponentActivity() {private val viewModel: SharedViewModel by viewModels()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {val data by viewModel.sharedData.collectAsState()MyAppTheme {if (data != null) {DataDisplayScreen(data!!)} else {LoadingScreen()}}}}
}

方法三:使用持久化存储(Room/SharedPreferences)

对于需要持久化的数据:

1. 在 View Activity 中保存数据

// 使用 SharedPreferences
val sharedPref = getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
with(sharedPref.edit()) {putString("key_data", "value")apply()
}// 或者使用 Room 数据库
myDatabase.dao().insertData(myData)

2. 在 Compose Activity 中读取数据

// ComposeActivity.kt
class ComposeActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val sharedPref = getSharedPreferences("my_prefs", Context.MODE_PRIVATE)val data = sharedPref.getString("key_data", "")// 或者从 Room 查询val dbData by myDatabase.dao().getData().collectAsState(initial = emptyList())setContent {MyAppTheme {DataScreen(data, dbData)}}}
}

方法四:使用全局单例(谨慎使用)

对于简单的应用,可以使用全局对象:

object DataHolder {var sharedData: MyData? = null
}// 在 View Activity 中
DataHolder.sharedData = MyData(...)// 在 Compose Activity 中
val data = DataHolder.sharedData

最佳实践建议

  1. 简单数据:使用 Intent 传递
  2. 复杂数据:使用 ViewModel 或持久化存储
  3. 避免全局状态:除非必要,尽量避免使用全局单例
  4. 类型安全:考虑使用 kotlinx.serialization 或 Gson 转换复杂对象为 JSON 字符串传递
http://www.xdnf.cn/news/678187.html

相关文章:

  • [yolov11改进系列]基于yolov11引入可改变核卷积AKConv的python源码+训练源码
  • QCustomPlot设置曲线图中文字缩放大小
  • 微信小程序一次性订阅封装
  • Linux 权限管理基础:深入理解 root 与 sudo 的用法
  • 【监控】Spring Boot 应用监控
  • libvirt设置虚拟机mtu实现原理
  • 决策树 GBDT XGBoost LightGBM
  • ETL数据集成过程全流程优化指南
  • ICMP与TCP端口:网络层与传输层解析
  • 尚硅谷redis7 49-51 redis管道之理论简介
  • Python的虚拟环境
  • 4 月 62100 款 App 被谷歌下架!环比增长 28%
  • 英码科技携带 “无感知AI数字课堂”解决方案,亮相第22届广东教育装备展
  • redis高并发问题
  • Common JS和ES Module的区别
  • 6.4.5_关键路径
  • 窗口函数总结篇
  • -动静态库简单使用
  • ABC 352
  • 依赖倒置原则 (Dependency Inversion Principle, DIP)
  • 分块查找详解
  • 第二章 1.3 数据采集风险的现有技术和解决方案
  • RK3568 OH5.1 镜像烧录
  • python第34天打卡
  • 深耕数字化赛道,联众优车以创新风控体系构筑汽车金融护城河
  • Fine-tuning:微调技术,训练方式,LLaMA-Factory,ms-swift
  • AI智能分析网关V4垃圾桶满溢检测算法打造城市/公园/街道等场景应用方案
  • 浅谈Mysql的MVCC机制(RC与RR隔离级别)
  • LeetCode 1696. 跳跃游戏 VI(中等)
  • AI Agent开发第75课-数据、张量、流水线并行全解析