Binder连接断开重启服务

当我们使用AIDL,在前台Activity中获取到binder实例后,如果服务器端进程由于某种原因异常终止,这个时候会导致binder连接断开死亡。


1.DeathRecipient 

Binder中提供了两个配对的方法linkToDeath和unlinkToDeath。通过linkToDeath方法可以设binder设置死亡代理,当binder死亡后,系统会回调binderDied方法,我们我们就可以在方法中移除之前绑定的binder代理,并重新绑定远程服务。


private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
        @Override
        public void binderDied() {
            Log.d(TAG, "binder died. name:" + Thread.currentThread().getName());
            if (mRemoteBookManager == null)
                return;
            mRemoteBookManager.asBinder().unlinkToDeath(mDeathRecipient, 0);
            mRemoteBookManager = null;
            // 这里重新绑定远程Service
        }
    };

设置方法:

mRemoteManager.asBinder().linkToDeath(mDeathRecipient, 0);


另外,我们也可以通过binder.isBinderAlive()方法来判断Binder是否已经死亡。


2.在onServiceDisconnected重连服务

当binder断开连接后,系统会回调onServiceDisconnected,然后我们可以重连服务。


它们的区别在于,onServiceDisconnected是在客户端UI线程中执行的,而binderDied是在客户端的Binder线程池中被回调的。


盗用刚哥的binder原理图用用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值