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: 2185134304@qq.com
* 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<Police>接口:变量名必须是CREATOR,可以使用final、static修饰,这个接口有两个方法,分别是:
createFormParcel()、newArray()
2>: 然后定义一个 parcleableMethod()方法,作用是使用 Parcelable传递对象;
3>:最后直接在 ParcleableActivity中 取出 传递过来的数据即可;
/**
* Email: 2185134304@qq.com
* 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,效率至上。