Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android-使用AIDL進程間通信

Android-使用AIDL進程間通信

編輯:關於Android編程

對於客戶端和服務之間通信,雖然可以通過Ibinder實現,但需要共享業務實現,如果在進程間通信的haunted,需要使用AIDL(Android Interface Definition Language)進行。

 

AIDL是一種接口定義語言,用於約束兩個進程間的通訊規則,編譯器生成代碼,實現Android設備上的兩個進程間通信(IPC),AIDL的IPC機制和EJB所采用的CORBA很類似,進程之間的通信信息,首先會被轉換成AIDL協議消息,然後發送給對方,對方收到AIDL協議消息後在轉換成相應的對象。由於進程之間的通信信息需要雙向轉換,所以android采用代理類背後實現了信息的雙向轉換,代理類由android編譯器生成,對開發人員來說是透明的。

 

使用方式如下:

1、  定義AIDL(同接口相似,但沒有可見性,擴展名有.java—>.aidl)

//IdownloadService.aidl,注意擴展名

package cn.itcast.aidl;

interface IdownloadService{

         void download(in/out/input String path);//in|out|inout是參數的方向。

}

Ide會自動在gen包下生成對應的java類,接口文件中生成一個stub的抽象類,裡面包括aidl定義的方法,還包括一些其它輔助方法。值得關注的是asInterface(IBinder iBinder),它返回接口類型的實例,對於遠程服務調用,遠程服務返回給客戶端的對象,客戶端onServiceConnectionted(ComponentName name,IBinder service)方法引用該對象時不能直接強轉成接口類型的實例,而應該使用asInterface(IBinder iBinder)進行類型轉換。

 

編寫AIDL需要注意:

1.       接口名和aidl文件相同。

2.       接口和方法前不用加訪問權限修飾符public,private,protected等,也不能用final,static.

3.       Aidl默認支持的類型包括java基本類型(int,long,boolean等)和(String,List,Map,CharSequence),使用這些類型是不需要import聲明,對於List和Map中的元素類型必須是Aidl支持的類型,如果用自定義類型作為參數或返回值,自定義類型必須實現Parcelable接口。

4.       自定義類型的AIDL生成的其它接口類型在aidl描述文件中,應該顯示import,即便在該類型和定義的包同一個包中。

5.       在aidl文件中所有非Java基本類型參數必須加上in、out、inout標記,以指明參數是輸入參數,輸出參數還是輸入輸出參數。

6.Java原始類型默認的標記位in,不能為其它標記。

 

Javabean必須實現Parcelable接口

class Person implements Parcelable{

         id,name;

         public int describeContents(){

                   return 0;

}

//把javabean中的數據寫到Parcel

public void writeToParcel(Parcel dest,int flags){

         dest.writeInt(this.id);

dest.writeString(this.name);

}

 

//添加一個靜態成員,名為CREATOR,該對象實現了Parcelable.Creator接口

  public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){

                   public Person createFromParcel(Parcel source) {                         return new Person(source.readInt(), source.readString());

                   }

                   public Person[] newArray(int size) {

                      return new Person[size];

                   }};

}

 

在自定義類型包中定義aidl聲明文件

//Person.aidl,注意Parcelable是小寫

Package cn.itcast.domain;

parcelable Person;

interface cn.itcast.domain.Person;

interface IPersonService{

         void save(in Person person);

}

 

創建aidl接口實現類(通過繼承${業務接口}.stub類實現)

Public class ServiceBinder extends IPersonService.Stub{

         Public void save(Person person) throws RemoteException{

                   Log.i(“PersonService”,person.getId()+”=”+person.getName());

}

}

 

實現service的onBind方法,返回值就是上一步創建的aidl實現類對象。

public IBinder onBind(Intent intent){

         return new ServiceBinder();

}

 

客戶端通過隱式意圖訪問服務。

<service android:name=”.PersonService”>

         <intent-filter>

                   <action android:name=”cn.itcast.process.aidl.PersonService”/>

new Intent(“cn.itcast.process.aidl.PersonService”);

 

復制aidl文件和所在包到客戶端對應的src下。(客戶端會自動生成對應java類)

this.bindService(,this.sc,BIND_AUTO_CREATE);

sc = new ServiceConnection(){

         public void onServiceConnected(ComponentName,IBinder service){

                   personService = IPersonService.Stub.asInterface(service);

                   personService.save(new Person(56,”liming”));

}

 

public void onServiceDisconnected(ComponetName name){

         personService = null;

}

}

 

Android-結束通話

Android沒有對外公開通話的API,如果需要結束通話,必須使用AIDL於電話管理服務進行通行,並調用服務中的API實現結束通話,方法如下:

1.       從Android的源代碼中拷貝以下文件到項目中:

com/android/internal/telephony/ITelephony.aidl

android/telephony/NeighboringCellInfo.aidl

         如右圖所示。開發工具會在gen目錄下自動生成ITelephony.java

 

2.       調用ITelephony.endCall()結束通話:

Method method = Class.forName(“android.os.ServiceManager”)

.getMethod(“getService”,String.class);

IBinder binder = (IBinder)method.invoke(null,new Object[]{TELEPHONY_SERVICE});

ITelephony telephony = ITelephony.Stub.asInterface(binder);

Telephony.endCall();

 

在清單文件AndroidManifest.xml中添加權限

<uses-permission android:name=”android.permission.CALL_PHONE”/>

 

 

 

 


作者:toto1297488504
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved