2011-10-17 27 views
6

Tôi có một file .aidl rằng định nghĩa một parcelable duy nhất của một kiểu giao diện, chúng ta hãy nóiCách xác định có thể chuyển nhượng loại giao diện trong tệp .aidl?

parcelable MyInterface; 

Nhờ đó mà MyInterface là một giao diện java khai báo trong MyInterface.java mở rộng giao diện Parcelable. Cơ chế có thể chuyển nhượng của Android yêu cầu tôi xác định một CREATOR tĩnh trong lớp có thể chuyển nhượng. Nhưng làm thế nào tôi có thể làm điều này cho một giao diện kể từ khi lớp giao diện không biết việc thực hiện cụ thể và therefor không thể thực hiện phương thức createFromParcel()?

Thời gian chạy android quyết định CREATOR (từ phân nhóm nào) để gọi? Thậm chí có thể sử dụng loại giao diện trong tệp .aidl không?

+0

Bạn có giải quyết nó? –

Trả lời

3
  1. về giao diện sử dụng trong tệp AIDL: Tôi không nghĩ có bất kỳ điều gì ngăn bạn làm như vậy. Bởi vì "MyInterface có thể chuyển được;" không thực sự tạo ra bất kỳ thứ gì trong thư mục gen, nó chỉ cần thiết cho chữ ký hàm của bất kỳ giao diện AIDL nào sử dụng kiểu MyInterface này.

  2. CREATOR Bạn phải thêm định nghĩa người sáng tạo cho tất cả các lớp của bạn triển khai android.os.Parcelable.

3

Thực hiện Parcelable qua AIDL

Bước đầu tiên: - Tạo một file .aidl khác nhau sẽ được sử dụng cho định nghĩa class Student (lớp Parcelable).

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

chúng tôi viết thư này vì aidl có thể phát hiện Lớp học sinh.

Bước thứ hai: - bây giờ bạn phải xác định một lớp java với tên sinh viên và triển khai giao diện parcable trong lớp này. giao diện parcable có hai phương thức trừu tượng mà bạn phải thực hiện trong lớp học của bạn.

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

// phương pháp giao diện 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); 

      } 

Trong bất kỳ lớp được thực hiện Parcelable phải cung cấp lĩnh vực CREATOR. Loại CREATOR phải là Parcelable.Creator. Ở đây thay cho T, chúng tôi viết tên của lớp của chúng tôi ví dụ. Sinh viên. CREATOR được sử dụng trong khi UnMarshalling của đối tượng.

Nó có hai phương pháp -

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

để biết thêm: Check Here

0

Tôi chạy vào kịch bản tương tự, và muốn chia sẻ những gì tôi đã làm. Tôi đã theo giao diện chính của aidl có chứa một giao diện bên trong nó.

//ICounterAidlInterface.aidl 

import path.to.aidldirectory.CounterListener 

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

Đừng quên quá trình nhập.

Câu hỏi là cách thể hiện loại mới này: CounterListener.Vì bản thân CounterListener là một giao diện, bạn không cần phải đánh dấu giao diện đó.

Bạn cũng cần tạo một tệp trợ giúp khác cho số CounterListener. Vì vậy, tôi đã tạo ra một tập tin aidl:

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

Hope this helps :)

Các vấn đề liên quan