歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android的AIDL實現進程間通信

Android的AIDL實現進程間通信

日期:2017/3/1 11:02:24   编辑:Linux編程

Android系統使用AIDL(Androidinterface description language )實現進程間的通信,例如一個服務端應用程序和一個客戶端運用程序之間進行通信,服務端采用service組件提供後台服務,客戶端則可用Activity一些組件供用戶進行操作。使用AIDL的步驟:

1. 分別創建客戶端和服務端項目,

注意包名不能相同

2. 在Server項目中,刪除Activity類和清單中的配置

3. 在Server項目中,創建類,繼承Service,

覆寫綁定方式的生命周期方法

4. 創建一個aidl接口,以小寫aidl為擴展名

在接口中定義回調方法,該方法可供客戶端訪問,實現客戶端對服務端的操作。

注意:1. aidl文件中不能出現訪問限定符

2. aidl文件在兩個項目中要完全一致

3. aidl文件的語法類似於Interface

5. 把aidl文件復制到客戶端項目,注意包名要一致

6. 在Service中,創建一個類,繼承aidl生成接口的Stub類,同時實現其抽象方法。

例如: class MyBinderextends IMyService.Stub

7. 在服務的清單文件中,配置Service的Action

例如:

<service android:name="AIDLService">

<intent-filter >

<action android:name="com.action.ACTION_AIDL"/>

</intent-filter>

</service>

8.. 在Service中的onCreate()方法中

創建Binder的實例,並在onBind()

方法中返回該實例

例如:

@Override

public void onCreate() {

super.onCreate();

mBinder= new MyBinder();

Log.d("AIDL","Server:onCreate()");

}

@Override

public IBinder onBind(Intentintent) {

Log.d("AIDL","Server:onBind()");

returnmBinder;

}

9.. 客戶端的布局main.xml文件中增加按鈕,分別設置監聽事件。

並在代碼中注冊按鈕的監聽事件

10. 在onserviceConnected()方法中得到aidl接口實例

的方法是: IMyService binder =IMyService.Stub.asInterface(service);

注意onServiceConnection方法參數中的Ibinder不是IMyService.Stub類型,不能直接向上轉型,只能使用方法IMyService.Stub.asInterface(service)獲得一個實現了IMyService接口的類型對象,其類型為IMyService.Stub.Proxy。

11. 通過binder調用接口中定義的方法來實現對遠程服務的控制

AIDL只支持基本數據類型,以及String,List Map ,接口中定義的方法可帶參數,同時可返回結果,非基本數據類型定義方法,包括in,out,inout ,in 指客戶端輸入,out指服務端輸出,對於基本數據類型默認為in。除了這些數據類型,如果想使用自己定義的類型,必須得實現Parcelable接口,同時創建一個相同名稱以aidl為擴展的文件,例如自定義Person類型,得有兩個文件:Person.java ,Person.aidl

假設包名為com.aidl,則Person.aidl的代碼:

packagecom.aidl;

parcelablePerson;

Person.java文件中該類得實現Parcelable接口例如代碼為:

packagecom.aidl;

importandroid.os.Parcel;

importandroid.os.Parcelable;

publicclass Person implements Parcelable{

private int age;

private String name;

public Person(){

}

private Person(Parcel in){

readFromParcel(in);

}

public void readFromParcel(Parcel in){

age = in.readInt();

name = in.readString();

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public int describeContents() {

// TODO Auto-generated methodstub

return 0;

}

@Override

public void writeToParcel(Parcel out,int flags) {

// TODO Auto-generated methodstub

out.writeInt(age);

out.writeString(name);

}

public static finalParcelable.Creator<Person> CREATOR = new

Creator<Person>(){

public Person[] newArray(intsize) {

return newPerson[size];

}

public PersoncreateFromParcel(Parcel in) {

return newPerson(in);

}

};

}

類中得有一個Parcelable.Creator類型的靜態常量CREATOR。

在接口在要使用自定義的類型得使用import導入,例如定義一個IMyService.aidl文件:

package com.aidl;

import com.aidl.Person;

interface IMyService {

Stringcallback(in List<String> list, inString s ,in Person person);

}

最後將該包下的文件連同包名拷到客戶端程序,實現進程間的通信。

Copyright © Linux教程網 All Rights Reserved