什么是Android应用程序中的“捆绑包”


Answers:


278

捆绑包通常用于在各种Android活动之间传递数据。这取决于您要传递的值的类型,但是捆绑包可以容纳所有类型的值并将其传递给新活动。

您可以像这样使用它:

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和cast?
lovespring

78

使用BundleIntent对象在活动之间传递数据


您的第一个Bundle对象

Bundle b = new Bundle();

然后,将存储在anystring其中的字符串数据与捆绑密钥相关联"myname"

b.putString("myname", anystring);

现在,创建一个Intent对象

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

将捆绑对象传递b给意图

in.putExtras(b);

然后开始第二个活动

startActivity(in);

在第二个活动中,我们必须访问从第一个活动传递的数据

Intent in = getIntent();

现在,您需要从包中获取数据

Bundle b = in.getExtras();

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

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

这真是一个很好的详细答案,谢谢。
Abhishek Garg,

67

我必须补充一点,活动将来会使用捆绑包将数据传递给自己。

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

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

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

有一个选项可以禁用这种“旋转时重新创建活动”行为,但是它不会阻止与重启相关的错误,只会使它们更难于提及。

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


如果我们只能使用映射,为什么还要使用捆绑软件?谢谢特德!
Ruchir Baronia

4
捆绑包不仅由Activity使用。片段还使用它在旋转后保留状态。
王凯

47

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

Android之所以不使用普通的旧Map对象,是因为Map它太灵活了;它可以包含无法序列化的对象(例如I / O流)。所述BundleAPI限制的类型,可以被添加至一个摞这样的方式该包的内容被保证序列对象。Android框架依赖于此属性。

我建议您阅读有关“ 应用程序基础知识”的文档。这尤其说明了捆绑和意图是什么以及它们的用途。


14

捆绑包可用于通过意图将任意数据从一个活动发送到另一个活动。当您广播Intent时,有兴趣的活动(和其他BroadcastRecievers)将收到通知。一个意图可以包含一个包,以便您可以与该意图一起发送额外的数据。

捆绑包是键值映射,因此在某种程度上,它们就像哈希一样,但并不严格限于单个String / Foo对象映射。请注意,只有某些数据类型被认为是“可打包的”,并且在Bundle API中明确说明了它们。


这是迄今为止真正解决OP的问题(即什么是捆绑销售)的唯一答案。stackoverflow.com/a/6236801/1588163提供了更多见解。
clapas 2014年

如果我们只能使用映射,为什么还要使用捆绑软件?谢谢!
Ruchir Baronia

@RuchirBaronia没有特殊的理由使用Bundle,除非您打算将其传递给需要Bundle对象的Android API的一部分。
scriptocalypse '16

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

捆绑包用于在活动之间传递数据。您可以创建一个捆绑包,将其传递给Intent来启动该活动,然后可以从目标活动中使用它。


3

Bundle:-从String值到各种Parcelable类型的映射。

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

当我们调用onPause()时,先调用onStop(),然后按相反的顺序将onStop()转换为onPause()。

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


映射是捆绑包的本质。
BollMose

2

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


0

使用包在意图对象的帮助下将数据从一个活动发送到另一个活动;捆绑存放可以是任何类型的数据。

现在,我介绍了如何创建两个活动之间传递数据包的捆绑包。

步骤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");

我认为这对您有用。


0

Bundle不仅用于在两个不同组件之间传输数据,而且更重要的是,它用于恢复在活动被销毁为新活动之前存储的值。

例如EditText小部件中的文本或的滚动位置ListView


0

第一次活动:

String food = (String)((Spinner)findViewById(R.id.food)).getSelectedItem();
RadioButton rb = (RadioButton) findViewById(R.id.rb);
Intent i = new Intent(this,secondActivity.class);
i.putExtra("food",food);
i.putExtra("rb",rb.isChecked());

第二项活动:

String food = getIntent().getExtras().getString("food");
Boolean rb = getIntent().getExtras().getBoolean("rb");

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.