android进阶-AIDL之重连方法

系列文章

AIDL-基本使用
AIDL-自定义数据类型
AIDL-修饰符in,out,inout
AIDL-重连方法
AIDL-接口注册/解注册
AIDL-连接池

知识点

  1. 服务保活的常用方法
  2. service重连

一、服务保活的常用方法会

一般service保活的方法有:
提高进程优先级,
开启前台服务,
断开重连,
系统白名单

二、service重连

aidl断开重连,实际就是对service的重新绑定,所以可以在监听到服务断开的时候进行重新绑定,这里提供两种常用方法:

2.1 onServiceDisconnected

在bindService的时候,会有个服务连接状态监听,可以通过这个监听去监听断开的状态,然后进行重新绑定

ServiceConnection conn= new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                LogUtil.d("onServiceConnected");
                iPerson = IPerson.Stub.asInterface(service);
                Toast.makeText(AIDLClientAcitvity.this, "onServiceConnected", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                LogUtil.d("onServiceDisconnected");
                //断开重新绑定
                bindServiceByAidl();
            }
        };

2.2 binder的死亡代理

死亡代理要在service连接成功和断开的时候分别注册/解注册

 private IBinder.DeathRecipient deathRecipient=new IBinder.DeathRecipient() {
        @Override
        public void binderDied() {
            //解绑
            if(iPerson!=null){
                iPerson.asBinder().unlinkToDeath(deathRecipient,0);
                iPerson=null;
            }
            //断开重新绑定
            bindServiceByAidl();
        }
    };

ServiceConnection conn= new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                LogUtil.d("onServiceConnected");
                try {
                    //设置死亡代理
                    service.linkToDeath(deathRecipient,0);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                iPerson = IPerson.Stub.asInterface(service);

                Toast.makeText(AIDLClientAcitvity.this, "onServiceConnected", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                LogUtil.d("onServiceDisconnected");
            }
        };

另外,我们可以使用如下方法判断binder是否已经死亡:

 private void binderIsAlive(){
        if(iPerson!=null){
            iPerson.asBinder().isBinderAlive();
        }
    }

ps:这两种方法的区别是onServiceDisconnected在客户端的UI线程中被回调,而binderDied在客户端的Binder线程池中被回调


总结

服务断开重连在日常做服务建通信往往是需要加上的,因为没有谁可以确保自己的与服务端一直保持着连接状态,所以如果在需要保持通信的时候,都要加上对服务断开重连的方法,当然这里只是提供了两种常用的方法,其他的方法应该也还有的,这里就不做那么多的扩展了

Demo地址

https://github.com/returntolife455/DemoList

你可能感兴趣的:(android进阶-AIDL之重连方法)