背景:了解linkToDeath
Binder死亡代理 :我们知道Binder是运行在服务进程,若服务端进程因为某种原因“死亡”,那么Binder对象也将随之而去,因为Binder对象是寄宿在服务端进程中的,这个时候我们的远程调用将会失败,客户端进程的功能也将受到影响。Binder类提供linkToDeath方法在客户端可以设置死亡代理,当服务端的Binder对象“死亡”,客户端可以受到死亡通知,这个时候我们可以重新恢复链接。
demo:
正常注册hal层callback后,调用linkToDeath,如果hal层service crash 重启,会回调serviceDied,此时需要延迟,等服务重新起来后去绑定。
ps: 此回调的线程 处于 子线程。
mMcuService = IMcuEventMonitor.getService(); mMcuService.registerEventCallback(mcuServiceCallback); mMcuService.linkToDeath(mDeathRecipient, 0);
private IHwBinder.DeathRecipient mDeathRecipient = new IHwBinder.DeathRecipient() {
@Override
public void serviceDied(long l) {
Log.d(TAG, " +++++++++++++++++serviceDied ");
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
try {
mMcuService = IMcuEventMonitor.getService();
int unre = mMcuService.unregisterEventCallback(mcuServiceCallback);
int re = mMcuService.registerEventCallback(mcuServiceCallback);
mMcuService.linkToDeath(mDeathRecipient, 0);
Log.d(TAG, "+++++++unre =" + unre + " re = " + re);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}, 1000);
}
};


