Parcelable 和 Bundle

ParcelableBundle 对象 可跨进程边界使用,例如与 IPC/Binder 搭配使用 事务、具有 intent 的 activity 之间,以及跨配置存储瞬态状态 更改。本页面提供了有关如何使用 ParcelableBundle 对象。

注意Parcel 并非通用型 序列化机制,您不得 将任何 Parcel 数据存储在磁盘上或通过网络发送。

在 Activity 之间发送数据

当应用创建要在其中使用的 Intent 对象时 在启动新 activity 方面startActivity(android.content.Intent), 应用可以传入 使用 putExtra(java.lang.String, java.lang.String) 方法。

以下示例代码段演示了如何执行此操作。

Kotlin

val intent = Intent(this, MyActivity::class.java).apply {
    putExtra("media_id", "a1b2c3")
    // ...
}
startActivity(intent)

Java

Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("media_id", "a1b2c3");
// ...
startActivity(intent);

操作系统会将 intent 的基础 Bundle 打包。然后,操作系统会创建 新活动 对数据进行解压缩,并将 intent 传递给新 activity。

我们建议您使用 Bundle 类将操作系统已知的基元设置为 Intent 对象。Bundle 类是高度相关的 针对使用地块进行编组和解组进行了优化。

在某些情况下,您可能需要一种机制来跨 activity 发送复合对象或复杂对象。 在这种情况下,自定义类应实现 Parcelable,并提供适当的 writeToParcel(android.os.Parcel, int) 方法结合使用。 它还必须提供一个名为 CREATOR 的非 null 字段, 实现了 Parcelable.Creator 接口,该接口的 createFromParcel() 方法用于将 Parcel 转换回当前对象。 如需更多信息 请参阅 Parcelable 对象的参考文档。

通过 intent 发送数据时,应注意将数据大小限制为几 KB。 发送过多数据会导致系统抛出 TransactionTooLargeException 异常。

在进程之间发送数据

在进程之间发送数据与在 Activity 之间发送数据类似。但是,在发送 我们建议您不要使用自定义 Parcelable。如果您要发送自定义 Parcelable 对象时,您需要确保 与自定义类完全相同 发送和接收应用上都会显示。通常情况下,这可能是一个通用库 在这两个应用中使用的如果您的应用尝试将自定义 Parcelable 发送到 因为系统无法对其不了解的类进行解组。

例如,应用可能会使用 AlarmManager 类,以及使用自定义 Parcelable 。当闹钟响起时,系统会修改 intent 的 要添加 Bundle 的 extra 进行重复计数这种修改可能会导致系统删除自定义 来自 extra 的 Parcelable。这种剥离继而会导致应用 在收到修改后的警报 intent 时崩溃,因为应用期望 接收已不存在的额外数据。

Binder 事务缓冲区有固定的固定大小,目前为 1MB,由所有用户共享 处理正在进行的交易由于此上限是在 而非每个 activity 级别,这些事务包括 应用,例如 onSaveInstanceState、startActivity 以及与系统进行的任何交互。当 则抛出 TransactionTooLargeException。

对于 savedInstanceState 这一具体情况,应尽量减少数据量 因为只要用户向用户提供了数据,系统进程便需一直保留提供的数据 导航回该 activity(即使 activity 的进程已终止)。 我们建议您将保存的状态保持在 5 万数据以下。

注意:在 Android 7.0(API 级别 24)及更高版本中,系统会抛出 TransactionTooLargeException 作为运行时异常。 在较低版本的 Android 中,系统仅在 logcat 中显示警告。