我有一个实现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)
的奇怪行为吗?
答案 0 :(得分:1)
这是因为Intent
机制和set/getArguments()
Fragment
的工作方式不同。
当Activity
包含Fragment
时,它会直接引用Fragment
,并且Fragment
上的Fragment
上的设置是简单的设置,那是表示Bundle对象引用,但Activity与Fragment
中的Activity相同。实际上你并不一定需要这种机制,因为你Activity
可能控制Fragments
并知道它们的类型,所以你可以通过在Fragment
上公开一个方法来传递参数。利益和与意图的相似性是使用提供的set/getArguments()
在片段销毁和创建中保留这些参数,它使用Bundle
和Parcelable
,它们是系统可以存储在外部的数据你的控制。
但是,Intent
和Activity
不同,Activity
没有对其他Activities
的对象引用,并且通信必须通过系统,因此 - 与{{不同1}}必须使用Activity/Fragment
/ Parcelable
数据来完成,系统可以对其进行serailze / deserialze。
当您将意图发送到另一个Bundle
时,您的Activity
会通过系统并进行serailze / deserialze - 您在2个不同的活动中有不同的对象引用。如果Parcelable
setArgument
Fragment
/ Activity
没有像不同活动这样的界限,那么这种情况就不会发生。
答案 1 :(得分:0)
这种差异与putParcelable
与putExtra
无关。
接受一个接受参数的Intent或Fragment的Activity不应该改变传入的数据,因为它可以通过引用传递(作为优化),或者可以从Parcel重新创建(当它是必要的时候)。
如果您想从活动中返回一些数据,请使用startActivityForResult()
和setResult()
。如果要从Fragment返回一些数据,请使用getActivity()
从片段中获取宿主活动并与其进行通信。