Android AIDL使用詳解

1.什麼是aidl:aidl是 Android Interface definition language的縮寫,一看就明白,它是一種android內部進程通訊接口的描述語言,經過它咱們能夠定義進程間的通訊接口 icp:interprocess communication :內部進程通訊 2.既然aidl能夠定義並實現進程通訊,那麼咱們怎麼使用它呢?文檔/android-sdk/docs/guide/developing/tools/aidl.html中對步驟做了詳細描述: --1.Create your .aidl file - This file defines an interface (YourInterface.aidl) that defines the methods and fields available to a client. 建立你的aidl文件,我在後面給出了一個例子,它的aidl文件定義以下:寫法跟java代碼相似,可是這裏有一點值得注意的就是它能夠引用其它aidl文件中定義的接口,可是不可以引用你的java類文件中定義的接口 [java] view plain copy package com.cao.android.demos.binder.aidl; import com.cao.android.demos.binder.aidl.AIDLActivity; interface AIDLService { void registerTestCall(AIDLActivity cb); void invokCallBack(); } --2.Add the .aidl file to your makefile - (the ADT Plugin for Eclipse manages this for you). Android includes the compiler, called AIDL, in the tools/ directory. 編譯你的aidl文件,這個只要是在eclipse中開發,你的adt插件會像資源文件同樣把aidl文件編譯成java代碼生成在gen文件夾下,不用手動去編譯:編譯生成AIDLService.java如我例子中代碼 --3.Implement your interface methods - The AIDL compiler creates an interface in the Java programming language from your AIDL interface. This interface has an inner abstract class named Stub that inherits the interface (and implements a few additional methods necessary for the IPC call). You must create a class that extends YourInterface.Stub and implements the methods you declared in your .aidl file. 實現你定義aidl接口中的內部抽象類Stub,public static abstract class Stub extends android.os.Binder implements com.cao.android.demos.binder.aidl.AIDLService Stub類繼承了Binder,並繼承咱們在aidl文件中定義的接口,咱們須要實現接口方法,下面是我在例子中實現的Stub類: [java:showcolumns] view plain copy ·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150 private final AIDLService.Stub mBinder = new AIDLService.Stub() { @Override public void invokCallBack() throws RemoteException { Log("AIDLService.invokCallBack"); Rect1 rect = new Rect1(); rect.bottom=-1; rect.left=-1; rect.right=1; rect.top=1; callback.performAction(rect); } @Override public void registerTestCall(AIDLActivity cb) throws RemoteException { Log("AIDLService.registerTestCall"); callback = cb; } }; Stub翻譯成中文是存根的意思,注意Stub對象是在被調用端進程,也就是服務端進程,至此,服務端aidl服務端得編碼完成了。 --4.Expose your interface to clients - If you're writing a service, you should extend Service and override Service.onBind(Intent) to return an instance of your class that implements your interface. 第四步告訴你怎麼在客戶端如何調用服務端得aidl描述的接口對象,doc只告訴咱們須要實現Service.onBind(Intent)方法,該方法會返回一個IBinder對象到客戶端,綁定服務時不是須要一個ServiceConnection對象麼,在沒有了解aidl用法前一直不知道它是什麼做用,其實他就是用來在客戶端綁定service時接收service返回的IBinder對象的: [java] view plain copy AIDLService mService; private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { Log("connect service"); mService = AIDLService.Stub.asInterface(service); try { mService.registerTestCall(mCallback); } catch (RemoteException e) { } } public void onServiceDisconnected(ComponentName className) { Log("disconnect service"); mService = null; } }; mService就是AIDLService對象,具體能夠看我後面提供的示例代碼,須要注意在客戶端須要存一個服務端實現了的aidl接口描述文件,可是客戶端只是使用該aidl接口,不須要實現它的Stub類,獲取服務端得aidl對象後mService = AIDLService.Stub.asInterface(service);,就能夠在客戶端使用它了,對mService對象方法的調用不是在客戶端執行,而是在服務端執行。 4.aidl中使用java類,須要實現Parcelable接口,而且在定義類相同包下面對類進行聲明: 上面我定義了Rect1類 以後你就能夠在aidl接口中對該類進行使用了 package com.cao.android.demos.binder.aidl; import com.cao.android.demos.binder.aidl.Rect1; interface AIDLActivity { void performAction(in Rect1 rect); } 注意in/out的說明,我這裏使用了in表示輸入參數,out沒有試過,爲何使用in/out暫時沒有作深刻研究。 5.aidl使用完整示例,爲了清除說明aidl使用,我這裏寫了一個例子,例子參考了博客: http://blog.csdn.net/saintswordsman/archive/2010/01/04/5130947.aspx 做出說明 例子實現了一個AIDLTestActivity,AIDLTestActivity經過bindservice綁定一個服務AIDLTestService,經過並獲取AIDLTestActivity的一個aidl對象AIDLService,該對象提供兩個方法,一個是registerTestCall註冊一個aidl對象,經過該方法,AIDLTestActivity把自己實現的一個aidl對象AIDLActivity傳到AIDLTestService,在AIDLTestService經過操做AIDLActivity這個aidl遠端對象代理,使AIDLTestActivity彈出一個toast,完整例子見我上傳的資源:
相關文章
相關標籤/搜索