【Android必备】Parcelables and Bundles(6)

概要


Parcelable并且Bundle对象旨在用于跨IPC / Binder事务等进程边界,活动与意图之间以及跨配置更改存储瞬态。本页面提供使用Parcelable和Bundle对象的建议和最佳实践 。

注意: Parcel不是通用的序列化机制,您不应该将任何Parcel数据存储在磁盘上或通过网络发送。

在activities之间发送数据


当应用程序创建一个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类是高度为编组和解组使用包裹优化。

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

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

在进程之间发送数据


在进程之间发送数据与在活动之间执行数据类似。但是,在进程之间发送时,我们建议您不要使用自定义的可分区。如果您将自定义 Parcelable对象从一个应用程序发送到另一个应用程序,则需要确保发送应用程序和接收应用程序都具有完全相同的自定义类别版本。通常这可能是跨两个应用程序使用的通用库。如果您的应用程序尝试向系统发送自定义parcelable,则会发生错误,因为系统无法解组它不知道的类。

例如,应用可能会使用AlarmManager该类设置闹钟,并Parcelable 在闹钟意图上使用自定义。当警报关闭时,系统会修改Bundle额外的意图 以添加重复计数。此修改可能会导致系统Parcelable从附加内容中剥离自定义 。反过来,这种剥离可能导致应用程序在收到修改后的警报意图时崩溃,因为应用程序预计会收到不再存在的额外数据。

Binder事务缓冲区具有有限的固定大小,当前为1MB,由进程中的所有事务共享。由于此限制处于流程级别而非每个活动级别,因此这些事务包括应用程序中的所有绑定事务,例如onSaveInstanceState,startActivity和与系统的任何交互。当超过大小限制时,将引发TransactionTooLargeException。

对于savedInstanceState的具体情况,数据量应该保持很小,因为只要用户可以导航回该活动(即使活动的进程被终止),系统进程也需要保留提供的数据。我们建议您将保存状态保持为小于50k的数据

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

Lastest Update:2018.04.17

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Android必备】Parcelables and Bundles(6)

猜你喜欢

转载自blog.51cto.com/4789781/2122336