Android传值Intent和Bundle的区别

Intent的使用

假设需要将数据从页面A传递到B,然后再传递到C。
A页面:

	Intent intent=new Intent(MainActivity.this,BActivity.class);
    intent.putExtra("String","MainActivity中的值");
    intent.putExtra("int",11);
    startActivity(intent);

B页面中:

	Intent intent = getIntent();
    string = intent.getStringExtra("String");
    key = intent.getIntExtra("int",0);

然后再发数据到C页面:

    Intent intent=new Intent(BActivity.this,CActivity.class);
    intent.putExtra("String1",string);
    intent.putExtra("int1",key);
    intent.putExtra("boolean",true);
    startActivity(intent);

Bundle使用方式

A页面中:

    Intent intent = new Intent(MainActivity.this, BActivity.class);
    Bundle bundle = new Bundle();
    bundle.putString("String","MainActivity中的值");
    bundle.putInt("int",11);
    intent.putExtra("bundle",bundle);
    startActivity(intent);

在B页面接收数据:

Intent intent = getIntent();
bundle=intent.getBundleExtra("bundle");

然后在B页面中发送数据:

    Intent intent=new Intent(BActivity.this,CActivity.class);
    //可以传给CActivity额外的值
    bundle.putBoolean("boolean",true);
    intent.putExtra("bundle1",bundle);
    startActivity(intent);

总结

Bundle可对对象进行操作,而Intent是不可以。Bundle相对于Intent拥有更多的接口,用起来比较灵活,但是使用Bundle也还是需要借助Intent才可以完成数据传递总之,Bundle旨在存储数据,而Intent旨在传值。

然后看下intent的put方法源码:
public @NonNull Intent putExtra(String name, Parcelable value) { if (mExtras == null) { mExtras = new Bundle(); } mExtras.putParcelable(name, value); return this; }
可以看到其实内部也是使用的Bundle来传输的数据。

为什么Bundle不直接使用Hashmap代替呢

1、Bundle内部是由ArrayMap实现的,ArrayMap的内部实现是两个数组,一个int数组是存储对象数据对应下标,一个对象数组保存key和value,内部使用二分法对key进行排序,所以在添加、删除、查找数据的时候,都会使用二分法查找,只适合于小数据量操作,如果在数据量比较大的情况下,那么它的性能将退化。而HashMap内部则是数组+链表结构,所以在数据量较少的时候,HashMap的Entry Array比ArrayMap占用更多的内存。因为使用Bundle的场景大多数为小数据量,我没见过在两个Activity之间传递10个以上数据的场景,所以相比之下,在这种情况下使用ArrayMap保存数据,在操作速度和内存占用上都具有优势,因此使用Bundle来传递数据,可以保证更快的速度和更少的内存占用。
2、另外一个原因,则是在Android中如果使用Intent来携带数据的话,需要数据是基本类型或者是可序列化类型,HashMap使用Serializable进行序列化,而Bundle则是使用Parcelable进行序列化。而在Android平台中,更推荐使用Parcelable实现序列化,虽然写法复杂,但是开销更小,所以为了更加快速的进行数据的序列化和反序列化,系统封装了Bundle类,方便我们进行数据的传输。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: IntentBundleAndroid 开发中常用的两种数据递方式,它们的区别在于 Intent 是用于不同组件之间递数据的,而 Bundle 则是用于同一组件中不同方法之间递数据的。具体来说,Intent 可以用于启动一个新的 Activity,并将数据递给它,而 Bundle 则通常用于在一个 Activity 内部的不同方法之间递数据。同时,Intent 还可以用于指定目标组件的详细信息(如 Activity 的类名、Action、Category 等),而 Bundle 则只是一个用于存储键对的容器。 ### 回答2: IntentBundle都是Android中用于Activity之间递数据的方法,它们之间的区别和联系如下: IntentAndroid开发中常用的跳转或者启动Activity的方法,使用Intent,需要在调用目标Activity时通过Intent将需要递的数据一一加入Intent中,然后再在被调用Activity的onCreate()方法中获取这些Intent递数据的方式有两种:一种是通过putExtra()方法加入数据,并通过getExtra()方法获取相应的数据;另一种是通过自定义Parcelable类,将对象作为Intent的Extra进行递。此外,Intent也可以携带Bundle类型的Extra数据,进行递和获取。 Bundle是一种用于Android递数据的容器类,它可以携带多组数据,并以键对的形式存在。和Intent不同的是,Bundle主要是用于在同一个Activity中进行数据递,将数据打包成“包裹”(Bundle)的形式,然后在需要的地方进行接收。BundleIntent都可以携带数据,但是主要作用是不同的,Intent的主要作用是进行Activity之间的跳转和数据递,而Bundle的主要作用是在同一个Activity中递数据。 综上所述,IntentBundle都是为了在Android应用中递数据而作的。有了Intent,我们可以在不同的Activity之间实现数据的递和跳转;有了Bundle,我们可以在同一个Activity中轻松地递多个数据。两种方式各有自己的用途,使用时需要根据需求选择合适的一种方法。 ### 回答3: 在Android开发中,IntentBundle都可以用来递数据,但是两者有很多不同之处。 IntentAndroid系统中的一种消息递机制,用于在不同组件之间递消息。它可以用来启动一个Activity、Service、BroadcastReceiver或者是开启一个隐式的组件。Intent可以递任何类型的数据,包括基本类型,序列化对象和自定义数据类型。Intent可以使用putExtra()方法递数据,也可以使用setData()指定数据URI。在使用Intent递数据时,需要注意Intent的生命周期,如果在Activity onActivityResult()方法里接收数据,需要在startActivityForResult()方法中设置请求码,在返回数据时readFromIntent()方法中获取数据。 BundleAndroid中的一个键对的集合,用于在同一组件中递数据。Bundle通常用于在一个Activity中向另一个Activity递数据。它也可以递任何类型的数据,包括基本类型、序列化对象和自定义数据类型。Bundle使用put()方法递数据,可以使用不同的键名来指定不同的数据类型。在使用Bundle递数据时,需要注意Bundle的生命周期,如果在onCreate()方法中获取数据,需要在启动另一个Activity之前将数据放入Bundle中。 总的来说,IntentBundle都可以用来递数据,在不同的场景下有不同的用途和限制。使用Intent可以在不同组件之间递数据,但是需要注意Intent的生命周期;使用Bundle可以在同一个Activity中递数据,但是需要注意Bundle的生命周期。因此,在使用IntentBundle时,需要根据实际情况选择合适的方式来递数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值