在Android中使用Bundle代替直接Intent putExtra()的优点


79

在我的android应用程序中,我始终使用class的直接putExtra()函数Intent将任意数量的值传递给new Activity
像这样:

Intent i = new Intent(this, MyActivity.class);
i.putExtra(ID_EXTRA1, "1");
i.putExtra(ID_EXTRA2, "111");
startActivity(i);

我知道Bundle在Android中,而且我已经看到人们正在使用Bundle将值传递给new 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);

在这里我有两个疑问。如果可以通过将值直接传递给new来传递值,
为什么还要使用? 使用而不是直接的优势是什么?BundleActivityIntent
BundleIntent putExtra()

Answers:


65

它几乎没有(如果有任何区别)。使用附加捆绑软件的代码稍微重一点(在任何实际应用中都不会有任何区别),并且更易于管理(更通用)。

如果有一天您决定-在意图内发送信息之前-您想要将数据序列化到数据库-拥有一个可以序列化,添加到意图然后馈入PendingBundle的捆绑包将更加干净。与一个对象。

[更新]

澄清(由于其他一些答案)。

Extras每个Intent可以携带(但不是必须)的附加捆绑包,因此在使用捆绑包或不使用捆绑包之间没有其他选择。两种方式都使用捆绑包。

首次使用时putExtramExtrasIntent中的捆绑包将初始化,并将以下所有putExtra委托给它。捆绑包本身是您无法访问的(这是设计使然,以避免某些类型的错误)。

putExtras不会将捆绑软件放入Intent中。而是将其复制到当前的意图包(或与一起创建一个putExtra)。这就是为什么它稍微重一些的原因(您有两捆而不是一捆,并要支付复印费用)。

关键是-如果使用putExtras,则仍然无法访问意图内的实际捆绑包。但是-您有一份可能需要使用的副本。像不停地复制到另一个意图中(如果您发送很多类似的意图)。


告诉我我是否使用像这样的代码Intent intent = new Intent(this,MyActivity.class); intent.putExtra(ID_EXTRA1,“ 1”); 捆绑包=新的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捆绑包的副本(不是原始捆绑包)。小心,它可能返回null。
fdreger

因此,我可以从新的活动装备获取ID_EXTRA1和extras(bundle)。
Vishal Vijay

抱歉,我无法从这个问题的答案中得知,但是,如果我有一个意图是仅用于编辑ValueObjects数据,那么我要做的就是传递要从静态数据中使用哪个VO的索引资源。由于其强制性,应在startActivity(intent, options)或中完成intent.putExtra()?我知道两者都可以做,但是我只是在考虑最佳实践?我通常不触摸传递给onCreate的Bundle,但是我没有经验,因此无法寻求意见。
WORMSS 2013年

putExtras(bundle)不会委派给原始意图。原始意图有一个捆绑包。
Lena Bru

17

附加优势:将数据放入捆绑包后,您可以通过多个意图发送相同的数据。(仅在这种情况下,将发送多个意图)。


6

捆绑包很酷,因为您可以更轻松地隔离它们的创建/读取,因此可以将处理捆绑包的代码与UI代码分开。

在大多数情况下,这是没有用的,因为您要传输尽可能少的数据(通常只有几个字符串,一个id ...)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.