2026/4/17 0:22:49
网站建设
项目流程
如何做财经网站,四川公司网站建设招标,wordpress物流企业主题,2022拉新推广平台业务逻辑语境中#xff0c;实现Service onBInd的那个app进程是服务端。技术上#xff0c;A进程调用B进程的方法#xff0c;B就是服务端#xff1b;B调用A传递过来的callback方法#xff0c;A就是服务端。aidl接口参数的in out修饰符看的是技术上的服务端#xff0c;数据流…业务逻辑语境中实现Service onBInd的那个app进程是服务端。技术上A进程调用B进程的方法B就是服务端B调用A传递过来的callback方法A就是服务端。aidl接口参数的in out修饰符看的是技术上的服务端数据流进就是in数据流出就是out。实际上有更简单明确的理解对于aidl接口的调用方看到in参数就想:我把参数in进去就不用管了对于out参数就想我对这个参数我待会还得out出来用有out参数的方法是同步阻塞的。inout具备双重特性服务端拿到in参数的副本进行访问和修改不会影响到客户端的实参。客户端调用方法时传入out参数是不是实例对象无所谓声明变量名 user null调用xxx(user)由于是out参数没有被binder驱动序列化到服务端服务端拿不到也不关心user里在客户端那边的实例细节服务端拿到的参数是binder驱动给的初始值没有意义服务端创建一个user对象处理好数据赋值给user变量名客户端那边的user变量就引用服务端实际处理的user对象的副本。客户端调用xxx(user)得等服务端xxx方法执行完处理完user数据out参数aidl方法是一个同步阻塞的方法不能用oneway修饰aidl接口原生支持参数类型是基本数据类型和String类型默认都是in。自定义参数类型分为两种一种是bean得声明android.os.Parcelable接口支持binder机制序列化/反序列化一种是回调对象/监听器也得声明为aidl interface自定义参数类型最好显示声明in outoneway修饰的方法是异步的不能有返回值只能有in参数调用处不用等待服务端方法实现处的执行结束。不加oneway默认是同步阻塞的就像普通的方法调用一样无论有无返回值调用处都得等这个远程方法执行完服务端方法执行完才走调用处后续代码。aidl接口实现跨进程通信是靠Android的binder机制跨进程调用时要经过内核的binder驱动。服务端进程在内核binder驱动中映射一块缓存binder内存映射技术服务端可以访问。客户端通过binder驱动copy一次数据到缓存区服务端就可以访问。如果aidl接口的调用方和实现方在一个进程内就不用走内核的binder驱动。binder机制是Android系统中跨进程通信的核心Broadcast、ContentProvider等都是依赖binder机制。aidl接口也是。服务端定义aidl接口文件Do.aidl会被编译为一个java类里面有接口存根Stub里面定义abc三个方法由上到下顺序在Service onBind中实现Do.stub中的abc方法并返回binder对象。客户端bindService异步请求绑定服务端service连接回调走的是ServiceConnection中的方法。在什么线程调用bindService客户端收到的连接回调就走在什么线程。bindService时如果service端没有起来会被拉起。建立连接后系统会维护这个binder连接如果服务端crash挂掉系统会拉起服务端保证连接的健壮性一个项目的实践经验有待确认客户端通过ServiceConnection的onServiceConnected方法拿到客户端binder对象的引用通过Do.Stub.asInterface(binder)转化为程序里面可调abc方法的binder代理对象。服务端和客户端都得有Do.aidl文件双方都才能访问abc方法。互相复制一份相同的aidl文件或者一方打包sdk给另一方集成注意aidl的版本管理aidl文件要具有包名.类名唯一性Binder驱动会对双方的aidl文件里面定义的方法abc按照顺序进行编号编号-映射服务端对方法的实现。客户端调用方法时传递方法编号附带数值/可序列化的数据包作为参数到Binder驱动中binder驱动进行编号方法名映射序列化/反序列化处理。双方的aidl文件是相同的都是包名.类名、方法定义、顺序都是一样的举例编号1-a,2-b,3-c。最好双方aidl定义都一样保持版本同步。如果服务端的aidl定义供很多客户端使用下次改版时如果只是针对某个app aClient不想大面积修改发版增加一个方法d得追加到最后aidl文件同步给这个aClient这个aClient和服务端都有编号1-a,2-b,3-c,4-d其他客户端使用老版本aidl接口仍然是1-a,2-b,3-c都可以编号方法映射正确。如果双发都是1-a,2-b,3-c现在服务端要改b为e那么服务端1-a,2-e,3-c客户端没改aidl定义那么客户端仍然是1-a,2-b,3-c。那么客户端调用b时告知binder驱动编号2而在服务端2映射e方法参数列表也可以能不一致最终调用错乱不符合业务逻辑。aidl方法调用按照编号映射方法而不是方法名匹配。当同一套aidl接口涉及多端时一定注意版本控制。注意同步/追加方法绝对不能单方修改方法顺序Binder驱动为服务端维护一个线程池方法的调用是在那个线程时客户端的先择服务端作为方法的实现端被客户端调用时方法执行在服务端binder线程中。