将对象从 Activity 传递到 Fragments 是通过引用传递

Posted

技术标签:

【中文标题】将对象从 Activity 传递到 Fragments 是通过引用传递【英文标题】:Passing Objects from Activity to Fragments is Pass by Reference 【发布时间】:2016-04-18 15:09:28 【问题描述】:

当我们使用SerializableParcelableactivities 之间传递对象时,对象的副本/值 被发送到接收方activity(典型的按值传递行为) .

但是为什么当我们将对象作为ParcelableBundle 中传递给Fragments 时,出于某种原因,它们作为对象的引用 而不是copy/value对象的(按引用传递行为)。我还没有检查过Serializable,但我相信它会是一样的。

对象以相同的方式传递,那么为什么Activity 接收objectFragment 接收它的方式会有所不同?

【问题讨论】:

【参考方案1】:

但是为什么当我们将对象作为 Parcelable 在 Bundle 中传递给 Fragments 时,出于某种原因,它们作为对象的引用而不是对象的副本/值发送

不能保证。例如,如果您进行了配置更改,或者您的进程已终止但用户快速返回到您的任务,您将获得一份副本。

对象的传递方式相同,为什么Activity接收对象的方式和Fragment接收对象的方式有区别?

启动一项活动总是涉及 IPC,因此总是涉及跨进程边界复制数据。

【讨论】:

那么当我们将对象传递给片段时,如何确保我们总是得到copy 而不是reference?您还认为在片段的情况下通过引用传递对象是android实现中的错误吗? @SherazAhmadKhilji:“那么当我们将对象传递给片段时,如何确保我们始终获得副本而不是引用?” -- 不要传递自定义的Parcelable 对象。或者,在出版方面自己制作一份副本。或者,在接收方自己制作一份副本。或者,不要在片段中的对象上调用任何设置器。或者,不要以这种方式传递数据,而是使用一些单例数据模型管理器。 “您还认为在片段的情况下通过引用传递对象是Android实现中的错误吗?” - 不。它可以使用更多文档。 在Android开发中人们没有遇到过这个问题,有点难以理解。您能否将我链接到一些文章或答案,其中通过一些官方 Android 文档的参考来解释此问题【参考方案2】:

我遇到了同样的问题,我认为它通过了参考。

   public void setArguments(Bundle args) 
    if (mIndex >= 0) 
        throw new IllegalStateException("Fragment already active");
    
    mArguments = args;


/**
 * Return the arguments supplied when the fragment was instantiated,
 * if any.
 */
final public Bundle getArguments() 
    return mArguments;

我从 Fragment 源代码中找到了这个,它与传递数据的活动不同,尽管它们都使用Bundle

【讨论】:

以上是关于将对象从 Activity 传递到 Fragments 是通过引用传递的主要内容,如果未能解决你的问题,请参考以下文章

从 android Activity 传递到 Fragment 的 Parcelable 对象

如何将 LocationRequest 对象从活动传递到服务?

如何将数据从 Activity 传递到已创建的 Fragment?

如何使用 TabLayout 将数据从 Activity 传递到 Fragment

android中怎样动态的将数据从service上传递到activity

如何使用 Intents 将对象从一个 Android Activity 发送到另一个?