如何在.aidl文件中定义接口类型的parcelable?

时间:2011-10-17 09:47:43

标签: android parcelable aidl parcel

我有一个.aidl文件,它定义了一个接口类型的单个parcelable,比方说

parcelable MyInterface;

其中MyInterface是在MyInterface.java中声明的Java接口,它扩展了Parcelable接口。 android parcelable机制要求我在parcelable类中定义一个静态CREATOR。但是,如何为接口执行此操作,因为接口类不知道具体实现,因此无法实现createFromParcel()方法?

android运行时将如何决定调用哪个CREATOR(来自哪个子类)?甚至不可能在.aidl文件中使用接口类型?

3 个答案:

答案 0 :(得分:4)

在AIDL上实施Parcelable

第一步: - 创建一个不同的.aidl文件,用于定义Student类(Parcelable类)。

       (Student.aidl)
         package com.aidl; 
         parcelable Student;

我们写这个是因为aidl可以检测到Student class。

第二步: - 现在你必须定义一个名为student的java类,并在这个类中实现parcable接口。 parcable接口有两个抽象方法,你必须在你的学生班中实现。

    import android.os.Parcel;
    import android.os.Parcelable;
    public class Student implements Parcelable {
            public String name;
            public String father_name;
            public Student(Parcel source)
            {
                            name = source.readString();
                            father_name = source.readString();
            }
            public Student()
            {}
            public void setName(String name)
            {
                            this.name = name;
            }
            public void setFatherName(String father_name)
            {
                            this.father_name = father_name;
            }

// parcable接口的方法

            @Override
            public int describeContents() {
                            // TODO Auto-generated method stub
                            return 0;
            }
            @Override
            public void writeToParcel(Parcel dest, int flags) {
                            // TODO Auto-generated method stub
                            dest.writeString(name);
                            dest.writeString(father_name);

            }

在实现Parcelable的任何类中都必须提供CREATOR字段。 CREATOR的类型必须是Parcelable.Creator。在这里代替T,我们写了我们班的名字,例如。学生。在对象的UnMarshalling期间使用CREATOR。

它有两种方法 -

1-T createFromParcel(Parcel parcel) :This method is called when UnMarshalling happen 
  during receiving the data. Keep care that  we receive the data member in same sequence
  as we write in writeToPacel(). Here we create a  constructor in which we demarshalling
  the data.
2-NewArray(int size) : Here we just create an array of given size and return.


public static final Parcelable.Creator<Student> CREATOR = new Parcelable.Creator<Student>() {
               @Override
               public Student createFromParcel(Parcel source) {
                                            // TODO Auto-generated method stub
                                            return new Student(source);
                }
                @Override
                public Student[] newArray(int size) {
                                            // TODO Auto-generated method stub
                                            return new Student[size];
                 }
            };

了解更多信息:Check Here

答案 1 :(得分:3)

  1. 关于AIDL文件中的使用界面: 我认为没有什么能阻止你这样做。因为“parcelable MyInterface”;实际上并没有在gen文件夹中生成任何内容,只需要使用此MyInterface类型的任何AIDL接口的函数签名。

  2. CREATOR 您必须为所有类添加创建者定义,实现android.os.Parcelable。

答案 2 :(得分:0)

我遇到了类似的情况,想分享我的所作所为。我有以下aidl主界面,其中包含另一个界面。

//ICounterAidlInterface.aidl

import path.to.aidldirectory.CounterListener

interface ICounterAidlInterface {
    int getCounter();
    void setCounterListener(CounterListener listener); 
}

别忘了导入。

问题是如何表示这种新类型:CounterListener。由于CounterListener本身就是一个界面,因此您无需将其标记为可分割。

您还需要为CounterListener创建另一个aidl文件。所以,我创建了另一个aidl文件:

//CounterListener.aidl
interface CounterListener{
    void newData(int data);
}

希望这会有所帮助:)