我有一个日历对象,其中用户手动存储了一些日期和时间。我希望在下一个活动中可以使用这个对象。
我该怎么做?使用Parcelable的putextra方法存在差异。
日历(Calendar)没有实现Parcelable。
但是它似乎实现了Serializable接口,因此您可以将其序列化为一个字符串并将其作为Extra传递到其他活动中去。
另一种选择是使用cal.getTimeInMillis()
,它会给你一个long
类型的值,你可以将其添加为Intent的Extra。然后在另一个活动中提取它,并创建一个新的Calendar对象,立即调用setTimeInMillis()
方法,这样它就会被设置为与旧活动中的Calendar对象相同的时间。
cal.getTimeInMillis()只是部分正确的。仅使用getTimeInMillis()会导致失去时区信息。因此,当读取该值时,UTC中的日历变量将被转换为本地时区,可能会更改实际日期。
我不知道是否有完美的答案,但我保存了以毫秒为单位的时间和时区ID,这样我就可以在另一端完全重建日历对象。
public void writeToParcel(Parcel out, int flags) {
out.writeLong(mycal.getTimeInMillis());
out.writeString(mycal.getTimeZone().getID());
}
private MyClassObject(Parcel in) {
long milliseconds = in.readLong();
String timezone_id = in.readString();
mycal = new GregorianCalendar(TimeZone.getTimeZone(timezone_id));
mycal.setTimeInMillis(milliseconds);
}
out.writeSerializable(); 是一种选择,但是我读到它执行缓慢且表现不佳,所以我选择避免使用它。