aidl:android interface definition language,它是一種android內部進程通信接口的描述語言,通過它我們可以定義進程間的通信接口。
icp:interprocess communication ,內部進程通信。
使用:
1、先創建一個aidl文件,aidl文件的定義和java代碼類似,但是!它可以引用其它aidl文件中定義的接口和類,但是不能引用自定義的java類文件中定義的接口和類,要引用自定義的接口或類,需要為此類也定義一個對應的aidl文件,并且此類要實現parcelable接口,同時aidl文件和類文件必須要在相同包下進行聲明;android包含了aidl編譯器,當定義好一個aidl文件的時候,會自動編譯生成一個java文件,此文件保存在gen目錄之下。
在這個項目中,定義了兩個aidl文件,其中person實現了接口parcelable,下面是這兩個aidl文件的定義:
person.aidl
{
parcelable person;
}
iaidlserverservice.aidl
{
package com.webview;
import com.webview.person;// 引用上面的person.aidl
interface iaidlserverservice{
string sayhello();
person getperson();
}
}
2、編寫一個service實現定義aidl接口中的內部抽象類stub,stub繼承自binder,并繼承我們在aidl文件中定義的接口,我們需要實現這些方法。stub中文意思存根,stub對象是在服務端進程中被調用,即服務端進程。
在客戶端調用服務端定義的aidl接口對象,實現service.onbind(intent)方法,該方法會返回一個ibinder對象到客戶端,綁定服務時需要一個serviceconnection對象,此對象其實就是用來在客戶端綁定service時接收service返回的ibinder對象。
||public static abstract class stub extends android.os.binder implements com.webview.iaidlserverservice
1
|
public class aidlserverservice extends service{ @overridepublic ibinder onbind(intent intent) { return binder;} private iaidlserverservice.stub binder = new stub() { @overridepublic string sayhello() throws remoteexception { return "hello aidl" ;} @overridepublic person getperson() throws remoteexception {person person = new person();person.setname( "livingstone" );person.setage( 22 ); return person;}};} |
3、在服務端注冊service,將如下代碼添加進application節點之下!
<service android:name="com.webview.aidlserverservice"
android:process=":remote">
<intent-filter>
<action android:name="com.webview.iaidlserverservice"></action>
</intent-filter>
</service>
至此,服務端進程定義已經完成!
4、編寫客戶端,注意需要在客戶端存一個服務端實現了的aidl接口描述文件,客戶端只是使用該aidl接口,獲取服務端的aidl對象(iaidlserverservice.stub.asinterface(service))之后就可以調用接口的相關方法,而對象的方法的調用不是在客戶端執行,而是在服務端執行。
1
|
public class mainactivity extends activity { private button btn; private iaidlserverservice aidlservice = null ;<br> private serviceconnection conn = new serviceconnection() { @overridepublic void onservicedisconnected(componentname name) {aidlservice = null ;} @overridepublic void onserviceconnected(componentname name, ibinder service) {aidlservice = iaidlserverservice.stub.asinterface(service); try {aidlservice.dofunction(); // 執行接口定義的相關方法} catch (remoteexception e) {e.printstacktrace();}}};@overrideprotected void oncreate(bundle savedinstancestate) {super.oncreate(savedinstancestate);setcontentview(r.layout.activity_main);btn = (button) findviewbyid(r.id.button);tv = (textview) findviewbyid(r.id.textview);btn.setonclicklistener(new onclicklistener() {@overridepublic void onclick(view v) {intent service = new intent("com.webview.iaidlserverservice");bindservice(service, conn, bind_auto_create);// 綁定服務}});}} |
客戶端目錄結構: