2017-02-26 113 views
0

我有一个实现Parcelable接口的对象。Bundle.putParcelable(String key,Parcelable value)和Intent.putExtra(String name,Parcelable value)差异

案例1:

我有一个活动A和B.我想从一个物体传递使用Intent.putExtra(String name, Parcelable value)所以在活动B,当我得到对象到B和改变一些领域,并得到回A对象的领域保持不变。这意味着通过Intent.putExtra(String name, Parcelable value)传递对象后,将创建一个新的对象实例。

案例2:

我有一个包含对象列表的活动,也是活动具有ViewPager与片段。我创建片段并传递给它对象Bundle.putParcelable(String key, Parcelable value)因此,当我获取对象并更改某些字段(int Fragment)时,放置在列表中(在Activity中)的对象也发生了更改。所以这意味着对象还没有被创建,只是引用已经传递给fragment。

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

回答

1

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

Activity包含Fragment它具有直接引用Fragment,和上Fragment设定束是Fragment对象上简单的设置,这是指该包对象的引用,但活动是一样的一个在Fragment。其实你不一定需要这种机制,因为你可能会控制Fragments并知道它们的类型,所以你可以通过在Fragment上暴露一个方法来传递参数。好处和意图的相似之处在于使用提供的set/getArguments()保留了片段销毁和创建的那些参数,它使用BundleParcelable,它们是系统可以在控制之外存储的数据。

但是,IntentActivity是不同的,Activity没有对象引用其他Activities和交流必须通过该系统,从而 - 不像Activity/Fragment必须Parcelable/Bundle数据,该系统可以serailze/deserialze来完成。 当您将一个意向发送给另一个Activity时,您的Parcelable会通过系统并因此得到serailze/deserialze - 您在两个不同的活动中有不同的对象引用。这不会发生在setArgumentFragmentActivity/Fragment没有像不同的活动边界。

0

这个区别不是putParcelableputExtra。 接受参数或接受参数的片段的活动不应该对传入的数据进行变异,因为它可以通过引用传递(作为优化),也可以从包中重新创建(当需要时)。

如果要从活动中返回一些数据,请使用startActivityForResult()setResult()。如果你想从Fragment中返回一些数据,使用getActivity()从Fragment获得一个宿主Activity并与之通信。

相关问题