Aidl預設支援的類型包話java基本類型(int、long、boolean等)和(String、List、Map、CharSequence),如果要傳遞自訂的類型該如何?呢?要傳遞自訂類型,首先要讓自訂類型支援parcelable協議,實現步驟如下:1>自訂類型必須實現Parcelable介面,並且實現Parcelable介面的public void writeToParcel(Parceldest, intflags)方法 。2>自訂類型中必須含有一個名稱為CREATOR的靜態成員,該成員對象要求實現Parcelable.Creator介面及其方法。3> 建立一個aidl檔案聲明你的自訂類型。Parcelable介面的作用:實現了Parcelable介面的執行個體可以將自身的狀態資訊(狀態資訊通常指的是各成員變數的值)寫入Parcel,也可以從Parcel中恢複其狀態。Parcel用來完成資料的序列化傳遞。進程間傳遞自訂類型的實現過程見下方:1> 建立自訂類型,並實現Parcelable介面,使其支援parcelable協議。如:在cn.itcast.domain包下建立Person.java:[java] package cn.itcast.domain; import android.os.Parcel; import android.os.Parcelable; public class Person implements Parcelable private Integer id; private String name; public Person(){} public Person(Integer id, String name) { this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) {//把javanbean中的資料寫到Parcel dest.writeInt(this.id); dest.writeString(this.name); } //添加一個靜態成員,名為CREATOR,該對象實現了Parcelable.Creator介面 public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){ @Override public Person createFromParcel(Parcel source) {//從Parcel中讀取資料,返回person對象 return new Person(source.readInt(), source.readString()); } @Override public Person[] newArray(int size) { return new Person[size]; } }; } 2> 在自訂類型所在包下建立一個aidl檔案對自訂類型進行聲明,檔案的名稱與自訂類型同名。package cn.itcast.domain;parcelable Person;3> 在介面aidl檔案中使用自訂類型,需要使用import顯式匯入,本例在cn.itcast.aidl包下建立IPersonService.aidl檔案,內容如下:package cn.itcast.aidl;import cn.itcast.domain.Person;interface IPersonService { void save(in Person person);}4> 在實現aidl檔案產生的介面(本例是IPersonService),但並非直接實現介面,而是通過繼承介面的Stub來實現(Stub抽象類別內部實現了aidl介面),並且實現介面方法的代碼。內容如下:public class ServiceBinder extendsIPersonService.Stub { @Override public void save(Person person) throwsRemoteException { Log.i("PersonService",person.getId()+"="+ person.getName()); } }5> 建立一個Service(服務),在服務的onBind(Intentintent)方法中返回實現了aidl介面的對象(本例是ServiceBinder)。內容如下:[java] public class PersonService extends Service { private ServiceBinder serviceBinder = new ServiceBinder(); @Override public IBinder onBind(Intent intent) { return serviceBinder; } public class ServiceBinder extends IPersonService.Stub { @Override public void save(Person person) throws RemoteException { Log.i("PersonService", person.getId()+"="+ person.getName()); } } } 其他應用可以通過隱式意圖訪問服務,意圖的動作可以自訂,AndroidManifest.xml配置代碼如下:<serviceandroid:name=".PersonService" > <intent-filter> <actionandroid:name="cn.itcast.process.aidl.PersonService " /> </intent-filter></service>6> 把應用中的aidl檔案和所在package一起拷貝到用戶端應用的src目錄下,eclipse會自動在用戶端應用的gen目錄中為aidl檔案同步產生IPersonService.java介面檔案,接下來再把自訂類型檔案和型別宣告aidl檔案及所在package一起拷貝到用戶端應用的src目錄下。最後就可以在用戶端應用中實現與遠程服務的通訊,代碼如下:[java] public class ClientActivity extends Activity { private IPersonService personService; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.bindService(new Intent("cn.itcast.process.aidl.PersonService"), this.serviceConnection, BIND_AUTO_CREATE);//綁定到服務 } @Override protected void onDestroy() { super.onDestroy(); this.unbindService(serviceConnection);//解除服務 } private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { personService = IPersonService.Stub.asInterface(service); try { personService.save(new Person(56,"liming")); } catch (RemoteException e) { Log.e("ClientActivity", e.toString()); } } @Override public void onServiceDisconnected(ComponentName name) { personService = null; } }; }