Android 当添加到捆绑包的对象无法再更新时?
我在Android 当添加到捆绑包的对象无法再更新时?,android,bundle,Android,Bundle,我在Android中有以下关于bundle的代码: 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 U
Android
中有以下关于bundle
的代码:
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);
}
在以下示例中,硬币最初的lastPrice
值为100
。
我将该值添加到bundleFrominent
奇怪的是,在添加之后,如果我将值从coin
更改,则捆绑包中的值也会被修改为200
,而不是100
,这是我将其添加到捆绑包中时的值
这正常吗?为什么以前在捆绑包中添加的值也会更改,以及何时添加到捆绑包中的对象不再能够更改
对于硬币
对象,我使用可包裹
这正常吗
对
为什么以前在捆绑包中添加的价值也会发生变化
因为它是同一个物体
添加到捆绑包的对象何时不再能够更改
你可以随时更改它
但是,对意图的某些使用,例如将其传递给startActivity()
,将导致进程间通信(IPC)。这将涉及将Intent
及其附加内容转换为字节[]
以传递给核心操作系统进程。即使您正在启动的活动是您自己的活动,IPC仍然会发生,因为IPC将从核心操作系统进程返回到您的进程,以启动所需的活动。将Intent
转换为byte[]
并返回到Intent
的过程将导致创建一个新的Coin
对象,作为创建新Intent
的一部分
并非每次使用Intent
都会产生这种效果——值得注意的是,LocalBroadcastManager
“broadcasts”不会产生新的Intent
和新的Coin
。但是,如果您启动一项活动,启动或绑定一项服务,或发送一个涉及IPC的广播,将导致一个新的硬币成为该活动、服务或接收器的一部分。如果您检查Bundle
类的源代码,您将发现以下实现
/* package */ ArrayMap<String, Object> mMap = null;
...
public void putParcelable(String key, Parcelable value) {
unparcel();
mMap.put(key, value);
mFdsKnown = false;
}
/*package*/ArrayMap mMap=null;
...
public void putParcelable(字符串键,Parcelable值){
unparcel();
mMap.put(键、值);
mFdsKnown=false;
}
这意味着您添加的对象实例不会写入地块,而只是存储在地图中。因此,如果修改该实例的属性,则值会发生更改
当Intent
被发送时,写入包裹的时间会晚一些,时间也会晚一些。您对实例所做的所有更改也将应用于bundle中存储的实例,因为实际上,这是同一个实例
这正常吗
是。请参见