当我们使用AIDL,在前台Activity中获取到binder实例后,如果服务器端进程由于某种原因异常终止,这个时候会导致binder连接断开死亡。
1.DeathRecipient
Binder中提供了两个配对的方法linkToDeath和unlinkToDeath。通过linkToDeath方法可以设binder设置死亡代理,当binder死亡后,系统会回调binderDied方法,我们我们就可以在方法中移除之前绑定的binder代理,并重新绑定远程服务。
private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
@Override
public void binderDied() {
Log.d(TAG, "binder died. name:" + Thread.currentThread().getName());
if (mRemoteBookManager == null)
return;
mRemoteBookManager.asBinder().unlinkToDeath(mDeathRecipient, 0);
mRemoteBookManager = null;
// 这里重新绑定远程Service
}
};
设置方法:
mRemoteManager.asBinder().linkToDeath(mDeathRecipient, 0);
另外,我们也可以通过binder.isBinderAlive()方法来判断Binder是否已经死亡。
2.在onServiceDisconnected重连服务
当binder断开连接后,系统会回调onServiceDisconnected,然后我们可以重连服务。
它们的区别在于,onServiceDisconnected是在客户端UI线程中执行的,而binderDied是在客户端的Binder线程池中被回调的。
盗用刚哥的binder原理图用用