Binder的非正常消亡时的重置方法

一、原理

当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);
    }
View Code

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();
        }
    }        
原文地址:https://www.cnblogs.com/rookiechen/p/5382851.html