原文:http://tryenough.com/android-…
小伙伴问 Android 传值 Intent 和 Bundle 区别,特此总结下:
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 页面中:
需要先在 B 页面中接收数据
Intent intent = getIntent();
string = intent.getStringExtra(“String”);
key = intent.getIntExtra(“int”,0);
然后再发数据到 C 页面
原文:http://tryenough.com/android-…
Intent intent=new Intent(BActivity.this,CActivity.class);
intent.putExtra(“String1”,string);
intent.putExtra(“int1”,key);
intent.putExtra(“boolean”,true);
startActivity(intent);
可以看到,使用的时候不方便的地方是需要在 B 页面将数据一条条取出来然后再一条条传输给 C 页面。
而使用 Bundle 的话,在 B 页面可以直接取出传输的 Bundle 对象然后传输给 C 页面。
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);
原文:http://tryenough.com/android-…
在 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 旨在传值。
原文:http://tryenough.com/android-…
然后看下 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 代替呢?
Bundle 内部是由 ArrayMap 实现的,ArrayMap 的内部实现是两个数组,一个 int 数组是存储对象数据对应下标,一个对象数组保存 key 和 value,内部使用二分法对 key 进行排序,所以在添加、删除、查找数据的时候,都会使用二分法查找,只适合于小数据量操作,如果在数据量比较大的情况下,那么它的性能将退化。而 HashMap 内部则是数组 + 链表结构,所以在数据量较少的时候,HashMap 的 Entry Array 比 ArrayMap 占用更多的内存。因为使用 Bundle 的场景大多数为小数据量,我没见过在两个 Activity 之间传递 10 个以上数据的场景,所以相比之下,在这种情况下使用 ArrayMap 保存数据,在操作速度和内存占用上都具有优势,因此使用 Bundle 来传递数据,可以保证更快的速度和更少的内存占用。
另外一个原因,则是在 Android 中如果使用 Intent 来携带数据的话,需要数据是基本类型或者是可序列化类型,HashMap 使用 Serializable 进行序列化,而 Bundle 则是使用 Parcelable 进行序列化。而在 Android 平台中,更推荐使用 Parcelable 实现序列化,虽然写法复杂,但是开销更小,所以为了更加快速的进行数据的序列化和反序列化,系统封装了 Bundle 类,方便我们进行数据的传输。
原文:http://tryenough.com/android-…