綁定Service的三種實現方式之使用AIDL


AIDL全稱為Android Interface Definition Language,它可以使你的程序實現進程間通信(IPC),並且在實現IPC的基礎上允許多線程訪問。

首先,我們要創建一個自己的.aidl文件(見Demo中的IRemoteService.aidl)。

定義AIDL文件與java中創建接口非常的類似。一般來說,aidl支持的數據類型有五種:java基本數據類型;String;CharSequence;List;Map。其中List和Map較為特殊(http://developer.android.com/guide/components/aidl.html#Create)。如果你使用的數據類型不是AIDL的基本數據類型,你必須要使用import語句將其導入,即使他們是在同一個package下。聲明方法時,方法的參數可以零到多個,返回值可以是void;所有的非基本數據類型都需要指定是傳入還是傳出值(基本數據類型都是傳入值;在AIDL文件中不能聲明靜態字段)

其次,我們要實現我們上面剛剛創建的接口(見Demo中StudentService中的mBinder)。

假設我們有一個AIDL文件叫IRemoteService.aidl,當我們編譯我們的項目的時候,android的ant能將我們的AIDL文件生成為java文件(放在gen/下面)。這個java文件中有一個抽象內部類Stub(繼承了Binder類)實現了我們的接口,並提供了一個asInterface方法將IBinder對象轉化為我們的接口類型。因為實現我們的接口就轉化為實現其抽象內部類Stub(Service端的業務函數全部在這里實現)。

再次,將我們的接口暴露給客戶端(注意Demo在Server端AndroidManifest.xml中對StudentService的聲明)

將我們的接口暴露給客戶端實際上就是:在Service的onBind函數中將我們的Stub類的實例反出去。

這樣,Service端的工作就完成了!

那么,怎樣通過IPC傳遞對象呢(見Demo中的Student.java和Student.aidl)?

如果你想在進程間傳遞對象,那么對象就必須實現Parcelable接口。而實現這個接口需要我們完成以下幾步:

1、在聲明對象的時候實現Parcelable接口

2、實現writeToPacel方法

3、添加一個叫做CREATOR的靜態變量(這個變量要實現Parcelable.Creator接口)

4、創建一個AIDL文件來聲明這個實現了Parcelable接口的類

這樣我們就可以在AIDL中使用對象了。

客戶端怎么對Service端的方法進行調用呢?

其實很簡單,只需要一下幾步就可以了(見Demo中的Client中的代碼)。

1、將Server端使用的.aidl文件拷貝到client程序中,如果你的aidl文件僅僅是對實現了Parcelable接口的類的說明,那么,對應的java文件也要拷貝過去。(注意包名,具體可參考Demo的client端對Sever端AIDL文件的導入)

2、編譯client程序,將在gen/目錄下生成AIDL對應的的類文件

3、實現ServiceConnection接口。在onServiceConnected方法中,使用AIDL生成的Java文件的函數(內部類Stub的asInterface)將onServiceConnected函數的中IBinder參數轉化為AIDL生成的接口對象。

4、根據第3步得到的對象來調用AIDL中的函數。

5、調用bindService函數執行綁定操作(解綁使用unbindService函數)

到這里,AIDL的使用講解就結束了。推薦你結合本文的Demo來讀這篇文章,相信會讓你受益匪淺的。

Demo鏈接:http://pan.baidu.com/share/link?shareid=587849&uk=2953765628


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM