You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:42:39