美文网首页
Binder通信和AIDL

Binder通信和AIDL

作者: 毛神 | 来源:发表于2017-05-27 14:56 被阅读0次

           本文讲的是,Binder通信和AIDL,一般的理解是,Binder通信可以通过AIDL来实现,通过AIDL定义这样的接口格式,就会自动生成一些类。类似于WebService,嗯,对,感觉很类似。

            最近在学习这个,发现一些特别的点,网上看了,大部分都在写AIDL,所以,我就提出来,说一下。使用Binder通信,目前,有三种方案(其实就两种啦。。。(其实就一种啦。。。))

    1,直接使用Binder通信

    这种情况,是在通信在进程内的时候,使用的,看代码:

    首先,自定义一个Binder类:

    自定义一个Binder,只有一个方法

    然后定义一个服务端:

    代码很简单,就在onBind中,return我们刚刚自定义的Binder

    然后就是客户端调用:

    客户端绑定一下

    在onServiceConnected中获取到的IBinder service,如果是同进程,就直接是我们的MyBinder,如果不是同进程,IBinder service就是BinderProxy。所以说,我们的第一种方式,就是只支持进程内通信(也就是说,我们的这个服务端,在主配置文件中,配置的:process必须和客户端一样)。

    2,AIDL通信

    这个网上讲的很多啦,首先,创建一个aidl文件:

    然后就是服务端和客户端:

    3,自定义AIDL所需要的文件:

    参照上面aidl生成的接口文件,我们拷贝一份,然后改一改里面的代码,就是我们自定义的接口文件了

    类似于这种

    客户端服务端,参考aidl。这种方法,唯一的优点,就是不需要写AIDL.。可是。。。无缘无故多了很多代码。。。

    总结:有一个想要总结下,就是第一种方式和第二种方式,aidl是支持进程间和进程内通信的。我们看这个AIDL生成的文件会看到很有意思的一行:

    这个接口在返回Binder实例的时候,是判断,如果是我们需要的,就直接强转,这个和我们第一个方案,没有任何差别(也就是进程内通信);否则,就使用Stub.Proxy()方法,返回一个实例。也就是说,AIDL方式,其实是把我们的第一种方式包含进去了。所以,如果我们正好有这样的场景,只需要进程内通信,那么第一种方法很方便。

    相关文章

      网友评论

          本文标题:Binder通信和AIDL

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