Android中Parcelable的作用实例解析
在android提供了一种类型:Parcel。被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。除了基本类型以外,只有实现了Parcelable接口的类才能被放入Parcel中。
Parcelable实现要点:需要实现三个东西
1)writeToParcel方法。该方法将类的数据写入外部提供的Parcel中.声明如下:
writeToParcel(Parceldest,intflags)具体参数含义见javadoc
2)describeContents方法。没搞懂有什么用,反正直接返回0也可以
3)静态的Parcelable.Creator接口。本接口有两个方法:
createFromParcel(Parcelin)实现从in中创建出类的实例的功能
newArray(intsize)创建一个类型为T,长度为size的数组,仅一句话(returnnewT[size])即可。估计本方法是供外部类反序列化本类数组使用。
测试用的接收信息Activity:
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.os.Parcelable;
publicclassTestextendsActivity{
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intenti=getIntent();
Personp=i.getParcelableExtra("yes");
System.out.println("---->"+p.name);
System.out.println("---->"+p.map.size());
}
}
发送的Activity:
importjava.util.HashMap;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
publicclassTestNewextendsActivity{
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intentintent=newIntent();
Personp=newPerson();
p.map=newHashMap<String,String>();
p.map.put("yes","ido");
p.name="ok";
intent.putExtra("yes",p);
intent.setClass(this,Test.class);
startActivity(intent);
}
}
Parcelable的实现类:
importjava.util.HashMap;
importandroid.os.Parcel;
importandroid.os.Parcelable;
publicclassPersonimplementsParcelable{
publicHashMap<String,String>map=newHashMap<String,String>();
publicStringname;
@Override
publicintdescribeContents(){
return0;
}
@Override
publicvoidwriteToParcel(Parceldest,intflags){
dest.writeMap(map);
dest.writeString(name);
}
publicstaticfinalParcelable.Creator<Person>CREATOR=newParcelable.Creator<Person>(){
//重写Creator
@Override
publicPersoncreateFromParcel(Parcelsource){
Personp=newPerson();
p.map=source.readHashMap(HashMap.class.getClassLoader());
p.name=source.readString();
returnp;
}
@Override
publicPerson[]newArray(intsize){
//TODOAuto-generatedmethodstub
returnnull;
}
};
}