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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值