发表于: 2019-01-02 23:10:48
0 894
今天完成的事情
Intent传递对象的两种方法
传递对象需要先将对象序列化,Android为intent提供了两种传递对象参数类型的方法,分别需要使实体类实现Serializable接口、Parcelable接口。
实现序列化的目的是:
(1)保存对象的字节序列到本地文件
(2)在网络和进程间传递对象
Serializable接口和Parcelable接口的区别
(1)Parcelable不能使用将数据存储在磁盘上,因为Parcelable在外界有变化的情况下不能很好的保存数据的持续性。因此在这种情况下,建议使用Serializable
(2)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable类。并且Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
使用
(1)Serializable
Serializable接口的使用比较简单,只需让对象实现这个接口即可,而接口本身并没有要实现的方法。
比如有一个Student类
public class City implements Serializable {}
传递数据时
intent.putExtra("key", student);
接收数据
Student student = (Student) getIntent.getSerializableExtra("key");
(2)Parcelable
Parcelable的使用稍复杂一些,需要实现接口的两个方法
@Override
public int describeContents() {
return 0;
}
// 将对象的需要传递的属性 以 Parcel parcel.writXxx的形式写出,具体看属性的类型
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeString(sex);
arcel.writeInt(age);
}
添加一个常量CREATOR(名字大小必须固定),该常量必须实现Parcelable的内部接口:Parcelable.Creator,并实现该接口中的两个方法
public static final Parcelable.Creator<Student> CREATOR = new Creator<Student>() {
@Override
public Student createFromParcel(Parcel source) {
Student student = new Student();
student.name = source.readString();
student.sex = source.readString();
student.age = source.readInt();
return student;
}
@Override
public Student[] newArray(int size) {
return new Student[size];
}
};
传递数据和接收数据的过程同Serializable
遇到的问题
关于VersiconCode
获取versionCode的方法一般为
try {
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);
if (pi != null) {
int versionCode = pi.versionCode;
}} catch (PackageManager.NameNotFoundException e)
//......
}
但在android 8.0中,这种方法被标记为过时了(虽然还能用)
官方推荐使用getLongVersionCode
这个方法我不太明白它的返回值究竟是什么,以及versionCodeMajor是什么?
收获
Serializable和Parcelable
评论