Android-使用AIDL處理序間通訊

來源:互聯網
上載者:User

對於用戶端和服務之間通訊,雖然可以通過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”/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.