Binder连接断开重启服务

来源:互联网 发布:网络市场调查问卷 编辑:程序博客网 时间:2024/06/07 14:28

当我们使用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原理图用用


阅读全文
0 0
原创粉丝点击