• Android-Intent与Bundle在传值上的区别


    Intent与Bundle在activity之间传值的区别

    Intent的putExtra()方法有:

        public Intent putExtra(String name, boolean value);
        public Intent putExtra(String name, byte value);
        public Intent putExtra(String name, char value);
        public Intent putExtra(String name, short value);
        public Intent putExtra(String name, int value);
        public Intent putExtra(String name, long value);
        public Intent putExtra(String name, float value);
        public Intent putExtra(String name, double value);
        public Intent putExtra(String name, String value);
        public Intent putExtra(String name, CharSequence value);
        public Intent putExtra(String name, Parcelable value);
        public Intent putExtra(String name, Parcelable[] value);
        ...


    查看putExtra()方法中的源码,方法里面还是使用了Bundle对象,mExtras变量是在Intent类中定义的;Intent内部还是用bundle来实现数据传递的,只是在外面封装了一层。

        public Intent putExtra(String name, String value) {
            if (mExtras == null) {
                mExtras = new Bundle();
            }
            mExtras.putString(name, value);
            return this;
        }

    Bundle类的作用

      Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值。相对于Map,它提供了各种常用类型的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(),putXxx()用于往Bundle对象放入数据,getXxx()方法用于从Bundle对象里获取数据。

    Bundle的内部实际上是使用了HashMap类型的变量来存放putXxx()方法放入的值。简单地说,Bundle就是一个封装好的包,专门用于导入Intent传值的包。

        public void putBoolean(String key, boolean value);
        public void putByte(String key, byte value);
        public void putChar(String key, char value);
        ...

    Intent在传值时没有Bundle的情况:

    发送数据的Activity

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    editText = (EditText) findViewById(R.id.edit);
    button = (Button) findViewById(R.id.button1);
    String txt = editText.getText().toString();
    button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    String string = editText.getText().toString();
    Intent intent = new Intent(MainActivity.this, main.class);
    intent.putExtra("name", string);
    startActivity(intent);
    }
    });
    }


    接收数据的Activity

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    textView = (TextView) findViewById(R.id.txt2);
    Intent intent = getIntent();
    String string = intent.getStringExtra("name");
    textView.setText(string);
    }


    使用Bundle 进行传值:

    发送数据的Activity

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    editText = (EditText) findViewById(R.id.edit);
    button = (Button) findViewById(R.id.button1);
    String txt = editText.getText().toString();
    button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    String string = editText.getText().toString();
    Intent intent = new Intent(MainActivity.this, main.class);
    Bundle bundle = new Bundle();
    bundle.putString("name", string);
    intent.putExtras(bundle);
    startActivity(intent);
    }
    });
    }


    接收方的Activity

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    textView = (TextView) findViewById(R.id.txt2);
    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    String string = bundle.getString("name");
    textView.setText(string);
    }


    Bundle在存取数据是比较灵活的,而Intent在存取数据的种类很少且没有指定数据类型;

    想对数据进行比较灵活的操作如批量操作的话就用bundle;
    Bundle是可以对对象进行操作的,而Intent不可以。Bundle相对于Intent比较偏下层,比Intent接口更多,更灵活,但Bundle仍需要借助Intent才能在Activity之间传递。

    概括一下,Intent旨在数据传递,bundle旨在存取数据,当然intent也提供一部分数据的存取,但比起bundle就显得很不灵活。

  • 相关阅读:
    落实交通强国,鄂州临空区联手蘑菇车联打造新时代内陆开放高地
    LaTex排版系统:TeX Live+Visual Studio Code的配置
    Makefile
    电脑小技巧45个
    普通人做自媒体视频剪辑会有出路吗?
    C++(QT)画图行车
    Makefile总结
    计算机毕业设计Java设备配件管理和设备检修系统(源码+系统+mysql数据库+lw文档)
    docker学习学记
    信息系统项目管理师必背核心考点(六十三)项目组合管理的主要过程&DIPP分析
  • 原文地址:https://blog.csdn.net/cqn2bd2b/article/details/125556677