在Android中使用Bundle而不是直接使用Intent putExtra()的优点

86
在我的安卓应用中,我一直使用Intent类的直接putExtra()函数将任意数量的值传递给新的Activity
像这样:
Intent i = new Intent(this, MyActivity.class);
i.putExtra(ID_EXTRA1, "1");
i.putExtra(ID_EXTRA2, "111");
startActivity(i);

我知道在Android中有Bundle,我也看到人们使用Bundle来向新的Activity传递值。
像这样:

Intent intent = new Intent(this, MyActivity.class);
Bundle extras = new Bundle();
extras.putString("EXTRA_USERNAME","my_username");
extras.putString("EXTRA_PASSWORD","my_password");
intent.putExtras(extras);
startActivity(intent);

我有两个疑问。
为什么我可以把值直接放到Intent中,还要使用Bundle呢?
相对于直接使用IntentputExtra()方法,使用Bundle有哪些优势?

4个回答

68

这没有什么区别(如果有的话)。使用额外bundle的代码会稍微增加负担(在任何实际应用中都不会有任何区别),并且更易于管理,因为更通用。

如果有一天你想在将信息发送到意图之前将数据序列化到数据库中 - 拥有一个可以序列化,添加到意图中并然后馈送到PendingBundle的bundle会更加清晰。- 所有使用一个对象完成。

[更新]

澄清(因为其他答案)。

Extras是每个Intent可能携带的额外bundle(但不必如此),因此不存在使用bundle或不使用bundle之间的选择。您无论如何都要使用Bundle。

第一次使用putExtra时,初始化Intent内部的mExtras bundle,并将所有以下putExtra委派给它。bundle本身对您不可见(这是按设计而来的,以避免某些类型的错误)。

putExtras不会将您的bundle放入Intent中。相反,它将其复制到当前意图bundle中(或者像putExtra一样创建一个新的)。这就是为什么它稍微重量级的原因(您有两个bundle而不是一个,并支付复制的代价)。

关键在于 - 如果您使用putExtras,仍然无法访问意图内部的真实捆绑包。但是 - 您可以拥有一份副本,用于其他任何可能需要的操作。例如,保留以复制到另一个意图中(如果您发送大量类似的意图)。

告诉我如果我使用这样的代码 Intent intent = new Intent(this, MyActivity.class); intent.putExtra(ID_EXTRA1, "1"); Bundle extras = new Bundle(); extras.putString("EXTRA_USERNAME","my_username"); extras.putString("EXTRA_PASSWORD","my_password"); intent.putExtras(extras); startActivity(intent); 我该如何访问ID_EXTRA1? - Vishal Vijay
@VishalVijay,你可以通过调用getExtras来获取extras bundle的副本(而不是原始副本)。注意,它可能返回null。 - fdreger
所以我可以从新的活动中获取ID_EXTRA1和extras(bundle)。 - Vishal Vijay
抱歉,我无法从这个问题的答案中完全理解,但如果我的意图仅是编辑ValueObjects数据,则我只需从静态数据资源传递要使用的VO的索引即可。由于它是强制性的,应该在startActivity(intent, options)还是intent.putExtra()中完成?我知道两者都可以,但我只是在考虑最佳实践?我通常不会触及传递给onCreate的Bundle,但我经验不足,所以正在寻求意见。 - WORMSS
@LenaBru 或许你把 putExtras 和 putExtra(String, Bundle) 搞混了?我的回答很容易证实。只需要查看 putExtras 方法,它确切地执行了我所说的操作。 - fdreger
显示剩余5条评论

18

额外优势: 一旦将数据放入 Bundle 中,您可以通过多个意图多次发送相同的数据。(仅在需要发送多个意图的情况下)


6

捆绑包很酷,因为你可以更容易地隔离它们的创建/读取,从而将处理捆绑包的代码与UI的代码分离。

在大多数情况下这是无用的,因为你只需要传输最小可能量的数据(通常只是几个字符串、一个ID等)。


5

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