安卓应用中的"bundle"是什么?

298

什么是Android应用程序中的bundle?何时使用它?

12个回答

300

Bundles通常用于在不同的Android活动之间传递数据。您可以根据需要选择要传递的值类型,但bundles可以容纳所有类型的值并将它们传递到新的activity。

您可以像这样使用它:

Intent intent = new...
Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("myKey", AnyValue);  
startActivity(intent);

你可以通过以下方式获取传递的值:

Bundle extras = intent.getExtras(); 
String tmp = extras.getString("myKey");

更多信息可以在以下链接中找到:


3
为什么不直接使用 System.Object 并进行类型转换? - lovespring
传递“AnyValue”并假设该值为字符串? - Hiro

94

通过使用Bundle对象和Intent对象在活动之间传递数据。


首先创建一个Bundle对象。

Bundle b = new Bundle();

那么,将存储在anystring中的字符串数据与bundle键"myname"相关联。

b.putString("myname", anystring);

现在,创建一个 Intent 对象

Intent in = new Intent(getApplicationContext(), secondActivity.class);

将 bundle 对象 b 传递到 intent 中。

in.putExtras(b);

并启动第二个活动

startActivity(in);
在第二个活动中,我们需要访问从第一个活动传递过来的数据。
Intent in = getIntent();

现在,你需要从 bundle 中获取数据。

Bundle b = in.getExtras();

最后,获取与键名为"myname"相关联的字符串数据的值。

String s = b.getString("myname");

75

我必须补充说明,Bundle 用于活动将数据传递给其未来的自身。

当屏幕旋转或启动另一个活动时,会调用方法 protected void onSaveInstanceState(Bundle outState),然后销毁该活动。稍后,将创建活动的另一个实例,并调用方法 public void onCreate(Bundle savedInstanceState)。在第一个活动实例创建时,Bundle 为空;如果 Bundle 不为空,则活动将继续由其前任开始的某些业务。

Android 会自动保存文本字段中的文本,但它并不保存所有内容,有时会出现微妙的错误。

最常见的反模式是假设 onCreate() 只执行初始化。这是错误的,因为它还必须恢复状态。

有一种选项可以禁用此“旋转重新创建活动”行为,但它不会防止与重新启动相关的错误,只会使这些错误更难以察觉。

也请注意,唯一在活动即将被销毁时保证调用的方法是 onPause()。(请参阅文档中的活动生命周期图表。)


为什么要使用bundle,如果我们可以直接使用映射呢?谢谢Ted! - Ruchir Baronia
4
Bundle不仅被Activity使用,Fragment也会用它来在旋转后保存状态。 - Kai Wang

64

更新:在Android中,“bundle”这个术语有两个完全不相关的含义。一个是在下面原始回答中详细介绍的含义,另一个是“应用程序包”(app bundle)。这是一种较新的档案文件格式(以.apk结尾),包含一个Android应用程序和一些附加元数据。您可以上传应用程序包文件而不是应用程序APK文件来通过Google Play分发应用。应用程序包比.apk文件具有某些优点,但可能不兼容其他应用商店(如Amazon App Store)。这些优点在原始回答中包含的文档链接中描述。

原始回答:

Bundle非常类似于将String键映射到值的Java Map对象。它用于在活动和其他应用程序组件之间传递信息。框架还使用它来捕获和恢复状态信息。

Android之所以不使用普通的Map对象是因为Map太灵活了;它可能包含不能序列化的对象(例如I/O流)。Bundle API以这样的方式限制可以添加到bundle中的对象类型,以确保bundle的内容可序列化。Android框架依赖于这个属性。

我建议您阅读有关应用程序基础知识的文档。这解释了bundles和intents是什么以及它们的用途。


谢谢!正是我想要的。 附注:链接需要更新。 - Abhimanyu
@Abhimanyu - 谢谢。链接对我来说完美无缺。 - Ted Hopp

15

通过意图(Intent)可以使用捆绑包(Bundle)将任意数据从一个活动(Activity)发送到另一个活动。当你广播一个意图时,感兴趣的活动(和其他广播接收器)将被通知。意图可以包含捆绑包,以便你可以发送额外的数据。

捆绑包是键值映射,因此在某种程度上它们类似于哈希表,但不严格限制于单个字符串/对象映射。请注意,只有特定的数据类型被认为是“可包裹的”,并且它们在捆绑包API中明确列出。


这是目前唯一真正回答了OP的问题,也就是什么是bundle。https://dev59.com/nG025IYBdhLWcg3wEhjr#6236801 提供了更多的见解。 - clapas
为什么我们可以直接使用映射,而不是使用捆绑包呢?谢谢! - Ruchir Baronia
@RuchirBaronia,除非你打算将其传递给需要Bundle对象的Android API的部分,否则没有特殊原因使用Bundle。 - scriptocalypse

8

只需创建一个捆绑包,


Bundle simple_bundle=new Bundle();
simple_bundle.putString("item1","value1");
Intent i=new Intent(getApplicationContext(),this_is_the_next_class.class);
i.putExtras(simple_bundle);
startActivity(i);

在"this_is_the_next_class.class"中

您可以像这样检索项目。

Intent receive_i=getIntent();
Bundle my_bundle_received=receive_i.getExtras();
my_bundle_received.get("item1");
Log.d("Value","--"+my_bundle_received.get("item1").toString);

5

Bundle用于在Activity之间传递数据。您可以创建一个bundle,将其传递给启动目标Activity的Intent,然后在目标Activity中使用它。


4

Bundle: -

Bundle(捆绑包):是一种从字符串值到各种可序列化类型的映射。

Bundle 通常用于在 Android 的各个活动之间传递数据。

当我们调用 onPause() 方法时,系统会依次调用 onStop() 和 onPause() 方法。

保存的数据用于恢复先前状态的系统称为“实例状态”,它是存储在 Bundle 对象中的键值对集合。


映射是捆绑的本质。 - BollMose

2

bundle用于在活动之间共享数据,并在oncreate()方法中保存应用程序的状态,以便应用程序知道它停止的位置... 希望这有所帮助 :)


0

使用Bundle和Intent对象将数据从一个活动传递到另一个活动;

Bundle保存可以是任何类型的数据。

现在我告诉您如何创建Bundle以在两个活动之间传递数据。

步骤1:在第一个活动上

Bundle b=new Bundle();

b.putString("mkv",anystring);

Intent in=new Intent(getApplicationContext(),secondActivity.class);

in.putExtras(b);

startActivity(in);

步骤2:在第二个活动中

Intent in=getIntent();

Bundle b=in.getExtras();

String s=b.getString("mkv");

我认为这对你很有用...........


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