Как определить parcelable типа интерфейса в файле .aidl? - PullRequest
6 голосов
/ 17 октября 2011

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

parcelable MyInterface;

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

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

Ответы [ 3 ]

4 голосов
/ 18 июня 2014

Реализация Parcelable через AIDL

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

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

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

Второй шаг: - теперь вам нужно определить класс 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];
                 }
            };

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

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

  2. CREATOR Вы должны добавить определение создателя для всех ваших классов, реализующих android.os.Parcelable.

0 голосов
/ 15 января 2017

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

//ICounterAidlInterface.aidl

import path.to.aidldirectory.CounterListener

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

Не забудьте импортировать.

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

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

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

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

...