我在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}}对象。
答案 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中的实例,因为事实上,这是同一个实例。
这是正常的吗?
是