aidl类是实现Manager和Service通信的桥梁。
例如在修改Android Wifi功能的时候看到WifiManager管理WifiService;
AIDL是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。
比如onclick(),用oneway修饰,异步调用,监听屏幕点击,点击后各种处理后,才会回调到。
aidl的回调可以使用这种:
void registerVolumeCallback(in IBinder binder);
这里的binder则是客户端在自己程序里面实现接口。如
private final ICarVolumeCallback mVolumeChangeCallback = new ICarVolumeCallback.Stub() {
本身aild的实现就是一个binder,所以可以传递进去,然后服务器里面去回调binder.xxx函数。客户端去实现这个接口的一些函数。
注意:in、out、inout,是接收发送对象的所有数据,
aidl中onway、in、out、inout关键字
- oneway可以修饰AIDL文件里的方法,oneway修饰的方法在用户请求相应功能时不需要等待响 应可直接调用返回,非阻塞效果,该关键字可以用来声明接口或者声明方法,如果接口声明中用到了oneway关键字,则该接口声明的所有方法都采用oneway方式。
oneway代表这个Binder接口是异步调用;
oneway void request();//异步执行
同一个binder服务中的oneway方法被多次调用会排队执行;
不同binder服务中的oneway方法被同时调用会同时执行;
tips: 一次Binder通信最大可以传输多大的数据为1M-8K;
binder驱动对于oneway的调用是类似于handler sendmessage那样的,挨个处理,所以如果服务端的oneway接口处理太慢而客户端调用太多的话,来不及处理的调用会占满binder驱动的缓存,导致其他调用抛出transaction failed ;
- in 由cilent端流向server端,server端可以收到此对象的所有数据,收到之后会重新创建一个新的对象将数据填充进去,因为cilent端和server端是两个不同的对象,所以server端对数据的修改不会影响到client端的对象;
service端对数据的改变不会反馈到client端;
非基本数据类型和string的参数类型必须加参数修饰符, in的意思是只输入;
-
out 是由server端流向client端,server端实际上不接收client传入的数据;在service端自己处理数据后结果返回到client端,client接收service端改变的数据结果;
-
inout 对象可以双向流动,即server端能收到cilent发过来的对象的数据,server端对此对象的操作也能影响到cilent端;
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/fengzhiqi1993/article/details/126536035