一、无论是否是跨进程调用,以及不论是否在主线程bindService,onServiceConnected/onServiceDisconnected 都是在主线程执行;
二、如果是跨进程调用
1.客户端调服务端中的方法,不管客户端是否在主线程调用,服务端在binder线程中执行;
2.服务端回调客户端方法:
1)在服务端直接调用(没有开启子线程),客户端回调方法在调用服务端方法对应线程(主线程也一样)执行;
2)在服务端的子线程调用,客户端回调方法在客户端的binder线程中执行;
3)在服务端的子线程调用,客户端回调方法里面再调用服务端方法,服务端方法在服务端对应的那个子线程里面调用;
三、如果不是跨进程,则服务端、客户端都是在调用方法线程中(子线程调用,则被调用端在相应的子线程中,可以简单的看作是普通类之间方法调用)
四、客户端跨进程调用时,如果调用的方法没有用oneway 修饰时,客户端会直接阻塞;如果调用oneway 方法,则不会阻塞;所以跨进程调用时,应尽量避免在主线程中调用服务端方法
五、跨进程调用时,使用RemoteCallbackList 保存客户端回调,使用普通List无法反注册(因为Binder会把客户端传过来的listener 重新生成一个新对象);