2012-07-24 27 views
1

我想在.aidl中使用下面的東西,並在android服務中使用它們。aidl中的可傳遞繼承

abstract class sharp implements Parcelable { 
} 

class rect extends sharp { 
} 

interface IsharpMgr { 
    sharp get(); 
} 

爲了做到這一點,尖銳的類必須實現Parcelable。 rect重寫writeToParcel很容易,但我應該如何在sharp中添加「public static final Parcelable.Creator」?

in gen/IsharpMgr.java,創建者通過sharp-> Creator.createFromParcel調用。這是一個靜態字段,所以我不能直接覆蓋它。

謝謝。

+0

是否允許使用Serializable而不是Parcelable?可序列化非常容易實現。 – mtmurdock 2012-07-24 15:30:31

回答

2

編輯:我有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) 

將被調用類名字符串已經從公司刪除oming Parcel

+0

但是,當我在AIDL文件中使用它時,它將生成如下代碼:if((0!= _ reply.readInt())){ _result = TuningServiceParameters.CREATOR.createFromParcel(_reply); } – 2012-07-25 02:27:08

+0

public sharp get()throws android.os。RemoteException { android.os.Parcel _data = android.os.Parcel.obtain(); android.os.Parcel _reply = android.os.Parcel.obtain(); sharp _result; try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_get,_data,_reply,0); _reply.readException(); ((0!= _ reply.readInt())){ _result = sharp.CREATOR.createFromParcel(_reply); } else { _result = null; } } finally { _reply.recycle(); _data.recycle(); } return _result; } – 2012-07-25 02:53:20

+0

我編輯並擴展了我的答案。看一看。 – 2012-07-25 10:04:25