1

我想要 .aidl 中类似下面的内容,并在 android 服务中使用它们。

abstract class sharp implements Parcelable {
}

class rect extends sharp {
}

interface IsharpMgr {
    sharp get();
}

为了做到这一点,Sharp 类必须实现 Parcelable。在 rect 中覆盖 writeToParcel 很容易,但我应该如何添加“public static final Parcelable.Creator”?

在 gen/IsharpMgr.java 中,该创建者是通过 sharp->Creator.createFromParcel 调用的。这是一个静态文件,所以我无法在 rect 中覆盖它。

谢谢。

4

1 回答 1

4

编辑:我有名字sharp并且rect很困惑,所以我交换了它们以避免混淆

您只需像这样实现它:

public static final Parcelable.Creator<Rect> CREATOR
         = new Parcelable.Creator<Rect>() {
     public Rect createFromParcel(Parcel in) {
         return new Rect(in);
     }

     public Rect[] newArray(int size) {
         return new Rect[size];
     }
 };

您没有覆盖中的字段Sharp,因为无法覆盖静态字段。您正在隐藏该字段。这意味着如果有人写道:

Parcelable.Creator<Rect> creator = Rect.CREATOR;

他们得到的对象与有人写的不同:

Parcelable.Creator<Sharp> creator = Sharp.CREATOR;

注意:我冒昧地将您的类名RectSharp. 你也应该这样做。它会让你的生活更轻松,你的代码看起来更像 Java ;-)

编辑:在 OP 的评论之后添加了一些额外的说明

我想我看到了你的问题。您想定义一个传递Sharp对象的接口,但您确实想传递派生Rect对象,并且该对象Sharp在接收端被重新创建为对象。看起来 AIDL 不支持这种继承。但是,你可以做的是这样的(穷人的工厂):

Rect

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(getClass().getName());
    // Write other instance variables
}

Sharp

public static final Parcelable.Creator<Sharp> CREATOR
         = new Parcelable.Creator<Sharp>() {
     public Sharp createFromParcel(Parcel in) {
         String derivedClassName = in.readString();
         if (derivedClassName.equals(Rect.class.getName()) {
             // Create an instance of Rect and return that
             return new Rect(in);
         } else if (derivedClassName.equals(...) {
             // Possible other derived classes
         }
     }

     public Sharp[] newArray(int size) {
         return new Sharp[size];
     }
};

注意构造函数

public Rect(Parcel in)

将使用已从传入的类名 String 中删除的调用Parcel

于 2012-07-24T16:31:15.863 回答