AIDL服务意外断开怎么办

作者: e618211d6873 | 来源:发表于2017-07-04 17:06 被阅读644次

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

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

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

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

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

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

    onServiceDisconnected

    这样可以重启Aidl

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

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

    DeathRecipient
    LinkToDeath

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

    对比说明

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

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

    附上源码注释:

    onServiceDisconnected DeathRecipient linkToDeath

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

    相关文章

      网友评论

        本文标题:AIDL服务意外断开怎么办

        本文链接:https://www.haomeiwen.com/subject/kgrxhxtx.html