将可序列化的额外对象置于intent中会更改对象

时间:2014-05-21 06:30:54

标签: android android-intent

我正在尝试将对象从活动传递到另一个活动。这是我做的:

MyApplication.db= dbToOpen;
Intent i = new Intent(mContext, OpenDbActivity.class);
i.putExtra("PARENT_GROUP", dbToOpen.root);
mContext.startActivity(i);

此处, MyApplication 是扩展应用程序的类, db 对象是静态对象。我的额外对象 dbToOpen.root DBGroupv1 类的对象。

然后我在OpenDbActivity类的onCreate方法中得到了额外的东西:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_opendb);
    db = MyApplication.db;
    groupToOpen = (DBGroupv1) getIntent().getSerializableExtra("PARENT_GROUP");

}

然后我尝试这个布尔表达式:

MyApplication.db.root == groupToOpen

并返回false。当我查看对象dbToOpen.root和groupToOpen时,这些对象中的每个变量值都是相同的。但它们是不同的对象。为什么会这样?是因为强制转换,还是Intent.putextra()方法传递了一个对象的副本,而不是一个引用?如果是这种情况我怎么能将对象作为参考传递?(除了使用静态变量)

由于

1 个答案:

答案 0 :(得分:1)

您应该使用.equals() - 方法来比较对象的实例。如果使用==,只有两个对象完全相同的引用才会生效。由于意图中的实例是在从包中反序列化时新创建的,因此它不再是对同一实例的引用(尽管这两个对象包含相同的数据)。

所以,而不是

MyApplication.db.root == groupToOpen //bad

使用

MyApplication.db.root.equals(groupToOpen) //good

另外请确保如果您创建了root - 对象,则可以正确实现equals方法,因此需要考虑所有适当的变量。

您可以在此处阅读更多内容:What is the difference between == vs equals() in Java?