Intent和Bundle的关系

12

在使用Intent对象时,我们可以直接使用其putExtra()方法添加不同类型的数据。我们还可以将这些额外的数据放入一个Bundle对象中,并将其添加到Intent中。那么,如果我们可以直接使用Intent来完成这些操作,为什么还需要Bundle呢?

4个回答

18

正如您所看到的,Intent 在内部将它存储在一个Bundle中。

public Intent putExtra(String name, String value) {
    if (mExtras == null) {
        mExtras = new Bundle();
    }
    mExtras.putString(name, value);
    return this;
}

9
有时,您只需要传递一些变量或值到其他活动中,但如果您有一堆变量或值需要传递给各种活动,则可以使用Bundle,并轻松地将Bundle传递到所需的活动中,而不是每次都传递单个变量。

mExtras = new Bundle(); 这不够让人信服吗?如果不是,请自行检查 Intent.java 的源代码。 - Reno

3
假设您需要将一个Bundle从一个Activity传递到另一个Activity。这就是为什么Intent允许您将Bundle作为额外字段添加的原因。
编辑:例如,如果您想传递数据库中的一行以及其他一些数据,将此行放入Bundle中并将此Bundle作为额外字段添加到Intent中非常方便。

我在问为什么?我们将把相同的额外数据放入 Bundle 中,并将该 Bundle 添加到 Intent 对象中。这样我们就可以直接将其放入 Intent 对象中,不是吗? - Android Killer
不,它不是。你只需要传递一个Bundle即可。你真的想一个字段一个字段地复制到Intent吗?如果Bundle和Intent的键重叠怎么办?你无法知道人们做的所有事情,所以请记住,你可以将一个Bundle放入Intent中,并在需要时知道该怎么做。 - Michael
一个小例子:你想传递来自数据库的一行数据以及其他一些数据。将这一行存储在“Bundle”中非常方便。在我的一个应用程序中,我使用“Bundle”列表来传递数据库中的多行数据。 - Michael
这不是一个方便的理由伙计。看看下面更好的理由。无论如何+1。 - Android Killer
这取决于您如何估计方便程度。我给了您一个现实生活中的例子,但我从未遇到过因为有很多变量而不得不将许多变量放入“Bundle”的情况。通常在这种情况下,人们会创建“Parcelable”对象。这样更安全、更易于理解和维护。 - Michael

1
我想@Lalit的意思是,假设您的活动始终将相同的变量传递给不同的意图,您可以在类中将它们全部存储在单个Bundle中,并在需要相同参数集时简单地使用intent.putExtras(mBundle)。这将使更改代码更加容易,例如,如果其中一个参数在您的代码中变得过时。
public class MyActivity {
    private Bundle mBundle;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mBundle = new Bundle();
        mBundle.putString("parameter1", value1);
        mBundle.putString("parameter2", value2);
    }
    private void openFirstActivity() {
        Intent intent = new Intent(this, FirstActivity.class);
        intent.putExtras(mBundle);
        startActivity(intent);
    }
    private void openSecondActivity() {
        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtras(mBundle);
        startActivity(intent);
    }
}

OBS:如前所述,Intent将参数存储在内部的Bundle中。值得注意的是,当您调用putExtras时,内部的Intent bundle并不指向同一个对象,而是创建所有变量的副本,使用类似于这样的简单for

for (int i=0; i<array.mSize; i++) {
    put(array.keyAt(i), array.valueAt(i));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接