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

abstract class sharp implements Parcelable {
}

class rect extends sharp {
}

interface IsharpMgr {
    sharp get();
}


为此,Sharp类必须实现Parcelable。在rect中覆盖writeToParcel很容易,但是我应该在Sharp中添加“ public static final Parcelable.Creator”吗?

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

谢谢。

最佳答案

编辑:我有名称sharprect混淆,所以我交换了它们以避免混淆

您只需像这样实现它:

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)


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

10-08 03:43