最近集中看了一下Service,本地那块因为之前有过接触所以没什么问题,主要是关注了一下Service和IntentService的问题,其他的生命周期之类的比较容易所以直接带过.这里主要的就是远程Service,也是就是AIDL的问题.当然实现在网上查了不少的资料,由于是在Android Studio上实现的,所以跟网上大多数教程都不一样,包括创建,实现等等,搞得时间比较长
首先就是AIDL文件的创建,由于AS有着相当完善的自动补全功能,所以直接右键创建即可,
至于说AIDL的规范,或者说是语法,其实跟java差不多,只是有几点区别,1,函数只有返回值,函数名,参数三部分组成,还有基础类型以及集合Map List之类的不需要用import来引用包,但是如果是自定义bean就需要用import引用,因为是在AS上编程,在网上找到的源码都是用Ecilpse写的,在Eclipse中,bean文件是与AIDL放在同一文件夹中,但是在AS中这么写就会报找不到bean文件的错误,只有换到java包中才可以,还有在AS当中需要rebuild一下才会生成对应的interface文件
接下来就是编码,这里做了一个Activity和Serivce相互交互的实验,在一个项目中写的,只有客户端和服务端,客户端即为Activity, 相应的服务端就是Service,首先在Acitvity中我们需要实现ActivityAIDL的接口,因为是相互交互,所以不止服务端需要AIDL,客户端也需要AIDL,其实通信本质上都是利用了Binder通信,所以我们创建的这个ActivityAIDL.Stub的实例其实也是IBinder的实例之后由我们客户端主动发起链接,发起链接需要三个参数,intent,serviceConnection,flag(0代表双向,1代表单向) Service有一个onbind()方法,返回一个binder值,这个binder是ServiceAIDL.Stub的实例,这个binder被serviceConnection中的方法接收.
这样就通过AIDLService.Stub.asInterface(service)到了服务端的binder实例,即可以对服务端的数据进行操作,如果此时将客户端的ActivityAIDL.Stub实例传入到Service当中,就可以进行双向通信。