Android中的Aidl

Android實現(xiàn)跨進程通信的方式有很多種,隱式啟動一個Activity,廣播,contentprovider,Messager等均可以實現(xiàn),本文主要是講述aidl的使用
1:創(chuàng)建一個服務(wù)器端工程
// IMyAidlInterface.aidl
package com.demo.aidltest;
// Declare any non-default types here with import statements
import com.example.myaidldemo.Person;
interface IMyAidl {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
String greet(String someone);
void addPerson(in Person person);
List<Person> getPersonList();
}
上面的aidi接口有兩個方法:addPerson和getPersonList
Aidl接口創(chuàng)建完成之后會在gen目錄下生成一個同名的java文件
上面有一個注意項:必須顯式導(dǎo)入PerSon類,不管是否在同一個包名下
創(chuàng)建的實體類aidl文件必須和實體類包名一致,實體類放在java目錄下,實體類對應(yīng)的aidl文件放在
aidl目錄下


tes1.png

實體類的映射aidl文件
// Person.aidl
package com.example.myaidldemo;
// Declare any non-default types here with import statements
parcelable Person;
編譯之后會生成一個對應(yīng)的.java文件


tes2.png

2:編譯服務(wù)器端的service
private IBinder binder = new IMyAidl.Stub() {
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
}
@Override
public String greet(String someone) throws RemoteException {
return null;
}
@Override
public void addPerson(Person person) throws RemoteException {
}
//客戶端和服務(wù)器綁定時的回調(diào),當(dāng)客戶端拿到他時便可以和服務(wù)器端進行通訊
//并且調(diào)用服務(wù)器端的方法
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}

3:原理分析
打開MyAidl.aidl對應(yīng)的java文件有兩個抽象類Stub和Proxy
3.1:Proxy部分
Proxy運行在客戶端,可以看出Proxy實現(xiàn)了MyAidl.aidl里面的所有接口,并且持有一個遠程IBinder mRemote代理,mRemote不做任何的業(yè)務(wù)處理,只是通過IBinder的transtact()方法將客戶端的參數(shù)經(jīng)過序列化之后傳遞給服務(wù)器端


tes.png

3.2:Stub部分
Stub運行在服務(wù)器端,繼承Binder,同時也實現(xiàn)了IMyAidl里面的接口,核心業(yè)務(wù)邏輯在onTransact中
遠程服務(wù)器通過IBinder接口的onTransact()方法接受參數(shù),處理參數(shù)并且實現(xiàn)相關(guān)的邏輯,通過reply向客戶端返回相關(guān)的參數(shù)
Stub中還有一個比較重要的接口asInterface
public static com.example.myaidl.IMyAidl asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.example.myaidl.IMyAidl))) {
return ((com.example.myaidl.IMyAidl)iin);
}
return new com.example.myaidl.IMyAidl.Stub.Proxy(obj);
}
他的大概作用就是將一個IBinder對象轉(zhuǎn)化為一個接口對象,如果遠程服務(wù)端和客戶端都在同一個進程中那么就不需要跨進程,直接將IMyAidl當(dāng)做一個普通的對象來使用,否則就會返回一個遠程對象的代碼對象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容