一、原理
当Binder非正常消亡的时候,会导致远程调用失败,这样客户端功能就会受到影响。
解决:给Binder设置一个死亡代理,当Binder死亡时,我们就会收到通知,这个时候可以重新发起连接。
二、制作
1、前期准备
客户端:MainActivity.java


@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); createService(); } /*连接Service端,获取mIBookManger*/ private void createService(){ ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //初始化mIBookManger mIBookManager = IBookManager.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { } }; Intent intent = new Intent(this,BookService.class); bindService(intent,connection,BIND_AUTO_CREATE); }
Service端:BookService.java
2、使用
创建IBinder.DeathRecipient接口,重写其中的binderDied(),当Binder死亡时候,回调该方法。
private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() { @Override public void binderDied() { if (mIBookManager != null){ //解除绑定当前接口 mIBookManager.asBinder().unlinkToDeath(mDeathRecipient,0); } mIBookManager = null; createService(); } };
当然解除绑定,之前还需要绑定接口
/*连接Service端,获取mIBookManger*/ private void createService(){ ...(连接之前的代码) try { //绑定接口,等待回调 mIBookManager.asBinder().linkToDeath(mDeathRecipient,0); } catch (RemoteException e) { e.printStackTrace(); } }
Binder死亡回收机制
本文介绍了解决Binder非正常消亡导致远程调用失败的问题。通过设置死亡代理,当Binder死亡时,客户端会收到通知并重新发起连接。文章详细展示了如何在客户端和服务端实现这一机制,包括创建IBinder.DeathRecipient接口并重写binderDied()方法。
1827

被折叠的 条评论
为什么被折叠?



