14.1.3. 实现一个Parcel

优质
小牛编辑
135浏览
2023-12-01

14.1.3.实现一个Parcel

进程间传递的Message也是个Java对象,在传递与接收之间我们需要额外进行编码/解码——也就是序列化/反序列化。在Android中,可以序列化/反序列化的对象就被称作Parcel,作为Parcelable接口的实例。

作为Parcel,对象必须知道如何处理自身的编码/解码。

例 14.4. Message.java

package com.marakana.logservice;

import android.os.Parcel;

import android.os.Parcelable;

public class Message implements Parcelable { //

private String tag;

private String text;

public Message(Parcel in) { //

tag = in.readString();

text = in.readString();

}

public void writeToParcel(Parcel out, int flags) { //

out.writeString(tag);

out.writeString(text);

}

public int describeContents() { //

return 0;

}

public static final Parcelable.Creator<Message> CREATOR = new Parcelable.Creator<Message>() { //

public Message createFromParcel(Parcel source) {

return new Message(source);

}

public Message[] newArray(int size) {

return new Message[size];

}

};

// Setters and Getters

public String getTag() {

return tag;

}

public void setTag(String tag) {

this.tag = tag;

}

public String getText() {

return text;

}

public void setText(String text) {

this.text = text;

}

}

  1. 如前所说,Message类需实现Parcelable接口。
  2. 作为Parcelable接口的实现,类中必须相应地提供一个构造函数,使之可以根据Parcel重新构造原先的对象。在这里,我们将Parcel中的数据存入局部变量,注意其中的顺序很重要,必须与写入时的顺序保持一致。
  3. writeToParcel()方法对应于构造函数。它读取对象当前的状态,并写入Parcel。同上,变量的写入顺序必须与前面读取的顺序保持一致。
  4. 此方法留空。因为这个Parcel中没有别的特殊对象。
  5. 每个Parcelable对象必须提供一个Creator。这个Creator用于依据Parcel重新构造原先的对象,在此仅仅调用其它方法。
  6. 一些私有数据的getter/setter方法。

至此服务端的Java部分已告一段落,接下来将Service注册到Manifest文件。