以调用faceUnlock过程为例
aidl编写过程就略去了
1.绑定远程服务,在onServiceConnected中调用方法asInterface形成实例
asInterface进去,实际上是生成了一个代理类,一个IBinder的代理类,这个代理类实现了我们预定义的功能接口
2.调用远程服务中的方法,此处是unLock
其实最后调用的是代理类中的unLock方法,因为上面初始化实例的时候,是新建的一个代理类。而这一步,则调用了binder的transact方法。
此处的mRemote,是之前创建代理类时,传进来的IBinder对象,而IBinder对象,是远程服务中的onBind回调的返回值。
继续跟踪上面的mRemote.transact 会一直走到BinderProxy类中的transact方法
而它调用了transactNative方法,从这一步就交给底层驱动去做了
onTransact方法一直回调,走到了mFaceUnlockManager方法的onTransact方法,然后调用unLock,进行解锁
3 总结
所以从一开始,我们连接上远程服务开始,虽然说是创建的代理类,但是实际上就已经从远程服务中获取BinderProxy对象了,然后调用Binder对象去调用服务中的解锁功能。
本地activity调用本地服务,上面的对象(connection中获取的对象和Service的onBind返回的对象)是同一个对象,但是远程的则不一样。
远程时,connection中获取的对象是一个BinderProxy对象,下面是日志。
05-09 13:34:43.237 31843-31843/ming.com.faceunlock I/aaaaaaaaaaaa: mFaceUnlockManagerming.com.faceunlock.FaceUnlockService$1@1fbf855
05-09 13:34:43.276 31892-31892/ming.com.otherapp I/aaaaaaaaaaaa: remoteActivityandroid.os.BinderProxy@d43a70c
这个过程其实跟本应用调用服务中方法的流程相同。