我想要类似.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中覆盖它。
谢谢。
最佳答案
编辑:我有名称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;
注意:我可以自由使用大写的类名
Rect
和Sharp
。您也应该这样做。这将使您的生活更轻松,并且代码将更像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调用。