Intent 和 Bundle 传值的区别
文章目录
- 1、使用上
- 1.1 Intent 方式
- 1.2 Bundle 方式
- 2、为什么 Bundle 使用 ArrayMap 而不是 Hashmap 实现呢?
1、使用上
1.1 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);// 发送
Intent intent=new Intent(BActivity.this,CActivity.class);
intent.putExtra("String1",string);
intent.putExtra("int1",key);
intent.putExtra("boolean",true);
startActivity(intent);
- 在 B 页面需要将数据一条条取出来,再一条条发送给 C
1.2 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");// 发送
Intent intent=new Intent(BActivity.this,CActivity.class);
//可以传给CActivity额外的值
bundle.putBoolean("boolean",true);
intent.putExtra("bundle1",bundle);
startActivity(intent);
- 可以直接对 Bundle 进行操作。但是 Bundle 需要借助 Intent 完成数据触动你
- ++Bundle 旨在存储数据,Intent 旨在传值++
2、为什么 Bundle 使用 ArrayMap 而不是 Hashmap 实现呢?
-
Bundle 内部由
ArrayMap
实现。ArrayMap 底层是两个数组,一个 Int 数组存储 key 对应的 hash 值,另一个数组存储 key 和 value,key 在index*2
位置,value 在index*2+1
位置。每次插入时,根据 key 的 hash 值,利用二分查找,去寻找 key 在 Int 数组中的下标位置 index,如果出现了 hash 冲突,从目标点向两头遍历,直到找到正确的 index。二份查找法只适合小数据量操作,如果数据量比较大,性能将退化。而 Bundle 的场景大多数为小数据量,故使用 ArrayMap 更合适。 -
其次,HashMap 使用
Serializable
进行系列化,Bundle 使用Parcelable
进行系列化。在 Android 平台,更推荐使用 Parcelable 实现序列化,开销更小,能更快的进行书序的序列化和反序列化。 -
相关文章:
ArrayMap 源码解析
HashMap 源码解析
Serializable 和 Parcelable