Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当添加到捆绑包的对象无法再更新时?_Android_Bundle - Fatal编程技术网

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中存储的实例,因为实际上,这是同一个实例

这正常吗

是。

请参见