Как определить 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];
}
};
для получения дополнительной информации: проверьте здесь
об использовании интерфейса в файле AIDL: я не думаю, что что-то мешает вам сделать это. Потому что "parcelable MyInterface;" фактически ничего не генерирует в папке gen, это просто необходимо для подписи функции любого интерфейса AIDL, использующего этот тип MyInterface.
СОЗДАТЕЛЬ Вы должны добавить определение создателя для всех ваших классов реализует 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);
}
Надеюсь это поможет:)