可参考:http://blog.csdn.net/mapdigit/article/details/7707665
我的补充:
原理:
公共:使用AIDL定义公共接口,放在客户端和服务端的src文件夹下。
Service:stub实现公共接口,在onBind中返回这个stub的IBinder
Client:定义ServiceConnection,重写onConnect和onDisconnect函数,分别在s和c建立连接和断开连接时调用。
在onConnect函数中,使用AIDL接口名.stub.asInterface(Service返回的IBinder名),将这个IBinder转化成AIDL接口类型。
调用bindService函数时,就会绑定Service,建立连接。
前提:
——在这个demo中,定义了两个AIDL接口,分别是IRemoteService和Isecondary
——客户端和服务端都在RemoteService.java中,服务端是RemoteService extends Service,客户端是Binding extends Activity
步骤:
点击Bind按钮:client与service连接
Client:调用两个bindService函数,分别连接IRemoteService和ISecondary,参数中填入对应的intent
service:onCreate创建service
调用两次onbind,判断是要连接哪个service,从而返回对应的stub
Client:两个service都连接上了,分别进入对应的两个ServiceConnection的onServiceConnected
onServiceConnected函数中:使用AIDL接口名.stub.asInterface(Service返回的IBinder名),将这个IBinder转化成AIDL接口类型。
第一个ServiceConnetion的onServiceConnected,还调用了第一个Service的函数registerCallback函数。(函数在AIDL文件中没有定义,只有声明,定义在Service端完成)
Service:执行registerCallback函数
点击kill process按钮:client被杀死
Client:调用第二个Sercie的函数getPid
Service:执行getPid函数
Client:杀死自己
进入两个ServiceConnection的onServiceDisconnted函数,两个连接断开
—————————— 过了一会——————————————————
Service:onCreate
调用两次onBind
Client:进入两个ServiceConnection的onServiceConnected,两个服务的连接都建立起来了
onServiceConnected函数中:使用AIDL接口名.stub.asInterface(Service返回的IBinder名),将这个IBinder转化成AIDL接口类型。
第一个ServiceConnetion的onServiceConnected,还调用了第一个Service的函数registerCallback函数
Service:执行registerCallback函数
可以看到,客户端杀死自己后,与service的连接断开了,但过了一会,service会自动创建,再次连接!为什么会这样呢?因为在调用bindService是,最后一个参数指定为Context.BIND_AUTO_CREATE。
点击unbind Service
client:调用第一个Service的函数unregisterCallback函数
service:执行unregisterCallback函数
onDestroy
IRemoteServiceCallback.aidl
在这个demo中,还使用到了另一个aidl接口IRemoteServiceCallback,里面声明了一个方法:valueChanged
IRemoteServiceCallback的实现在客户端,定义了valueChanged函数。调用在service端。
过程:
1 service在onCreate的时候,给自己发了一条REPORT消息。
2 service定义了handler,其中的handleMessage函数中:接收到REPORT消息,就把value值加1(从0开始);然后让每个与本service连接的client调用valueChanged函数,参数为value;然后隔1s又给自己发一个REPORT消息
3 client执行valueChanged函数,给自己发BUMP消息,参数是value
4 client定义了handler,其中的handleMessage函数中:接收到BUMP消息,在textview中显示value
5 service接收到自己发来的REPORT消息,重复2-5