您的位置:首页 > 大数据 > 人工智能

IPC机制(AIDL)

2017-12-21 14:44 155 查看

2.1 AIDL

可以说是看的我云里雾里,在了解AIDL之前先了解一下Binder。当然也只是了解Binder的使用和上层原理。
Binder是Android中的一个类,实现了IBinder接口。从IPC角度来说,Binder是Android中的一种跨进程间通信方式;从Android FrameWork角度来说,Binder是ServiceManager链接各种Manager和ManagerService的桥梁;从Android应用层角度来说,Binder是客户端和服务端进行通信的媒介。
Android开发中,Binder重要用在Service中,包括AIDL和Messager。这里用AIDL分析Binder的工作机制。新建Java包aidl,然后创建3个文件Book.java、Book.aidl、IBookManager.aidl。其中Book.java是一个表示图书信息的类,它实现了Parcelable接口。Book.aidl是Book类在AIDL中的申明。IBookManager.aidl是定义的一个接口。尽管Book类已经和IBookManager位于相同的包中,但是在IBookManager中仍要导入Book类。系统会自动生成一个IBookManager.java类,此类继承IInterface接口,同时它自己也是一个接口。它声明了一个内部类Stub,这个Stub是一个Binder类,当客户端和服务端都位于同一个进程时,方法调用不会走跨进程的transact过程,而当两者位于不同进程时,方法需走transact过程,这个逻辑是由Stub的内部代理类Proxy来完成。
当客户端发起远程请求时,由于当前线程会被挂起直至服务端进程返回数据,所以如果是耗时操作,那么不能再UI线程中发起此远程请求;由于服务端的Binder方法运行在Binder线程池中,所以Binder方法不管是否耗时都应该采用同步方式去实现。
Binder中还有两个重要方法linkToDeath和unlinkToDeath。这两个方法用在服务端进程的异常终止。
使用AIDL进行进程间通信:
1.服务端
服务端首先创建一个Service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在这个AIDL中申明,最后在Service中实现这个AIDL接口。
2.客户端
绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转换成AIDL接口所属的类型,接着就可以调用AIDL中的方法。
3.AIDL接口的创建
AIDL文件支持的数据类型
·基本数据类型;
·String和CharSequence;
·List:只支持ArrayList,里面每个元素都必须能够被AIDL支持;
·Map:只支持HashMap,里面每个元素都必须能够被AIDL支持,包括key和value;
·Parcelable:所有实现了Parcelable的对象;
·AIDL:所有AIDL接口本身;
4.远程服务端Service实现
5.客户端的实现
使用AIDL中可以使用Binder连接池来实现多个服务同时运行的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: