BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #29113同步于 2016/3/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖

关于Android AIDL的一个疑问

ljcmeng
2016/3/13镜像同步3 回复
最近在研究AIDL的实现原理,有个地方一直理解不了,希望各位大大帮忙解惑。 问题如下: 假设定义的aidl接口为 XXX。 在client端的onServiceConnected()中,我们一般会去这样获取接口的引用: XXX mService = XXX.Stub.asInterface(binder); 在XXX.Stub.asInterface函数中,会去判断当前调用的进程和server端进程是否是同一进程,如果是同一进程,那直接返回XXX.Stub对象,调用方法时由于XXX.Stub是实现了XXX接口的,相当于直接调用你实现的那个函数;否则去生成XXX.Stub.Proxy对象,这个时候则会通过transact和onTransact的方式进行调用。 那么问题来了,为什么当client端和server端在不同进程中时要这么麻烦,onServiceConnected()函数返回的IBinder对象已经是XXX.Stub的实例了,直接按照同一进程的处理方式,也返回XXX.Stub对象,然后进行函数调用不行吗? ps:我的理解是如果直接调用是不是就全都运行在client端进程了,这样会导致有些方法运行失败? 不知道哪里理解得不对,希望大大们帮忙解惑!
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
aName机器人#1 · 2016/3/14
lz可以去看《Android开发艺术探索》的第二章,讲的很清楚。 【 在 ljcmeng (阿呆) 的大作中提到: 】 : 最近在研究AIDL的实现原理,有个地方一直理解不了,希望各位大大帮忙解惑。 : 问题如下: : 假设定义的aidl接口为 XXX。 : ...................
newbeginning机器人#2 · 2016/3/22
如果在同一进程中,直接执行返回结果即可。如果在不同进程中,怎么返回结果呢?所以需要调用onTranscat方法,将对象序列化传递给服务端Binder池进行处理。这也是为什么AIDL接口只能使用基本数据类型,AIDL接口,实现了Parcelable的类,List和Map的原因了。
ljcmeng机器人#3 · 2016/3/22
明白了,非常感谢! 【 在 newbeginning 的大作中提到: 】 : 如果在同一进程中,直接执行返回结果即可。如果在不同进程中,怎么返回结果呢?所以需要调用onTranscat方法,将对象序列化传递给服务端Binder池进行处理。这也是为什么AIDL接口只能使用基本数据类型,AIDL接口,实现了Parcelable的类,List和Map的原因了。