相关问题
PopWindow的效果实现有哪些?
1683浏览 • 1回复 待解决
Binder通信,Binder是实现进程间通信(IPC)的重要机制,它是基础框架的一个核心组件。
1919浏览 • 1回复 待解决
#鸿蒙通关秘籍#跨应用获取超链接类型数据的方法有哪些?
1166浏览 • 1回复 待解决
HarmonyOS 如何实现有符号的数组
962浏览 • 1回复 待解决
现有数据加解密如下:HarmonyOS中如何实现?
1068浏览 • 1回复 待解决
两个UIAbility之间能用哪些方法实现通信?
1998浏览 • 1回复 待解决
HarmonyOS 现有组件扩展如何实现
903浏览 • 1回复 待解决
HarmonyOS 在使用线程池 ,如何获取线程的id和线程方法名
2434浏览 • 1回复 待解决
HarmonyOS 链接不到AVBuffer函数实现
559浏览 • 1回复 待解决
HarmonyOS Factory还有哪些方法?
795浏览 • 0回复 待解决
HarmonyOS线程池使用崩溃
1497浏览 • 1回复 待解决
如果将现有SQLite数据库迁移至ArkData需要哪些步骤?是否兼容标准SQL语法?
528浏览 • 0回复 待解决
#鸿蒙学习大百科#NavPathStack实现返回操作都有哪些方法?
1514浏览 • 1回复 待解决
两个UIAbility之间可通过哪些方法实现数据传递
3496浏览 • 1回复 待解决
HarmonyOS web有加载链接宽度自适应的方法吗
869浏览 • 1回复 待解决
Flutter 热重载方法有哪些?
1303浏览 • 1回复 待解决
语音识别的方法有哪些?
1706浏览 • 1回复 待解决
HarmonyOS 线程池使用策略咨询
1091浏览 • 1回复 待解决
HarmonyOS taskpool线程池数量问题
1558浏览 • 1回复 待解决
Scroller的fling实现有什么好的方案
1726浏览 • 1回复 待解决
HarmonyOS 外部链接怎么样拉起应用,有没有方法?
1114浏览 • 1回复 待解决
文本转语音的方法有哪些?
1441浏览 • 1回复 待解决
Greenplum有哪些通用的处理方法?
4499浏览 • 1回复 待解决
HarmonyOS @ohos.taskpool(启动任务池)
1627浏览 • 1回复 待解决
#鸿蒙通关秘籍#实现c-ares异步解析功能的API方法有哪些?
879浏览 • 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