文章目录
AIDL常用在android服务端与客户端之间的通信中,容易发生客户端或者服务端死亡,无法通知到对端情况,从而造成客户端不知服务端死亡或者服务端不知客户端死亡,还在进行数据回调操作。
一、客户端的监听【服务端】意外死亡
//死亡接受者
IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient() {
@Override
public void binderDied() {
//服务端死亡
if (iMyAidlInterface != null) {
//注销监听和回收资源
iMyAidlInterface.asBinder().unlinkToDeath(this, 0);
iMyAidlInterface = null;
}
}
};
private IMyAidlInterface iMyAidlInterface;
class Myconnect implements ServiceConnection {
//连接的成功的时候回调
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "onServiceConnected() called ");
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
try {
//连接死亡监听
service.linkToDeath(deathRecipient, 0);
} catch (RemoteException e) {
e.printStackTrace();
}
//解绑服务
// unbindService(myconnect);
}
//断开连接的时候回调
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "onServiceDisconnected() called with: name = [" + name + "]");
}
}
二、服务端监听【客户端】意外死亡
当无需使用死亡代理时亦可通过unlinkToDeath解除死亡代理模式
callback.asBinder().linkToDeath(new IBinder.DeathRecipient() {
@Override
public void binderDied() {
Log.d("binder", "客户端死亡啦~!");
}
}, 0);