zoukankan      html  css  js  c++  java
  • Android Bundle

    #Bundle类介绍

    Bundle主要用于传递数据;它保存的数据,是以key-value(键值对)的形式存在的。

    我们经常使用Bundle在Activity之间传递数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。当Bundle传递的是对象或对象数组时,必须实现Serializable 或Parcelable接口。下面分别介绍Activity之间如何传递基本类型、传递对象。

    相对于Map,它提供了各种常用类型的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(),putXxx()用于往Bundle对象放入数据,getXxx()方法用于从Bundle对象里获取数据。Bundle的内部实际上是使用了HashMap类型的变量来存放putXxx()方法放入的值:

    #使用方法

    使用Bundle在两个Activity中传递数据

    //数据写入Intent
    Intent openWelcomeActivityIntent=new Intent();
    Bundle myBundelForName=new Bundle();
    myBundelForName.putString("Key_Name",inName.getText().toString());
    myBundelForName.putString("Key_Age",inAge.getText().toString());
    openWelcomeActivityIntent.putExtras(myBundelForName);
    openWelcomeActivityIntent.setClass(AndroidBundel.this, Welcome.class);
    startActivity(openWelcomeActivityIntent);
    
    
    
    //从Intent 中获取数据
    Bundle myBundelForGetName=this.getIntent().getExtras();
    String name=myBundelForGetName.getString("Key_Name");
    myTextView_showName.setText("欢迎您进入:"+name);

    #与Intent对比

    两个Activity之间传递数据,数据的附加有两种方式:
    一种是直接 intent.putxx();
    另一种是  先bundle.putxx(), 然后再调用public Intent putExtras (Bundle extras)  添加bundle.

    其实两种的本质是一样的。

    Intent的方法:
    [java] view plaincopy
    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); 
    ... 

    intent内部定义了很多put方法,功能都是把key-value存进来。具体put函数的内部实现:
    [java] view plaincopy
    public Intent putExtra(String name, boolean value) { 
        if (mExtras == null) { 
            mExtras = new Bundle(); 
        } 
        mExtras.putBoolean(name, value); 
        return this; 

    其中mExtras是intent内部定义的一个private Bundle变量。
    可以看到,intent其实是调用了bundle相应的put函数,也就是说,intent内部还是用bundle来实现数据传递的,只是封装了一层而已。

    再来说Bundle:
    [java] view plaincopy
    public void putBoolean(String key, boolean value); 
    public void putByte(String key, byte value); 
    public void putChar(String key, char value); 
     
    ... 
    再来看用法:
    只用intent:类型什么的是不需要你来操心的,你只需要putExtra就好了,内部会都存在一个bundle对象中。key-value对是一个一个被加进去的。
    用intent和bundle:key-value对先被一个个的加到bundle里面,再把这个bundle put到intent中,其中用了下面这个函数:
    [java] view plaincopy
    public Intent putExtras(Bundle extras) { 
        if (mExtras == null) { 
            mExtras = new Bundle(); 
        } 
        mExtras.putAll(extras); 
        return this; 

    可以看到,其实是把之前那个bundle中的数据批量添加到intent内部的bundle中。
    取数据的时候,可以一个个的取出来(这个不赘述了),也可以把数据打包一起取出来:
    [java] view plaincopy
    public Bundle getExtras() { 
        return (mExtras != null) 
                ? new Bundle(mExtras) 
                : null; 

    这个函数是把当前intent中所有的数据一起打包的(假如说你既用了bundle也用了intent本身的put函数来加数据,最后用get函数返回的是bundle+其他数据一起的)。

    两者的区别是什么,如果你想对数据进行比较灵活的操作(批量操作什么的)的话就用bundle吧,当然你也可以getIntent()之后直接添加数据然后把这个intent发送出去。
    还有就是,Bundle是可以对对象进行操作的,而Intent不可以。Bundle相对于Intent比较偏下层,比Intent接口更多,更灵活,但Bundle仍需要借助Intent才能在Activity之间传递。
    概括一下,Intent旨在数据传递,bundle旨在存取数据,当然intent也提供一部分数据的存取,但比起bundle就显得不专业,不灵活的多

  • 相关阅读:
    SpringBoot EnumValidator验证器实现
    【原创】SpringCloud:基于Spring Cloud netflix全家桶搭建一个完整的微服务架构系统
    Hystrix Dashboard监控报“Unable to connect to Command Metric Stream”?
    Mysql sql_mode的合理设置
    nginx 调优
    函数指针
    进程与线程
    大小端学习
    联合体和结构体
    内存分配
  • 原文地址:https://www.cnblogs.com/bincoding/p/5255263.html
Copyright © 2011-2022 走看看