2011-10-17 11 views
6

मैं एक .aidl फ़ाइल को किसी इंटरफ़ेस प्रकार की एक एकल parcelable को परिभाषित करता है है, मान लें कि.aidl फ़ाइल में इंटरफ़ेस प्रकार के पार्सल करने योग्य कैसे परिभाषित करें?

parcelable MyInterface; 

जिससे MyInterface एक जावा इंटरफ़ेस MyInterface.java में घोषणा की कि Parcelable इंटरफेस प्रदान करता है करते हैं। एंड्रॉइड पार्सलेबल तंत्र के लिए मुझे पार्सल योग्य वर्ग में एक स्थिर निर्माता को परिभाषित करने की आवश्यकता है। लेकिन मैं इंटरफ़ेस के लिए ऐसा कैसे कर सकता हूं क्योंकि इंटरफ़ेस क्लास ठोस कार्यान्वयन को नहीं जानता है और इसके लिए createFromParcel() विधि को कार्यान्वित नहीं कर सकता है?

एंड्रॉइड रनटाइम कैसे तय करेगा कि कौन सी CREATOR (किस सबक्लास) से कॉल करने के लिए? क्या एक .aidl फ़ाइल में इंटरफ़ेस प्रकार का उपयोग करना भी असंभव है?

+0

आप इसे का समाधान हो गया मदद करता है: तो, मैं एक और AIDL फ़ाइल बनाई? –

उत्तर

3
  1. AIDL फ़ाइल में आसान इंटरफ़ेस के बारे में

    : मुझे नहीं लगता कि कुछ भी आप को रोकने के ऐसा करने के लिए वहाँ है। क्योंकि "पार्सलबल मायइंटरफेस;" वास्तव में जेन फ़ोल्डर में कुछ भी उत्पन्न नहीं करता है, यह इस MyInterface प्रकार का उपयोग कर किसी भी एआईडीएल इंटरफ़ेस के फ़ंक्शन हस्ताक्षर के लिए आवश्यक है।

  2. CREATOR आपको अपने सभी वर्गों के उपकरणों के लिए निर्माता परिभाषा को जोड़ना होगा android.os.Parcelable।

3

AIDL

से अधिक Parcelable लागू पहला चरण: - कि के लिए छात्र वर्ग (Parcelable वर्ग) को परिभाषित का उपयोग किया जाएगा एक अलग .aidl फ़ाइल बनाएँ।

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

हम इसे लिखते हैं क्योंकि सहायता छात्र वर्ग का पता लगा सकती है।

दूसरा चरण: - अब आपको नाम छात्र के साथ एक जावा क्लास परिभाषित करना होगा और इस कक्षा में पारदर्शी इंटरफ़ेस लागू करना होगा। पारदर्शी इंटरफेस में दो अमूर्त विधि हैं जिन्हें आपको अपने छात्र वर्ग में लागू करना है।

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 का प्रकार पार्ससेल योग्य होना चाहिए। निर्माता। यहां टी के स्थान पर हम अपनी कक्षा का नाम लिखते हैं। छात्र। ऑब्जेक्ट के UnMarshalling के दौरान CREATOR का उपयोग किया जाता है। Check Here

0

मैं समान परिदृश्य में भाग है, और मैं क्या किया साझा करना चाहते थे:

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]; 
       } 
      }; 
अधिक जानकारी के लिए

-

यह दो तरीकों है। मैंने एडीएल मुख्य इंटरफ़ेस का पालन किया था जिसमें इसके अंदर एक और इंटरफ़ेस शामिल था।

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

आशा इस :)

संबंधित मुद्दे