Android在使用Intent打开一个Activity,Service时,发生了进程的切换。如果我们想要将一个自己的对象通过Intent传递给另一个Activity,Service的话,我们就需要用到Parcelable接口。
Parcelable接口的作用是将我们的对象序列化到一个Parcel对象中,Parcel对象中的writeXX()方法是C++实现的,可以将写入的数据写到字节流中。
下面以一个非常简单的demo来展示Parcelable的使用方法:
1. 首先我创建了两个Activity:MainActivity和ShowActivity。MainAcitivity用于创建要传递的对象,并且通过Intent开始ShowActivity。而ShowActivity则包含了一个TextView,用于显示传递过来的对象。
2. 我创建的类叫CA,实现Parcelable接口:
<span style="font-size:18px;">package com.liushenming.parceltest;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by Administrator on 2015/2/10.
*/
public class CA implements Parcelable{
private String A;
private String B;
private int C;
public CA(String a,String b,int c){
A=a;
B=b;
C=c;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(A);
dest.writeString(B);
dest.writeInt(C);
}
public static final Creator<CA> CREATOR= new Creator<CA>() {
@Override
public CA createFromParcel(Parcel source) {
String A_get=source.readString();
String B_get=source.readString();
int C_get=source.readInt();
return (new CA(A_get,B_get,C_get));
}
@Override
public CA[] newArray(int size) {
return new CA[0];
}
};
@Override
public String toString() {
return "CA{" +
"A='" + A + '\'' +
", B='" + B + '\'' +
", C=" + C +
'}';
}
}</span>
其中 public void writeToParcel(Parcel dest, int flags)用于进行将CA对象的每个成员写如Parcel中,而public static final Creator<CA> CREATOR这个静态成员则是Parcelable.Creator<T>接口的匿名实现类的对象,它必须要是public static final 类型并且必须要取名为CREATOR,因为反序列化是要调用该对象的 public T createFromParcel(Parcel source) 方法来还原CA对象。
3. 直接贴一下两个活动的onCreate()方法:
MainActivity:
<span style="font-size:18px;">@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent=new Intent();
intent.setClass(MainActivity.this,ShowActivity.class);
CA ca=new CA("a","b",1);
intent.putExtra("ca",ca);
startActivity(intent);
}</span>
ShowActivity:
<span style="font-size:18px;">TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show);
tv= (TextView) findViewById(R.id.tv_show);
if(getIntent()!=null){
CA ca_get=getIntent().getParcelableExtra("ca");
tv.setText(ca_get.toString());
}
}</span>
4. 程序运行的结果就是,CA对象ca以parcelable的身份传到了ShowActivity中,并且经过CREATOR的 public CA createFromParcel(Parcel source)方法还原成了CA对象并显示在了TextView中: