android ApiDemo学习(一)service——5 Remote Service Binding

可参考: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

 

你可能感兴趣的:(c,android,service,report,kill,binding)