使用Bundle传递基本类型数据和对象(Serializable 和 Parceable 传递对象)

1. Android中Bundle类的作用?


Bundle用于携带数据,类似于 Map集合,用来存放Key-Value键值对,但是它相对于Map,提供了常用类型的 putXxx()和getXxx()方法,比如putString()/getString()、putInt()/getInt(),putXxx()用于往Bundle中放入对象,getXxx()用于从Bundle中取出数据。

2. Bundle可以传递的数据类型


1>:基本类型的数据,如int、String、Float等等;
两个Activity传递:比如从MainActivity传递String类型数据到SecondActivity,代码如下:

MainActivity代码如下:

    public void click(View view){
        Intent intent = new Intent(MainActivity.this , SecondActivity.class) ;
        Bundle bundle = new Bundle() ;
        bundle.putString("data" , "Novate");
        intent.putExtra("bundle" , bundle) ;
        startActivity(intent);
    }

SecondActivity代码如下:

        TextView tv_text = (TextView) findViewById(R.id.tv_text);
        Bundle bundle = getIntent().getBundleExtra("bundle") ;
        String text = bundle.getString("data") ;
        tv_text.setText(text);

2>:在两个Activity中传递对象,分别是Serializable(Java中的)和Parceable(Android中的),使用bundle.putSerializable(Key,Value),bundle.putParceable(Key,Value),但是前提必须要让 JavaBean实体类实现 这两个接口,否则没有作用;

3. 使用Serializable 和 Parceable 传递对象


3.1 Serializable传递对象具体实现

1>: 首先写一个Person,它是一个JavaBean对象,必须实现Serializable接口,然后写一个 serialVersionUID序列Id;
2>:然后定义一个serializableMethod()方法,作用是使用 Serializable传递对象;

    /**
     *   Serializable传递对象的方法
     */
    private void serializableMethod() {
        Person mPerson = new Person() ;
        mPerson.setName("JackChen");
        mPerson.setAge(26);

        Intent intent = new Intent(this , SerializableActivity.class) ;
        Bundle bundle = new Bundle() ;
        bundle.putSerializable(SER_KEY , mPerson);
        intent.putExtras(bundle) ;
        startActivity(intent);
    }

3>:最后直接 在SerializableActivity中去取出 传递过来的数据即可;

/**
 * Email: [email protected]
 * Created by JackChen 2018/4/2 15:48
 * Version 1.0
 * Params:
 * Description:   SerializableActivity 取出传递过来的数据
*/
public class SerializableActivity extends AppCompatActivity {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_serializable);

        TextView test_serializable = (TextView) findViewById(R.id.test_serializable);

        Person person = (Person) getIntent().getSerializableExtra(MainActivity.SER_KEY);
        test_serializable.setText("name -> " + person.getName() + " age -> " + person.getAge());
    }
}
以上是使用 Serializable传递对象的

3.2 Parceable传递对象的具体实现

1>:首先写一个 Police,它是一个JavaBean对象,必须实现Parceable接口,需要重写3个方法
describeContents(): 返回0就行;
writeToParcel():用于将类中的数据写入 外部提供的Parcel中;
Parcelable.Creator接口:变量名必须是CREATOR,可以使用final、static修饰,这个接口有两个方法,分别是:
createFormParcel()、newArray()
2>: 然后定义一个 parcleableMethod()方法,作用是使用 Parcelable传递对象;

    /**
     *  Parceable传递对象的方法
     */
    private void parceableMethod() {
        Police mPolice = new Police() ;
        mPolice.setName("I am JackChen");
        mPolice.setWorkTime(2008);

        Intent intent = new Intent(this , ParceableActivity.class) ;
        Bundle bundle = new Bundle() ;
        bundle.putParcelable(PAR_KEY , mPolice);
        intent.putExtras(bundle) ;
        startActivity(intent);
    }

3>:最后直接在 ParcleableActivity中 取出 传递过来的数据即可;

/**
 * Email: [email protected]
 * Created by JackChen 2018/4/2 15:48
 * Version 1.0
 * Params:
 * Description:   ParceableActivity取出传递过来的数据
*/
public class ParceableActivity extends AppCompatActivity {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_parceable);

        TextView test_parceable = (TextView) findViewById(R.id.test_parceable);
        Police mPolice = (Police)getIntent().getParcelableExtra(MainActivity.PAR_KEY);
        test_parceable.setText("name -> " + mPolice.getName() + "worktime -> " + mPolice.getWorkTime());

    }
}

以上就是使用 Serializable和Parcleable传递对象的具体实现方式

4. Serializable 和 Parceable 二者区别


Serializable:代码少,效率低;
Parcelable: 代码多,效率高;
所以Android开发中应该尽可能的使用Parcleable,效率至上

具体代码已上传至github:
https://github.com/shuai999/SerializableDemo.git

你可能感兴趣的:(使用Bundle传递基本类型数据和对象(Serializable 和 Parceable 传递对象))