2011-10-17 11 views
6

Ho un file .aidl che definisce un unico Parcelable di un tipo di interfaccia, diciamoCome definire parcelable del tipo di interfaccia nel file .aidl?

parcelable MyInterface; 

Per cui MyInterface è un'interfaccia Java dichiarata in MyInterface.java che estende l'interfaccia Parcelable. Il meccanismo di androide ordinario richiede che io definisca un CREATORE statico nella classe parcelable. Ma come posso fare questo per un'interfaccia poiché la classe di interfaccia non conosce l'implementazione concreta e quindi non può implementare il metodo createFromParcel()?

In che modo il runtime di Android decide quale CREATOR (da quale sottoclasse) chiamare? È addirittura impossibile utilizzare un tipo di interfaccia in un file .aidl?

+0

Hai risolverlo? –

risposta

3
  1. su interfaccia uso nel file di AIDL: Io non credo che ci sia qualcosa là ti impedisce di farlo. Perché "MyInterface parcelable;" in realtà non genera nulla nella cartella gen, è solo necessario per la firma della funzione di qualsiasi interfaccia AIDL utilizzando questo tipo di MyInterface.

  2. CREATORE È necessario aggiungere la definizione del creatore per tutte le classi implementa android.os.Parcelable.

3

Implementare la Parcelable sopra AIDL

Primo passo: - Creare un file .aidl diverso che verrà utilizzato per definire la classe Student (classe Parcelable).

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

scriviamo questo perché aidl può rilevare classe Student.

Secondo passaggio: - ora è necessario definire una classe java con nome studente e implementare un'interfaccia parcable in questa classe. l'interfaccia parcable ha due metodi astratti che devi implementare nella tua classe di studenti.

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

// metodi parcable interfaccia

  @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); 

      } 

In ogni classe che sta attuando Parcelable devono fornire campo CREATOR. Il tipo di CREATORE deve essere Parcelable.Creator. Qui al posto di T scriviamo il nome della nostra classe es. Alunno. CREATOR viene utilizzato durante UnMarshalling dell'oggetto.

Ha due metodi -

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

per ulteriori informazioni: Check Here

0

mi sono imbattuto in scenario simile, e ha voluto condividere quello che ho fatto. Avevo la seguente interfaccia principale di aidl che contiene un'altra interfaccia al suo interno.

//ICounterAidlInterface.aidl 

import path.to.aidldirectory.CounterListener 

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

Non dimenticare l'importazione.

La domanda è come rappresentare questo nuovo tipo: CounterListener.Dal momento che lo CounterListener è un'interfaccia, non è necessario contrassegnarlo come parcellizzabile.

È necessario creare un altro file di aiuto per lo CounterListener. Così, ho creato un altro file AIDL:

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

Spero che questo aiuti :)

Problemi correlati