binder机制可以类比 socket的网络编程理解。
请求方相当于 客户端,被请求的service相当于服务器端,它们
之间的通信是依赖底层的Binder驱动实现的。
被调用的service的会有一个线程监听client的请求调用,服务端接收到这个请求之后 会派发给服务端线程池里面的一条线程来执行[因此 服务端能同时处理的客户端请求是有限度的,线程池里面的线程是有限的]。
所有的AIDL方法都是在服务端的Binder线程池中执行的,也就是说,每一个AIDL方法执行的时候都会在一个服务端的线程池中执行。
当客户端发出请求给服务端之后 会被阻塞住,直到服务端返回结果为止。
客户端通过接口发起一次调用,消息发送到Binder驱动,Binder驱动通知服务端执行这个任务,返回结果给Binder驱动,Binder驱动唤醒客户端线程继续处理。
服务端(Service)通过AIDL回调接口,主动通知客户端(即回调客户端的AIDL接口的方法),该方法会执行在客户端的一个新起的线程中(并不在UI线程),所以此时要更新UI操作,就要切换线程了。
另外,在服务端数据集合一般使用CopyOnWriteArrayList,该类是线程安全的。因为服务端是用一个Binder线程池来处理客户端的各种请求,会存在多个客户端同时访问服务端的情况,数据集合必须实现线程同步。
注意:bindService的时候onServiceConnected回调运行在主线程