AIDL,Android Interface Define Language.安卓接口定義語言.
舉例實操:
當A進程調用B進程的服務炊汹,并實現通信,通常是通過AIDL來完成:
A.項目
Step1.要在項目建包aidlservice逃顶,xxx.aidlservice包中創(chuàng)建一個RemoteService.aidl文件讨便,在其中定義個接口,包含有方法get(). ADT插件會在gen目錄下自動生成一個RemoteService.java文件以政,該類中含有一個RemoteService.stub內部類霸褒,該內部類中含有aidl文件接口的get方法.
ps:aidl文件的位置不固定,可以任意放置
Step2.定義自己的MyService類妙蔗,在MyService類中自定義一個內部類去繼承setp1中的RemoteService.stub傲霸,并實現get()方法。在onbind方法中返回這個內部類的對象眉反,系統(tǒng)會自動將這個對象封裝為IBinder對象昙啄,傳遞給他的調用者。
Step3.在清單文件中配置MyServcie類:
<!--注冊服務-->
<service android:name=".MyService">
<intent-filter>
<!--指定調用AIDL服務的ID-->
<action android:name="xxx.aidlservice.RemoteService">
</intent-filter>
</service>
指定調用aidl服務的id寸五,是為了通知外界梳凛,MyService類能夠被別的進程訪問,這里梳杏,B進程可以通過id找到A進程實現通信韧拒。
ps: AIDL并不需要權限
B項目:
將A項目中生成的RemoteService.java文件拷貝到B工程淹接,在bindService方法中綁定aidl服務。
綁定AIDL服務就是將RemoteService的id作為intent的action參數.
/*
*第一個參數是一個明確指定了要綁定的service的Intent.
*第二個參數是ServiceConnection對象.
*第三個參數是一個標志叛溢,它表明綁定中的操作.它一般應是BIND_AUTO_CREATE塑悼,這樣就會在service不存在時創(chuàng)建
一個.其它可選的值是BIND_DEBUG_UNBIND和BIND_NOT_FOREGROUND,不想指定時設為0即可.
*/
bindService(
new Intent("xxx.aidlservice.RemoteService"),
serviceConnection, Context.BIND_AUTO_CREATE
);
/*
綁定是異步的.bindService()會立即返回,它不會返回IBinder給客戶端.要接收IBinder楷掉,客戶端必須創(chuàng)建一個
ServiceConnection的實例并傳給bindService().
ServiceConnection必須實現onServiceConnected(ComponentName name, IBinder service)方法厢蒜,其中
的service參數就是A工程中MyService類中繼承了RemoteService.stub類的內部類的對象.
*/
Sevice的綁定,詳見http://blog.csdn.net/lansefeiyang08/article/details/24691363