Android 11(API 30)使用Parcelable传递对象失败的解决求助
解决Android 11(API 30)中Activity间传递Parcelable对象的问题
错误原因分析
- API版本不兼容:
Intent.getParcelableExtra(String, Class<T>)是Android 13(API 33,TIRAMISU)才新增的方法,Android 11(API 30)系统中不存在该方法,直接调用会抛出NoSuchMethodError。 - 数据类型不匹配:主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
相关产品推荐
相关产品推荐

