【问题标题】:Intent and getSerializableExtra value returnIntent 和 getSerializableExtra 值返回
【发布时间】:2015-07-27 14:02:49
【问题描述】:

onCreate 中,我从意图中获得了一个额外的可序列化到我的活动的itemsList

itemsList = (ArrayList<HashMap<String, String>>) intent
  .getSerializableExtra("sliding_menu_content");

然后在活动中,我将一些其他地图元素添加到itemsList 数组。 令我惊讶的是,改变设备的方向,getSerializableExtra 返回itemsList 的更新状态,包括所有地图元素的添加。怎么可能?

编辑:
我的通话活动添加了这样的额外内容

ArrayList<HashMap<String, String>> startingList = 
   new ArrayList<HashMap<String, String>>();
i.putExtra("sliding_menu_content", startingList);
startActivity(i);

据我了解,传递参数是一个要评估的假设,当我通过 getSerializableExtra 分配 itemsList 时,我得到的不是 其值的副本,而是得到一个 指向调用活动传递的原始对象的指针(即startingList),则对其的每次更新都是对原始值的更新。

【问题讨论】:

  • 请检查您没有调用更新 Intent 的代码,例如。 #onResume
  • 您是通过哪种方法将其他地图元素添加到 itemList 数组中的?
  • 检查:Intent 没有变化。
  • 我在onPostExecute 中添加了其他项目,覆盖了嵌套在保留片段中的 AsyncTask 的 onPostExecute()。
  • 我用假设来评估我的问题,谢谢

标签: android android-intent android-activity parameters parameter-passing


【解决方案1】:

你应该知道 Intent.putExtra() 和 Intent.getSerializable() 是如何工作的。 Intent 使用 Bundle 保存参数,如果不是进程间 Intent内部 Bundle 只需将原始对象保存在数据映射中。 ,这些对象将不会被复制(做拆包和包裹的东西),所以你得到的仍然是原始对象。

【讨论】:

  • 有趣。那么一个Intent内部Bundle的作用域是不是进程的作用域呢?
  • 是的,当您需要在进程之间交换数据时,例如向其他进程中的另一个应用程序发送意图。意图将通过活页夹写入另一个进程。 Intent 本身也实现了 parcelable。
  • 我正在尝试将 String 对象传递给 Intent 的附加组件,将其放在被调用活动的 getStringExtra() 上,修改其值,然后旋转设备:没有相同的行为,修改值在旋转中丢失。也许这仅适用于可分割的对象。
猜你喜欢
  • 2012-09-28
  • 2011-08-26
  • 2012-05-02
  • 2014-11-16
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多