首先介绍一下Parcelable接口,它是Android平台内部用于进程间通信(IPC)的一个轻量级序列化框架,相比较于Java自带的Serializable接口,Parcelable接口在性能方面有更好的表现。
一、实现Parcelable接口
要使用Parcelable接口,需要先实现它。具体实现过程如下所示:
1.在实体类中实现Parcelable接口
public class MyEntity implements Parcelable {
private int id;
private String name;
// 构造函数
public MyEntity(int id, String name) {
this.id = id;
this.name = name;
}
// 读取顺序必须和写入顺序相同
protected MyEntity(Parcel in) {
id = in.readInt();
name = in.readString();
}
// 必须实现此方法
public static final Creator<MyEntity> CREATOR = new Creator<MyEntity>() {
@Override
public MyEntity createFromParcel(Parcel in) {
return new MyEntity(in);
}
@Override
public MyEntity[] newArray(int size) {
return new MyEntity[size];
}
};
// 写入顺序必须和读取顺序相同,否则会报错
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(name);
}
// 必须实现此方法,返回0即可
@Override
public int describeContents() {
return 0;
}
// 省略getter和setter方法
}
2.重写读取、写入、创建、描述方法
Parcel对象提供了一组用于读写的方法,需要在实体类中重写以下四个方法:
- readFromParcel(Parcel in):从Parcel对象中读取需要的数据,读取顺序必须和写入顺序相同
- writeToParcel(Parcel dest, int flags):将需要传递的数据写入Parcel对象,写入顺序必须和读取顺序相同
- CREATOR:用于反序列化Parcel对象,创建MyEntity实例的时候调用
- describeContents():返回额外标志位信息,一般设置为0即可
二、将Parcelable对象传递给其他组件
1.传递Parcelable对象
Parcelable对象通常被用于Intent或者Bundle中进行传递:
// 创建Parcelable对象
MyEntity entity = new MyEntity(1, "MyEntity");
// 将Parcelable对象放入Intent中进行传递
Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("entity_key", entity);
startActivity(intent);
2.获取Parcelable对象
在NextActivity中获取Parcelable对象的方法如下所示:
// 获取Parcelable对象,在onCreate方法中调用
MyEntity entity = getIntent().getParcelableExtra("entity_key");
三、代码示例
这里提供两个示例以说明Parcelable接口的使用方法。
- 实现Parcelable接口
假设有如下实体类:
public class MyEntity implements Parcelable {
private int id;
private String name;
public MyEntity(int id, String name) {
this.id = id;
this.name = name;
}
public MyEntity(Parcel in) {
id = in.readInt();
name = in.readString();
}
public static final Creator<MyEntity> CREATOR = new Creator<MyEntity>() {
@Override
public MyEntity createFromParcel(Parcel in) {
return new MyEntity(in);
}
@Override
public MyEntity[] newArray(int size) {
return new MyEntity[size];
}
};
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(name);
}
@Override
public int describeContents() {
return 0;
}
}
- 在Activity中使用Parcelable对象传递数据
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyEntity entity = new MyEntity(1, "MyEntity");
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("parcel_key", entity);
startActivity(intent);
}
});
}
}
- 在SecondActivity中获取Parcelable对象
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
MyEntity entity = getIntent().getParcelableExtra("parcel_key");
Toast.makeText(this, entity.getId() + ", " + entity.getName(), Toast.LENGTH_SHORT).show();
}
}
通过以上两个示例,我们可以直观地感受到Parcelable接口的使用方法,并且更好地理解其具体实现过程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android Parcelable接口使用方法详解 - Python技术站