相关问题
PopWindow的效果实现有哪些?
282浏览 • 1回复 待解决
Binder通信,Binder是实现进程间通信(IPC)的重要机制,它是基础框架的一个核心组件。
372浏览 • 1回复 待解决
Scroller的fling实现有什么好的方案
374浏览 • 1回复 待解决
两个UIAbility之间可通过哪些方法实现数据传递
721浏览 • 1回复 待解决
Greenplum有哪些通用的处理方法?
2057浏览 • 1回复 待解决
TaskPool后台I/O任务池,应用能否自行做管控?有无方法开放管理机制
552浏览 • 1回复 待解决
基于ArkUI现有能力实现自定义弹窗封装方案
158浏览 • 1回复 待解决
OB的资源池是多租户共享吗?
3527浏览 • 1回复 待解决
可以调用Android现有的库吗
5837浏览 • 1回复 待解决
ServiceStack.Redis连接池问题求教各位大佬
1452浏览 • 1回复 待解决
request下载文件不能覆盖现有文件
604浏览 • 1回复 待解决
测试在sdk的module下链接so库后调用c++的方法报错
536浏览 • 1回复 待解决
线程与线程池的个数限制
294浏览 • 1回复 待解决
HarmonyOS线程池周期执行任务
315浏览 • 1回复 待解决
阿里云Redis集群实现细节有哪些?
1591浏览 • 1回复 待解决
postgresql 连接池一般为多大?
3030浏览 • 1回复 待解决
通过PolarDB的诊断报告功能可以实现哪些效果?
1542浏览 • 1回复 待解决
通过PolarDB的空间分析功能可以实现哪些效果?
1180浏览 • 1回复 待解决
通过PolarDB的会话管理功能可以实现哪些效果?
1615浏览 • 1回复 待解决
通过PolarDB的性能洞察功能可以实现哪些效果?
1593浏览 • 1回复 待解决
开发板推荐或购买链接
6896浏览 • 2回复 已解决
数据库连接池是线程安全的吗?
860浏览 • 1回复 待解决
ArkTS实现时钟的方式有哪些?
370浏览 • 1回复 待解决
通过PolarDB的自治中心功能可以实现哪些效果?
1107浏览 • 1回复 待解决
webview和原生进行通信的方式有哪些?怎么实现
650浏览 • 1回复 待解决
本文再次介绍IDL,原因是IDL是一种最常见的进程通信方式,是日常开发中涉及进程通信时首选,所以我们需要额外的强调一下。
如何使用IDL,在这里先回顾下IDL大致流程:首先创建一个service和IDL接口,接着创建一个类继承一个类继承自IDL接口中Stub类并实现Stud中抽象方法,在Service的onConnect方法中返回这个类的对象,然后客户端就可以绑定服务端Service,建立链接后就可以方位远程服务端的方法。
上诉流程即使典型的IDL的使用流程。实际开发中,项目越来越庞大,如果每个IDL都创建service进行绑定,这种操作会无限量的消耗手机资源。针对上诉问题,我们需要减少Service的数量,将所有的IDL放在同一个Service处理。
在这种模式下,整个工作机制是这样的:每个业务模块创建自己的IDL接口并实现此接口,这个时候不同的业务模块之间不能有耦合,所有实现细节我们要单独分开来,然后向服务端提供自己的唯一标识和其他对应的Binder对象;对于服务端来说,只需要一个Service就可以,服务端提供一个queryBinder接口,这个接口能够根据业务模块的特征来返回相应的Binder对象给它们,不同的业务模块根据拿到所需的binder对象后就可以进行远程方法调用。由此可见,Binder链接池主要作用就是将每个业务模块的Binder请求统一转发到远程Service中执行,从而避免了重复创建Service的过程。
使用的核心API
RPC通信
核心代码解释
首先我们先定义两个IDL接口(IHuksCenter.idl和ICompute.idl),其中IHuksCenter接口提供加解密功能。
而ICompute提供计算加法的功能。
现在业务模块的IDL接口定义和实现都已完成,注意这里并没有位每个模块的IDL单独创建Service,接下来就是服务端和BInder链接池的工作了。
首先,为Binder链接池创建IDL接口IRemotePool.idl。
在idl的可执行文件所在文件夹下执行命令 idl -gen-ts -d dir -c dir/IRemotePool.idl。通过命令中生成接口文件、Stub文件、Proxy文件。
接着,为binder链接池创建Service并实现IRemotePool,下面就是queryBinder的具体实现,可以看到请求转发方法实现,当Binder链接池链接上远程无法时,会根据不同模块的标识即binderCode返回不同Binder对象,通过这个Binder对象所执行的操作全部发生在远程服务端。
下面还剩下Binder链接池的具体实现,在它的内部首先它要去绑定远程服务,绑定成功后,客户端就可以通过它的queryBinder方法获取各自对应的Binder,拿到所需Binder以后,不同的业务模块可以各自操作。
binder链接池具体实现已完成,它的好处是显然易见的,针对上面例子,我们只需要创建一个Service就完成多个IDL接口工作。下面就是测试界面了。
实现效果
适配的版本信息
IDE:DevEco Studio 4.0.1.501
SDK:HarmoneyOS 4.0.0.8