2024年Android Studio中Kotlin跨Activity传递ArrayList<CustomObject>方案
2024年Kotlin Android跨Activity传递ArrayList的高效方案
方案一:Parcelize注解实现Parcelable(官方推荐,高效且简洁)
这是当前主流的优先方案,既保留Parcelable的高效性,又解决了旧API废弃的问题:
- 给
CustomObject添加@Parcelize注解并实现Parcelable接口,Kotlin会自动生成高效的序列化/反序列化代码,无需手动编写writeToParcel、CREATOR等模板代码:import android.os.Parcelable import kotlinx.parcelize.Parcelize @Parcelize data class CustomObject(val userId: String, val userName: String) : Parcelable - 发送数据时,直接调用Intent的
putParcelableArrayListExtra方法:val intent = Intent(this, TargetActivity::class.java) intent.putParcelableArrayListExtra("USER_LIST", userList) startActivity(intent) - 接收数据时,使用官方替代废弃方法的新重载
getParcelableArrayListExtra(Class<T>):val userList = intent.getParcelableArrayListExtra<CustomObject>("USER_LIST", CustomObject::class.java)
方案二:ViewModel + Flow(适合大数据量或跨组件共享场景)
如果数据量较大,或者需要在多个组件间共享数据,可采用此方案,完全避免序列化开销:
- 定义共享ViewModel(可通过ViewModelProvider或Hilt实现跨Activity共享):
import androidx.lifecycle.ViewModel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch class SharedViewModel : ViewModel() { private val _userListFlow = MutableSharedFlow<ArrayList<CustomObject>>() val userListFlow = _userListFlow.asSharedFlow() fun sendUserList(list: ArrayList<CustomObject>) { viewModelScope.launch { _userListFlow.emit(list) } } } - 发送方Activity传递数据:
val viewModel = ViewModelProvider(this)[SharedViewModel::class.java] viewModel.sendUserList(userList) startActivity(Intent(this, TargetActivity::class.java)) - 接收方Activity监听获取数据:
val viewModel = ViewModelProvider(this)[SharedViewModel::class.java] lifecycleScope.launch { viewModel.userListFlow.collect { userList -> // 拿到数据后进行列表展示 } }
方案三:Bundle结合Parcelable(与方案一本质一致,参数传递更灵活)
如果需要同时传递多个参数,可先将数据放入Bundle再传入Intent:
- 发送方:
val bundle = Bundle() bundle.putParcelableArrayList("USER_LIST", userList) val intent = Intent(this, TargetActivity::class.java) intent.putExtras(bundle) startActivity(intent) - 接收方:
val bundle = intent.extras val userList = bundle?.getParcelableArrayList<CustomObject>("USER_LIST", CustomObject::class.java)
内容的提问来源于stack exchange,提问作者Ahmad Louis
相关产品推荐
相关产品推荐

