分别写了两个AIDL APP,一个作为服务端,一个是客户端
服务端没啥说的,在客户端中
我们连接AIDL是使用BindService的,在很久以前我在BindService的时候就在问ServiceConnection接口中的onServiceConnected会在bindService的时候被回调
但是onServiceDisconnected方法什么时候调用呢?我之前做过测试和查阅过资料,这个方法正常情况该方法不会被调用,只有在程序被意外关闭或者进程被杀才自动调用
就是说,当服务异常意外断开的时候,这个方法才会被调用,手动unBindService是不会走这个方法的,事实也是如此
那如果在不使用LinkToDeath的时候,想AIDL崩溃再重启,在这个方法里处理是可以的【已测试可行】
这样可以重启Aidl
LinkToDeath的方法是在binder对象不正常消失的时候,会调用,比如说意外断开,其效果和onServiceConnected一样,只是调用的先后顺序不同
unLinkToDeath可以清除之前设置的监听器
下图的1是启动时,第一次绑定服务,2代表服务意外断开并重启服务
从代码测试来看,这两种方法都可以重新BindService,经过多次测试,每次Aidl意外断开都会调起linkToDeath和onServiceDisconnected方法,只是linkToDeath方法调用在onServiceDisconnected之前,其他没发现区别
另外在查看资料时,有说到在RemoteException中处理,但是RemoteException都是我们try{}catch{}的,所以使用UncaughtExceptionHandler是无法捕捉到RemoteException的,否则也是可以进行处理的
附上源码注释:
从注释中可以看到这两个的区别:linkToDeath是在绑定的对象意外消失的时候回调,一般是进程被杀,onServiceDisconnected是当服务连接丢失时回调,而且还说明通常是进程崩溃或者被杀,所以通常时候,可认为这两个方法效果一致