Android進(jìn)程間通信---AIDL接口回調(diào)

先回顧一下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

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>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容