为什么你会在新意图的额外内容中添加一个新包,直接在新意图上设置额外内容?

时间:2017-10-04 20:51:41

标签: android android-intent bundle

这里是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'来传递给你的包。然而,这只是创建一个新的包只是为了插入一个新的意图,所以我似乎没有必要,但我可能是错的。这就是为什么我要问他的方法有什么技术好处。

1 个答案:

答案 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()会更有意义。