先回顧一下aidl的使用方法,可以參考上篇介紹的AIDL怎么用,鏈接如下:
http://www.itdecent.cn/p/86d7c81eb6f8
Server端:
1、創(chuàng)建aidl接口文件以及數(shù)據(jù)(Parcelable)文件;
2、創(chuàng)建service文件,在AndroidManifest.xml中聲明action;
3、在service文件中添加IxxxInterface.Stub,以及對(duì)應(yīng)aidl接口實(shí)現(xiàn),例如:
??? private IMediaShareInterface.StubmIMediaShareMgr = new IMediaShareInterface.Stub() {
??????? @Override
??????? public void onMediaSharing(MediaDatadata) throws RemoteException {
??????? }
};
Client端:
1、? ? 創(chuàng)建和server端相應(yīng)的aidl文件(可以直接從server端復(fù)制一份);
2、? ? ?在Activity中添加ServiceConnection,在onStart中添加bindService,在onStop中添加unbindService,例如:
?? ?private ServiceConnection mServiceConnection =new ServiceConnection() {
??????? @Override
??????? public voidonServiceConnected(ComponentName componentName, IBinder service) {
? ? ?}
??????? @Override
??????? public voidonServiceDisconnected(ComponentName componentName) {
??????? }
};
在項(xiàng)目開發(fā)過程中,有時(shí)候會(huì)碰到以下類似的場(chǎng)景:在兩個(gè)app建立了Binder通信后,Client端需要Server端的某個(gè)狀態(tài),才能觸發(fā)將數(shù)據(jù)傳給Server端。但是Client端并沒有接口可以回調(diào)來(lái)處理記錄這個(gè)狀態(tài)。這個(gè)時(shí)候就需要增加一個(gè)回調(diào)接口,來(lái)實(shí)現(xiàn)以上功能??蚣芰鞒檀蟾湃缦拢?/p>

1、創(chuàng)建一個(gè)aidl接口,增加需要回調(diào)的接口,例如:
//IVoipTransferInterface.aidl
package com.suning.voicetransfer;
import com.suning.voicetransfer.IVoiceTransferListener;
import com.suning.voicetransfer.VoiceData;
interface IVoiceTransferInterface {
??? void setVoiceTransferListener(IVoiceTransferListenerlistener);
??? void onVoiceTransfer(in VoiceDatadata);
}
2、在原有aidl接口基礎(chǔ)上再新增一個(gè)接口,再把這個(gè)aidl接口類作為參數(shù),這樣Client端在收到onServiceConnected時(shí),就可以將接口設(shè)置進(jìn)來(lái)。例如:
privateboolean mIsSendVoip;
private IVoiceTransferInterface mIVoiceTransferMgr;
private ServiceConnection mServiceConnection = new ServiceConnection() {
??? @Override
??? public void onServiceConnected(ComponentNamecomponentName, IBinder service) {
??????? if (service != null) {
??????????? try {
??????????????? service.linkToDeath(mDeathRecipient,0);
??????????? } catch (RemoteException e) {
??????????????? e.printStackTrace();
??????????? }
??????? }
??????? mIsSendVoip = false;
??????? mIVoiceTransferMgr =IVoiceTransferInterface.Stub.asInterface(service);
??????? if (mIVoiceTransferMgr != null) {
??????????? try {
??????????????? mIVoiceTransferMgr.setVoiceTransferListener(mVoiceTransferListener);
??????????? } catch (RemoteException e) {
??????????????? e.printStackTrace();
??????????? }
??????? }
??? }
??? @Override
??? public void onServiceDisconnected(ComponentNamecomponentName) {
??? }
};
其中IVoiceTransferInterface就是新增的接口類 ,在建立連接(onServiceConnected)后, 將這個(gè)接口類以參數(shù)形式傳入:
mIVoiceTransferMgr.setVoiceTransferListener(mVoiceTransferListener);
3、設(shè)置好了以后,在Server端需要數(shù)據(jù)傳輸時(shí),執(zhí)行registerVoiceTransfer的接口方法,斷開數(shù)據(jù)傳輸時(shí),執(zhí)行unregisterVoiceTransfer。例如在Server端的service中onStartCommand方法作如下處理:
publicint onStartCommand(Intent intent, int flags, int startId) {
??? if (intent == null) {
??????? return START_STICKY;
??? }
??? String voiceTransfer =intent.getStringExtra("VoiceTransfer");
??? if ("start".equals(voiceTransfer)){
??????? mIsSendVoiceData = true;
??????? if (mIVoiceTransferListener != null){
??????????? try {
????????????? ??mIVoiceTransferListener.registerVoiceTransfer();
??????????? } catch (RemoteException e) {
??????????????? e.printStackTrace();
??? ????????}
??????? }
??? } else if ("stop".equals(voiceTransfer)){
??????? mIsSendVoiceData = false;
??????? if (mIVoiceTransferListener != null){
??????????? try {
??????????????? mIVoiceTransferListener.unregisterVoiceTransfer();
??????????? } catch (RemoteException e) {
??????????????? e.printStackTrace();
??????????? }
??????? }
??? }
??? return START_STICKY;
}
在Server端執(zhí)行到mIVoiceTransferListener.registerVoiceTransfer()時(shí),Client端相應(yīng)執(zhí)行registerVoiceTransfer():
privateIVoiceTransferListener mVoiceTransferListener = new IVoiceTransferListener.Stub(){
??? @Override
??? public void registerVoiceTransfer() throwsRemoteException {
??????? mIsSendVoip = true;
??????? setEnableVoip(mIsSendVoip);
??? }
??? @Override
??? public void unregisterVoiceTransfer()throws RemoteException {
??????? mIsSendVoip = false;
??????? setEnableVoip(mIsSendVoip);
??? }
};
Client端收到注冊(cè)通知后,設(shè)置一些狀態(tài)以及開啟數(shù)據(jù)傳輸接口。這樣就起到控制數(shù)據(jù)傳輸?shù)哪康牧恕?/p>