背景:了解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); } };