相关问题
PopWindow的效果实现有哪些?
643浏览 • 1回复 待解决
#鸿蒙通关秘籍#跨应用获取超链接类型数据的方法有哪些?
22浏览 • 1回复 待解决
Binder通信,Binder是实现进程间通信(IPC)的重要机制,它是基础框架的一个核心组件。
757浏览 • 1回复 待解决
Scroller的fling实现有什么好的方案
762浏览 • 1回复 待解决
基于ArkUI现有能力实现自定义弹窗封装方案
809浏览 • 1回复 待解决
HarmonyOS 在使用线程池 ,如何获取线程的id和线程方法名
678浏览 • 1回复 待解决
现有数据加解密如下:HarmonyOS中如何实现?
172浏览 • 1回复 待解决
两个UIAbility之间能用哪些方法实现通信?
637浏览 • 1回复 待解决
HarmonyOS线程池使用崩溃
427浏览 • 1回复 待解决
HarmonyOS Factory还有哪些方法?
102浏览 • 0回复 待解决
可以调用Android现有的库吗
7326浏览 • 1回复 待解决
两个UIAbility之间可通过哪些方法实现数据传递
2166浏览 • 1回复 待解决
#鸿蒙学习大百科#NavPathStack实现返回操作都有哪些方法?
236浏览 • 1回复 待解决
HarmonyOS 外部链接怎么样拉起应用,有没有方法?
191浏览 • 1回复 待解决
request下载文件不能覆盖现有文件
1822浏览 • 1回复 待解决
语音识别的方法有哪些?
482浏览 • 1回复 待解决
Flutter 热重载方法有哪些?
330浏览 • 1回复 待解决
HarmonyOS @ohos.taskpool(启动任务池)
178浏览 • 1回复 待解决
TaskPool后台I/O任务池,应用能否自行做管控?有无方法开放管理机制
1766浏览 • 1回复 待解决
HarmonyOS 如何实现编辑频道编辑管理,添加删除的功能,现有Grid控件如何实现拖动,删除的功能
413浏览 • 1回复 待解决
文本转语音的方法有哪些?
336浏览 • 1回复 待解决
Greenplum有哪些通用的处理方法?
3539浏览 • 1回复 待解决
HarmonyOS线程池周期执行任务
1038浏览 • 1回复 待解决
线程与线程池的个数限制
1675浏览 • 1回复 待解决
OB的资源池是多租户共享吗?
4933浏览 • 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