添加到Bundle的对象无法再更新?

时间:2014-10-11 22:13:07

标签: android bundle

我在Bundles中有Android的以下代码:

Bundle bundleFromIntent = getActivity().getIntent().getBundleExtra(Constants.CURRENCY);
bundleFromIntent.putParcelable(Constants.CURRENCY_ITEM, coin);

// convert the value after the refresh if the selected currency is not USD
if (!"USD".equals(savedCurrency.getCode())) {
    coin.setLastPrice(200);
}

在以下示例中,Coin最初的lastPrice值为100。 我将该值添加到bundleFromIntent

奇怪的是,在添加之后,如果我更改了coin的值,Bundle中的值也会被修改为200而不是100是我将其添加到Bundle时的值。

这是正常的吗?为什么先前在Bundle中添加的值也会发生变化,何时添加到Bundle中的对象不再能够更改。

对于我使用Coin的{​​{1}}对象。

2 个答案:

答案 0 :(得分:1)

  

这是正常的吗?

  

为什么先前在Bundle中添加的值也会发生变化

因为它是同一个对象。

  

何时添加到Bundle的对象不再能够更改。

您可以随时更改。

但是,Intent的某些用法(例如将其传递给startActivity())将导致进程间通信(IPC)。这将涉及将Intent及其附加内容转换为byte[]以传递给核心操作系统进程。即使您正在启动的活动是您自己的活动之一,IPC仍然会发生,IPC从核心操作系统进程返回到您的活动,以启动您所需的活动。将Intent转换为byte[]并返回Intent的过程将导致创建新的Coin对象,作为创建新Intent的一部分}。

Intent的每次使用都会产生这种影响 - 尤其是LocalBroadcastManager"广播"不要制作新的Intent和新的Coin。但是,如果您启动活动,启动或绑定到服务,或发送涉及IPC的广播,将导致新的Coin成为活动,服务或接收者获得的活动的一部分。

答案 1 :(得分:1)

如果您查看Bundle类的源代码,您会找到以下实现。

/* package */ ArrayMap<String, Object> mMap = null;
...

public void putParcelable(String key, Parcelable value) {
    unparcel();
    mMap.put(key, value);
    mFdsKnown = false;
}

这意味着您添加的对象实例不会写入包裹,而只是存储在地图中。因此,如果您修改该实例的属性,则值会更改。

稍后发送Intent时会发送一个包裹,这是稍后的时间。您对实例所做的所有更改也将应用于存储在bundle中的实例,因为事实上,这是同一个实例。

  

这是正常的吗?