本文讲的是,Binder通信和AIDL,一般的理解是,Binder通信可以通过AIDL来实现,通过AIDL定义这样的接口格式,就会自动生成一些类。类似于WebService,嗯,对,感觉很类似。
最近在学习这个,发现一些特别的点,网上看了,大部分都在写AIDL,所以,我就提出来,说一下。使用Binder通信,目前,有三种方案(其实就两种啦。。。(其实就一种啦。。。))
1,直接使用Binder通信
这种情况,是在通信在进程内的时候,使用的,看代码:
首先,自定义一个Binder类:

然后定义一个服务端:

然后就是客户端调用:

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

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


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

客户端服务端,参考aidl。这种方法,唯一的优点,就是不需要写AIDL.。可是。。。无缘无故多了很多代码。。。
总结:有一个想要总结下,就是第一种方式和第二种方式,aidl是支持进程间和进程内通信的。我们看这个AIDL生成的文件会看到很有意思的一行:

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