Bundle.putParcelable(String key,Parcelable value)和Intent.putExtra(String name,Parcelable value)的区别

时间:2017-02-26 19:29:40

标签: android

我有一个实现Parcelable接口的对象。

案例1:

我有一个活动A和B.我想使用Intent.putExtra(String name, Parcelable value)将对象从A传递给B,所以在活动B中,当我得到对象并更改一些字段并返回A时,对象的字段仍然是相同。这意味着在通过Intent.putExtra(String name, Parcelable value)传递对象之后,将创建一个新的对象实例。

案例2:

我有一个包含对象列表的Activity,该活动还包含带有片段的ViewPager。我创建片段并传递给它对象Bundle.putParcelable(String key, Parcelable value)所以当我得到对象并更改一些字段(int Fragment)时,放在列表中的对象(在Activity中)也会发生变化。因此,尚未创建平均对象,只是引用已传递给片段。

有人可以解释有关Bundle.putParcelable(String key, Parcelable value)Intent.putExtra(String name, Parcelable value)的奇怪行为吗?

2 个答案:

答案 0 :(得分:1)

这是因为Intent机制和set/getArguments() Fragment的工作方式不同。

Activity包含Fragment时,它会直接引用Fragment,并且Fragment上的Fragment上的设置是简单的设置,那是表示Bundle对象引用,但Activity与Fragment中的Activity相同。实际上你并不一定需要这种机制,因为你Activity可能控制Fragments并知道它们的类型,所以你可以通过在Fragment上公开一个方法来传递参数。利益和与意图的相似性是使用提供的set/getArguments()在片段销毁和创建中保留这些参数,它使用BundleParcelable,它们是系统可以存储在外部的数据你的控制。

但是,IntentActivity不同,Activity没有对其他Activities的对象引用,并且通信必须通过系统,因此 - 与{{不同1}}必须使用Activity/Fragment / Parcelable数据来完成,系统可以对其进行serailze / deserialze。 当您将意图发送到另一个Bundle时,您的Activity会通过系统并进行serailze / deserialze - 您在2个不同的活动中有不同的对象引用。如果Parcelable setArgument Fragment / Activity没有像不同活动这样的界限,那么这种情况就不会发生。

答案 1 :(得分:0)

这种差异与putParcelableputExtra无关。 接受一个接受参数的Intent或Fragment的Activity不应该改变传入的数据,因为它可以通过引用传递(作为优化),或者可以从Parcel重新创建(当它是必要的时候)。

如果您想从活动中返回一些数据,请使用startActivityForResult()setResult()。如果要从Fragment返回一些数据,请使用getActivity()从片段中获取宿主活动并与其进行通信。