我有一个带有许多常见对象的外部Java库(即具有名称,姓氏,地址的用户......)。我想要构建的是一个(de)序列化器类,它将我的所有对象转换为Parcelable对象以与Intent一起发送。问题是Android的意图不支持putExtra(String,Parcel)或类似的东西。你有没有想过如何克服这个不方便? 实际上我把我的所有实例都放在Application类中,但我认为这是一个肮脏的方法......更干净的一个?
答案 0 :(得分:2)
您可以使用Intent的putExtras(Bundle extras)方法,并在类方法exportToBundle()
中实现,该方法返回Bundle此对象的值。如果您不想在类中创建任何其他方法,则可以使用静态方法创建另一个实用程序类,该方法将类的对象转换为Bundle。如果您的课程为Parcelable
,则可以使用putParcelable(String key, Parcelable value)
方法将其直接放入Bundle。
答案 1 :(得分:0)
您可以直接将Parcelable类放入intent中,以便支持您正在寻找的内容。这里有一个警告,我认为你已经通过提及序列化/反序列化已经有了这个概念。您正在发送该类的副本,该副本将由处理意图的类重建。 The official android example is weak because only one integer is sent and we can do that already.
传递类的示例意图
Intent intent = new Intent(context, TheClassImCalling.class);
// use a constant that's public or an R string so both the sender
// and receiver are working on the same class
// the class you are sending goes into the putExtra method statement.
intent.putExtra(ImageTextListViewActivity.EXTRA_KMLSUMMARY,
mKmlSummary);
startActivity(intent);
使用您用来发送它的相同常量,使用类似的语句从类中拉出副本。
KMLSummary mkmlSummary = intent.getExtras().getParcelable(
ImageTextListViewActivity.EXTRA_KMLSUMMARY);
以下是必须实施的方法
public class KmlSummary implements Parcelable {
//使用Parcel作为参数的构造函数。 //您以相同的顺序读取和写入值。
public KmlSummary(Parcel in) {
this._id = in.readInt();
this._description = in.readString();
this._name = in.readString();
this.set_bounds(in.readDouble(), in.readDouble(), in.readDouble(),
in.readDouble());
this._resrawid = in.readInt();
this._resdrawableid = in.readInt();
this._pathstring = in.readString();
String s = in.readString();
this.set_isThumbCreated(Boolean.parseBoolean(s));
}
// Overridden methods for the Parseable interface.
@Override
public void writeToParcel(Parcel arg0, int arg1) {
arg0.writeInt(this._id);
arg0.writeString(this._description);
arg0.writeString(this._name);
arg0.writeDouble(this.get_bounds().southwest.latitude);
arg0.writeDouble(this.get_bounds().southwest.longitude);
arg0.writeDouble(this.get_bounds().northeast.latitude);
arg0.writeDouble(this.get_bounds().northeast.longitude);
arg0.writeInt(this._resrawid);
arg0.writeInt(this._resdrawableid);
arg0.writeString(this.get_pathstring());
String s = Boolean.toString(this.isThumbCreated());
arg0.writeString(s);
}
@Override
public int describeContents() {
//
return 0;
}
// Some glue to tell the OS how to create the class from the parcel
@SuppressWarnings("rawtypes")
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public KmlSummary createFromParcel(Parcel in) {
return new KmlSummary(in);
}
public KmlSummary[] newArray(int size) {
return new KmlSummary[size];
}
};
}
这就是你可以将类序列化为一个intent并从intent中反序列化该类。
祝你好运 Danny117