发表于: 2019-01-02 23:10:48

0 893


今天完成的事情

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



返回列表 返回列表
评论

    分享到