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

Android 11(API 30)使用Parcelable传递对象失败的解决求助

解决Android 11(API 30)中Activity间传递Parcelable对象的问题

错误原因分析

  1. API版本不兼容:Intent.getParcelableExtra(String, Class<T>) 是Android 13(API 33,TIRAMISU)才新增的方法,Android 11(API 30)系统中不存在该方法,直接调用会抛出NoSuchMethodError。
  2. 数据类型不匹配:主Activity传递的是ArrayList<MyTestDatas>,但接收方尝试获取单个MyTestDatas对象,后续处理必然出错。

修复代码

修改接收方PlayerActivity代码

移除API 33专属注解,改用兼容低版本的getParcelableArrayListExtra()方法获取数据:

class PlayerActivity : AppCompatActivity(){
    val TAG = "secondTag"
    private val viewBinding by lazy(LazyThreadSafetyMode.NONE) {
        ActivityPlayerBinding.inflate(layoutInflater)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(viewBinding.root)
        // 获取传递的ArrayList<MyTestDatas>
        val myDataList = intent.getParcelableArrayListExtra<MyTestDatas>("myData")
        
        Log.i(TAG, myDataList.toString())
    }
}

大型对象传递建议

如果需要传递大型对象/大体积数据,不建议使用Intent传递Parcelable:

  • Intent传递数据存在大小限制(通常约1MB),超过限制会抛出TransactionTooLargeException。
  • 推荐替代方案:
    • ViewModel:若两个Activity共享同一个ViewModelStoreOwner(如在同一个导航组件或Activity栈中),可通过ViewModel共享数据。
    • 单例存储:创建临时单例对象存储数据,接收方从单例中读取,注意使用后及时清理数据避免内存泄漏。
    • 本地存储:将数据序列化后存入Room数据库、本地文件,接收方读取后反序列化。
    • 事件总线:使用EventBus等框架传递数据,需注意生命周期管理,避免内存泄漏。

内容的提问来源于stack exchange,提问作者coppersmith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:25:55