文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

HarmonyOS IDL跨进程通信实现

2024-12-02 23:49

关注

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

简介

IDL跨进程通信,简单来说就是让你在一个APP中可以与另一个APP进行通信。

首先一点,跨进程通信,就是要有两个应用,一个作为服务端server,另一个作为客户端client。

接下来将带领大家实现一个简单的计算功能

首先在一个新项目中,创建两个moudle,rpcserver和rpcclient通信作为服务端和客户端,新建时记得选择EmptyAbility(Java)哦。


在rpcserver中新建一个ServiceAbility


那么重点要来了,这时候需要再创建一个IDL文件,打开rpcserver,点击任意目录创建即可。


创建完成后,系统会将新创建的IDL文件放在指定的目录下,该目录由系统自动生成。


打开IDL文件,添加一个addNumber方法。

  1. int addNumber([inint numA, [inint numB); 

打开rpcclient,和rpcserver一样,创建一个名称相同的IDL文件,当然文件中的addNumber方法也需要保持一致 。另外注意一点,IDL文件添加完成后,需要执行gradle中的compileDebugIdl命令。


这样系统就会自动给我们生成IDL需要连接需要用到的工具类。


现在准备工作已经完成,下一步就是客户端给服务端传参数,服务端根据参数返回计算结果的过程

客户端代码

  1.  
  2. public class MainAbilitySlice extends AbilitySlice { 
  3.  
  4.     @Override 
  5.     public void onStart(Intent intent) { 
  6.         super.onStart(intent); 
  7.         super.setUIContent(ResourceTable.Layout_main_blility); 
  8.         // 数字输入框A 
  9.         TextField numFieldA = (TextField) findComponentById(ResourceTable.Id_numA); 
  10.         // 数字输入框B 
  11.         TextField numFieldB = (TextField) findComponentById(ResourceTable.Id_numB); 
  12.         // 开始通信按钮 
  13.         Component component = findComponentById(ResourceTable.Id_start); 
  14.         component.setClickedListener(new Component.ClickedListener() { 
  15.             @Override 
  16.             public void onClick(Component component) { 
  17.                 int numA = numFieldA.getText() == null ? 0 : Integer.parseInt(numFieldA.getText()); 
  18.                 int numB = numFieldB.getText() == null ? 0 : Integer.parseInt(numFieldB.getText()); 
  19.                 // 执行通信 
  20.                 execute(numA, numB); 
  21.             } 
  22.         }); 
  23.     } 
  24.  
  25.      
  26.     public void execute(int numA, int numB){ 
  27.         Intent intent = new Intent(); 
  28.         ElementName elementName = new ElementName( 
  29.         ""
  30.         "org.rpc.server",//这个值为rpcserver下config中的bundleName 
  31.         "ohos.samples.rpcserver.ServiceAbility");//这个值为rpcserver下对应的ServiceAbility 
  32.         intent.setElement(elementName); 
  33.         connectAbility(intent, new IAbilityConnection() { 
  34.             @Override 
  35.             public void onAbilityConnectDone(ElementName elementName, IRemoteObject remoteObject, int resultCode) { 
  36.                 TestConnectProxy testConnectProxy = new TestConnectProxy(remoteObject); 
  37.                 try { 
  38.                     // 调用server获取计算结果 
  39.                     int sum = testConnectProxy.addNumber(numA, numB); 
  40.                     // 将计算结果显示到text组件上 
  41.                     ((Text) findComponentById(ResourceTable.Id_text_result)).setText("计算结果为:" + sum); 
  42.                 } catch (RemoteException e) { 
  43.                     e.printStackTrace(); 
  44.                 } 
  45.             } 
  46.  
  47.             @Override 
  48.             public void onAbilityDisconnectDone(ElementName elementName, int resultCode) { 
  49.                 System.out.println("------resultCode = " + resultCode); 
  50.             } 
  51.         }); 
  52.     } 

服务端代码

  1.  
  2. public class ServiceAbility extends Ability { 
  3.     @Override 
  4.     protected IRemoteObject onConnect(Intent intent) { 
  5.         return new TestConnectStubImpl("starting ICalculatorInterface"); 
  6.     } 
  7.      
  8.     private class TestConnectStubImpl extends TestConnectStub { 
  9.         public TestConnectStubImpl(String descriptor) { 
  10.             super(descriptor); 
  11.         } 
  12.          
  13.         @Override 
  14.         public int addNumber(int numA, int numB) { 
  15.             return numA + numB; 
  16.         } 
  17.     } 

终于到了检验成果的时刻,先运行rpcserver, 运行后,再运行rpcclient,任意输入两个数字,比如33和55,然后点击开始通信,这时计算结果显示为88,通信成功~!

到此一个简单的IDL通信demo已经完成了

最后附上源码,感兴趣的小伙伴可以下载体验

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

来源:鸿蒙社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯