Parcelable
并且Bundle
对象旨在用于跨IPC / Binder
事务等进程边界,活动与意图之间以及跨配置更改存储瞬态。本页面提供使用Parcelable
和Bundle
对象的建议和最佳实践 。
在活动之间发送数据
当应用程序创建一个Intent
用于startActivity(android.content.Intent)
启动新Activity
的对象时 ,应用程序可以使用该putExtra(java.lang.String, java.lang.String)
方法传入参数。
Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("media_id", "a1b2c3");
// ...
startActivity(intent);
OS Bundle包含意图的基础。然后,操作系统创建新的活动,取消数据包裹,并将意图传递给新活动
- 我们建议您使用
Bundle
该类在Intent
对象上设置操作系统已知的基元。Bundle
类可以有效处理编组和解组
- 有时候,我们需要在activity之间发送复杂的数据或者对象时
- 建议实现
Parcelable
接口 + 提供writeToParcel(android.os.Parcel, int)
方法
- 提供一个CREATOR参数来实现
Parcelable.Creator
接口,该接口的createFromParcel()
方法用于将Parcel
后退转换为当前对象
- 建议实现
- 通过Intent传数据是,建议只传
1-10kb
进程之间发送数据
- 在进程之间发送数据与在活动之间执行数据类似。
- 但是,在进程之间发送时,我们建议您不要使用自定义的可分区。如果您将自定义
Parcelable
对象从一个应用程序发送到另一个应用程序,则需要确保发送应用程序和接收应用程序都具有完全相同的自定义类别版本。通常这可能是跨两个应用程序使用的通用库。如果您的应用程序尝试向系统发送自定义parcelable
,则会发生错误,因为系统无法解组它不知道的类。 -
Binder
事务缓冲区具有有限的固定大小,当前为1MB,由进程中的所有事务共享。由于此限制处于流程级别而非每个活动级别,因此这些事务包括应用程序中的所有绑定事务,例如onSaveInstanceState,startActivity
和与系统的任何交互。当超过大小限制时,将引发TransactionTooLargeException
。
- 对于
savedInstanceState
的具体情况,数据量应该保持很小,因为只要用户可以导航回该活动(即使活动的进程被终止),系统进程也需要保留提供的数据。我们建议您将保存状态保持为小于50k的数据。