这里是Android的新手,我正在与一位资深人士就捆绑和意图进行辩论。这就是我一直在做的......
Intent intent = new Intent(this, TargetActivity.class)
.putExtra(Constants.BUNDLE_ITEM_A, itemA)
.putExtra(Constants.BUNDLE_ITEM_B, itemB);
startActivity(intent);
他说这是错的,你应该明确地创建一个新的包,然后将它传递给'putExtras',就像这样......
Intent intent = new Intent(this, TargetActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(Constants.BUNDLE_ITEM_A, itemA);
bundle.putSerializable(Constants.BUNDLE_ITEM_B, itemB);
intent.putExtras(bundle);
startActivity(intent);
然而,'putExtras'已经在内部创建了一个新的bundle,然后只是在传入的bundle中合并,这实际上意味着它是一个抛弃对象(对于这个用例)。这是'putExtras'的来源......
public Intent putExtras(Bundle extras) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putAll(extras);
return this;
}
...所以看起来他的方法是多余的,并且实际上是浪费,因为它创建了一个不必要的捆绑分配,只是为了让它被取消并与意图中已经存在的那个合并。
所以我错过了什么?是否有技术上的理由按照他的建议去做?
注意:我理解使用'putExtras'来传递给你的包。然而,这只是创建一个新的包只是为了插入一个新的意图,所以我似乎没有必要,但我可能是错的。这就是为什么我要问他的方法有什么技术好处。
答案 0 :(得分:4)
这就是为什么我要问他的方法有什么技术好处。
TL; TR:你谈到的案例没有任何好处。它正好相反。
调用使用putExtra()
错误是相当明显的愚蠢,并且完全暴露了对Intent内部的缺乏了解。你的退伍军人应该快速查看Intent.java sources,而不是盲目地辩论,因为他会清楚地看到:
public Intent putExtras(Bundle extras) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putAll(extras);
return this;
}
以及putAll()
在做什么? Docs说:
将来自给定Bundle的所有映射插入此Bundle。
所以putExtras()
只是将作为参数给出的Bundle中的所有映射插入到Intent的内部包中。
在这一点上非常清楚的是,手动创建单独的Bundle,然后将所有额外内容填充到其中只是为了将该包传递给putExtras()
,与使用putExtra()
次调用的直接填充相比,完全没有任何好处。
putExtras()
只是一个帮助方法,可以让你从你收到的作为方法参数的束中批量设置extras(因此它的名字),所以如果你已经有一个想要传递的束,你putExtras()
,但如果你自己填充东西,使用putExtra()
会更有意义。