Как определить parcelable типа интерфейса в файле.aidl?

У меня есть файл.aidl, который определяет один пакет типа интерфейса, скажем,

parcelable MyInterface;

При этом MyInterface - это интерфейс Java, объявленный в MyInterface.java, который расширяет интерфейс Parcelable. Механизм parcelable для Android требует, чтобы я определил статический CREATOR в классе parcelable. Но как я могу сделать это для интерфейса, так как интерфейсный класс не знает конкретной реализации и поэтому не может реализовать метод createFromParcel()?

Как среда выполнения Android решит, какой CREATOR (из какого подкласса) вызывать? Возможно ли вообще использовать тип интерфейса в файле.aidl?

3 ответа

Реализуйте Parcelable через AIDL

Первый шаг:- Создайте другой файл.aidl, который будет использоваться для определения класса Student (класс Parcelable).

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

мы пишем это, потому что aidl может обнаружить студенческий класс.

Второй шаг:- теперь вы должны определить класс Java с именем student и реализовать интерфейс 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 мы пишем название нашего класса, например. Ученик. CREATOR используется во время UnMarshalling объекта.

У него есть два метода -

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];
                 }
            };

для получения дополнительной информации: проверьте здесь

  1. об использовании интерфейса в файле AIDL: я не думаю, что что-то мешает вам сделать это. Потому что "parcelable MyInterface;" фактически ничего не генерирует в папке gen, это просто необходимо для подписи функции любого интерфейса AIDL, использующего этот тип MyInterface.

  2. СОЗДАТЕЛЬ Вы должны добавить определение создателя для всех ваших классов реализует android.os.Parcelable.

Я столкнулся с подобным сценарием и хотел поделиться тем, что я сделал. У меня был следующий основной интерфейс aidl, который содержит внутри другой интерфейс.

//ICounterAidlInterface.aidl

import path.to.aidldirectory.CounterListener

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

Не забывайте импорт.

Вопрос в том, как представить этот новый тип: CounterListener, поскольку CounterListener сам по себе интерфейс, вам не нужно помечать его как подлежащий продаже.

Вам нужно создать еще один файл помощи для CounterListener тоже. Итак, я создал еще один файл помощи:

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

Надеюсь это поможет:)

Другие вопросы по тегам