【问题标题】:Bundle.putParcelable(String key, Parcelable value) and Intent.putExtra(String name, Parcelable value) DifferenceBundle.putParcelable(String key, Parcelable value)和Intent.putExtra(String name, Parcelable value)的区别
【发布时间】:2017-02-26 19:29:39
【问题描述】:

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

案例一:

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

案例 2:

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

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

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

    但是,IntentActivity 是不同的,Activity 没有对象引用到其他 Activities,并且通信必须通过系统,因此 - 与 Activity/Fragment 不同,必须使用 Parcelable /Bundle 系统可以序列化/反序列化的数据。 当您将 Intent 发送到不同的 Activity 时,您的 Parcelable 会通过系统并因此获得 serailze/deserialze - 您在 2 个不同的活动中有不同的对象引用。当您在 FragmentsetArgument Activity/Fragment 没有像不同活动那样的界限时,这不会发生。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-10-12
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 2013-08-31
        • 2013-06-24
        • 2019-06-12
        相关资源
        最近更新 更多