AIDL服务意外断开怎么办

分别写了两个AIDL  APP,一个作为服务端,一个是客户端

服务端没啥说的,在客户端中

我们连接AIDL是使用BindService的,在很久以前我在BindService的时候就在问ServiceConnection接口中的onServiceConnected会在bindService的时候被回调

但是onServiceDisconnected方法什么时候调用呢?我之前做过测试和查阅过资料,这个方法正常情况该方法不会被调用,只有在程序被意外关闭或者进程被杀才自动调用

就是说,当服务异常意外断开的时候,这个方法才会被调用,手动unBindService是不会走这个方法的,事实也是如此

那如果在不使用LinkToDeath的时候,想AIDL崩溃再重启,在这个方法里处理是可以的【已测试可行】

AIDL服务意外断开怎么办_第1张图片
onServiceDisconnected

这样可以重启Aidl

LinkToDeath的方法是在binder对象不正常消失的时候,会调用,比如说意外断开,其效果和onServiceConnected一样,只是调用的先后顺序不同

unLinkToDeath可以清除之前设置的监听器

AIDL服务意外断开怎么办_第2张图片
DeathRecipient

AIDL服务意外断开怎么办_第3张图片
LinkToDeath

下图的1是启动时,第一次绑定服务,2代表服务意外断开并重启服务

AIDL服务意外断开怎么办_第4张图片
对比说明

从代码测试来看,这两种方法都可以重新BindService,经过多次测试,每次Aidl意外断开都会调起linkToDeath和onServiceDisconnected方法,只是linkToDeath方法调用在onServiceDisconnected之前,其他没发现区别

另外在查看资料时,有说到在RemoteException中处理,但是RemoteException都是我们try{}catch{}的,所以使用UncaughtExceptionHandler是无法捕捉到RemoteException的,否则也是可以进行处理的

附上源码注释:

AIDL服务意外断开怎么办_第5张图片
onServiceDisconnected
AIDL服务意外断开怎么办_第6张图片
DeathRecipient
AIDL服务意外断开怎么办_第7张图片
linkToDeath

从注释中可以看到这两个的区别:linkToDeath是在绑定的对象意外消失的时候回调,一般是进程被杀,onServiceDisconnected是当服务连接丢失时回调,而且还说明通常是进程崩溃或者被杀,所以通常时候,可认为这两个方法效果一致

你可能感兴趣的:(AIDL服务意外断开怎么办)