Android细节问题 —— 有了Intent,为什么还要有Bundle?

96
FeelsChaotic
0.4 2017.03.08 17:53* 字数 348

Intent本身就可以传递参数(Intent.putExtra("key", value))为何还要用Bundle呢?

两者比较

  1. Bundle只是一个信息的载体,内部其实就是维护了一个Map<String,Object>。
  2. Intent负责Activity之间的交互,内部是持有一个Bundle的。
  • putExtra()方法的源码
public Intent putExtra(String name, boolean value) {
        if (mExtras == null) {
            mExtras = new Bundle();
        }
        mExtras.putBoolean(name, value);
        return this;
    }
  • putExtras(Bundle bundle):会将Intent的内部Bundle替换成参数bundle。

应用场景

  • 例1:
    从A界面跳转到B界面或者C界面
    这样的话 我就需要写2个Intent 如果你还要涉及的传值的话 你的Intent就要写两遍添加值的方法。那么,如果我用1个Bundle,直接先存值,然后再存到Intent中 不就更简洁吗?

  • 例2:
    现在要把值通过Activity A经过Activity B传给Activity C。

如果用Intent的话,A-B先写一遍,再在B中都取出来 然后在把值塞到Intent中,再跳到C。
如果在A中用了 Bundle 的话,把Bundle传给B,在B中再转传到C,C就可以直接去取了。

bundle使用场景

  • 在设备旋转时保存数据
 // 自定义View旋转时保存数据
public class CustomView extends View {
    @Override
    protected Parcelable onSaveInstanceState() {
        super.onSaveInstanceState();
        Bundle bundle = new Bundle();
        bundle.put...
        return bundle;
    }
  // Activity旋转时保存数据
public class CustomActivity extends Activity {
  
    @Override
    protected void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        savedInstanceState.put...
    }
  • Fragment之间传递数据
    比如,某个Fragment中点击按钮弹出一个DialogFragment。
    最便捷的方式就是通过Fragment.setArguments(args)传递参数。

所以,Bundle是不可替代的。

Android进阶之路