aidl是為了讓服務實作程序間通信的,使用方法跟boundService差不多,是boundService的延伸。
1.建立一個檔案,以.aidl結尾,比如說IMyRemoteService.aidl,因為這個檔案其實是個接口,是以命名的時候以I開頭比較好。
2.然後寫一些代碼
package com.hyw.test;
interface IMyRemoteService{
void show();
}
包名就是該檔案所在的地方,然後接口名要跟檔案名一樣,最後我随便定義了一個方法。
3.編譯一下在gen目錄下就會生成一個檔案,叫IMyRemoteService.java。這樣接口就算搞好了。
4.然後我們像往常搞boundService一樣建立一個Service,在裡面弄個MyBinder内部類通過onBind方法傳回給用戶端,但是在這個地方有點不一樣哦。MyBinder繼承的不再是Binder而是剛才弄的接口,先看代碼。
package com.hyw.test;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class MyRemoteService extends Service {
class MyBinder extends IMyRemoteService.Stub{
@Override
public void show() throws RemoteException {
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
}
這個IMyRemoteService.Stub是哪來的呢?就是在gen目錄下生成的IMyRemoteService.java檔案裡的,stub是裡面的一個内部抽象類。在show方法裡你就可以做一些你想做的事了,在裡面執行的東西不在主線程,通過列印發現是叫Binder_2什麼的線程,因為這裡的執行是在另一個程序的。
5.再然後我們。。。。。,等等,别忘了注冊服務,注冊時候也有點不同,因為會有另外一個程序啟動這個服務,是以要添加過濾器,action。
<service android:name="com.hyw.test.MyRemoteService">
<intent-filter >
<action android:name="com.hyw.test.MyRemoteService"/>
</intent-filter>
</service>
action名字随意了
6.最後,我們再建立一個項目,然後把那個aidl檔案還有他的結構複制到新建立的這個項目裡,也就是aidl之前是在com.hyw.test這個目錄下,那麼複制到新項目裡也應該是在這個地方。
7.最後的最後,我們建立一個ServiceConnection回調,在綁定服務時獲得binder,注意,這時候又有不同了,不能強轉了,因為在這個項目裡根本沒那個類,這麼辦呢,還記得複制過來的aidl嗎,同樣編譯之後在gen裡也會出現那個java檔案,我們通過stub内部類裡的asInterface方法來獲得MyBinder,注意看asInterface方法的參數是不是一個IBinder,沒錯,就是這樣
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
IMyRemoteService binder = IMyRemoteService.Stub.asInterface(service);
try {
binder.show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
最後最後。。。。。。。.。。。。。。。。。。
Intent intent = new Intent("com.hyw.test.MyRemoteService");
bindService(intent, connection, BIND_AUTO_CREATE);
game over! 隐式啟動哦!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!