废话不多说,先看代码,再讲原理。
首先我们先搞两个进程出来,一个作为客户端(client)一个作为服务端(service)。

在客户端和服务的分别创建一个AIDL接口,可以用如下方式进行创建,需要注意的是,两端创建的接口必须保证完全一致,包括他们的包名,这里的包名可能需要手动去修改一下,不一致的话运行时会抛出如下异常 “Binder invocation to an incorrect interface” 。

创建完接口之后我们点击一下下面这个锤子,来打造一下这个工程,这样在build目录下就会自动生成我们需要的文件了。


我的AIDL接口是这么定义的:

interface IMyAidlInterface {void sendMessage(in String msg);String getMessage();
}

定义完接口之后我们去服务端启动一个服务,直接在MainActivity里启动

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);startService(new Intent(this, AiService.class));}
}

service的内容也很简单,直接在onBind的时候处理就好了

public class AiService extends Service {private static final String TAG = "AiService";private String message;@Nullable@Overridepublic IBinder onBind(Intent intent) {Log.d(TAG, "onBind: ");return iBinder;}private IBinder iBinder = new IMyAidlInterface.Stub() {@Overridepublic void sendMessage(String msg) throws RemoteException {message = "  "+msg +"  " + "被service处理了";Log.d(TAG, "sendMessage: "+msg);}@Overridepublic String getMessage() throws RemoteException {Log.d(TAG, "getMessage: "+message);return message;}};@Overridepublic void onCreate() {super.onCreate();Log.d(TAG, "onCreate: ");}
}

做完这些服务端就完成了,不要忘记在清单文件中添加我们的服务,并设置可以为其他进程所利用

        <service android:name=".service.AiService"android:exported="true"/>

接下来我们来写客户端,直接一个在activity使用,这个代码结构就非常简单了,我们在这个进程中发送一个字符串,然后在service进程对这个字符串处理,处理完成后我们再获取处理后的字符串,实现一个这么简单的功能。

public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";private IMyAidlInterface myAidl;private Button bt;private TextView tv;private EditText et;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();bindService();}private void initView() {bt = (Button)findViewById(R.id.button);tv = (TextView)findViewById(R.id.message);et = (EditText)findViewById(R.id.et_1);bt.setOnClickListener(v -> {Log.d(TAG, "initView: bt按了" );try {myAidl.sendMessage(et.getText().toString());tv.setText(myAidl.getMessage());} catch (RemoteException e) {e.printStackTrace();}});}private void bindService() {Intent intent = new Intent();intent.setComponent(new ComponentName("com.tiancong.myaidl1","com.tiancong.myaidl1.service.AiService"));bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);}private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.d(TAG, "onServiceConnected: ");myAidl = IMyAidlInterface.Stub.asInterface(service);}@Overridepublic void onServiceDisconnected(ComponentName name) {myAidl = null;}};
}

运行结果:


这样我们就完成了进程间的通信。下面附上源码,如果对AIDL的使用还有什么不理解欢迎关注我的微信公众号,我们来一起进行讨论。

Binder之AIDL进程间通信的使用(附源码)相关推荐

  1. Android开发之跨进程通讯-AIDL实现方法 (附源码)

    先看效果图,下面是广播和AIDL跨进程的方法 我们先创建AIDL文件定义接口方法 定义好接口方法如下图: // ITokenAidlInterface.aidl package com.example ...

  2. 前后端分离 Spring Boot + Vue 开发网易云QQ音乐(附源码)!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者|xiangzhihong segmentfault.com/ ...

  3. 牛皮!竟然有大佬基于 Spring Boot + Vue 开发了一套网易云amp;QQ音乐(附源码)。。。...

    来源:segmentfault.com/a/1190000021376934 # 前言 虽然 B/S 是目前开发的主流,但是 C/S 仍然有很大的市场需求.受限于浏览器的沙盒限制,网页应用无法满足某些 ...

  4. C#共享内存实例 附源码

    原文 C#共享内存实例 附源码 网上有C#共享内存类,不过功能太简单了,并且写内存每次都从开头写.故对此进行了改进,并做了个小例子,供需要的人参考. 主要改进点: 通过利用共享内存的一部分空间(以下称 ...

  5. java中batch基础_详解Spring batch 入门学习教程(附源码)

    详解Spring batch 入门学习教程(附源码) 发布时间:2020-09-08 00:28:40 来源:脚本之家 阅读:99 作者:achuo Spring batch 是一个开源的批处理框架. ...

  6. 炫酷,SpringBoot+Echarts实现用户访问地图可视化(附源码)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 SpringBoot+Echarts用户访问地图可视化 意义 在常 ...

  7. C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码...

    原文:C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github. ...

  8. 黯然微信小程序杂记(三):微信小程序实现倒计时功能 附讲解教学 附源码

    黯然微信小程序杂记(三):微信小程序实现倒计时功能 附超详细注释 附源码 一.功能描述 二.界面展示 三.test.wxml代码 四.test.js代码(注释很详细 很易懂) CSDN私信我,有关微信 ...

  9. 黯然微信小程序杂记(二):小程序最新版登录并进行缓存模块的实现 附源码

    黯然微信小程序杂记(二):小程序最新版登录进行缓存模块的实现 附源码 一.功能描述 二.mine.wxml界面图片 三.mine.wxml代码 四.mine.wxss代码 五.mine.js代码 六. ...

  10. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码]...

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码] 文件上传这东西说到底有时候很痛,原来的asp.net服务器 ...

最新文章

  1. thinkphp6 接收不到数据_单片机红外接收与红外发射
  2. spring-ioc-xml
  3. python线程与进程
  4. P3705-[SDOI2017]新生舞会【0/1分数规划,费用流】
  5. PyCharm和git安装教程
  6. 癌症精准医疗上市公司泛生子基因 - 内推(名额有限)
  7. ZZULIOJ 1114: 逆序
  8. MFC中从一个类向其他类发送消息的方法
  9. 【codeforces】【比赛题解】#872 CF Round #440 (Div.2)
  10. 未来的人工智能和 AR/VR 会从哪些方面影响教育?有什么机会?
  11. 【云存储】企业云存储管理解决方案
  12. pg数据库的一些问题
  13. Calendar获取上个月第一天和最后一天,上周第一天和最后一天
  14. 面试|详细分析ScheduledThreadPoolExecutor(周期性线程池)的原理
  15. 台电推出疾霆系列高端NVMe SSD,搭载联芸全新主控高速级读写
  16. JS/ES6-var、let、const用法与区别
  17. 1068 万绿丛中一点红 (C++)
  18. kafka启动失败 The Cluster ID doesn‘t match...
  19. 思科—计算机网络课程设计—第八章DHCP概念测试
  20. SqlDbx 连接mysql 数据库

热门文章

  1. 微信小程序装修解决方案ppt_微信小程序开发教程.ppt
  2. 为什么勒索软件攻击激增?
  3. 面包师问题--linux实现
  4. 【通俗向】假设检验(三):卡方检验和t检验
  5. 身份证识别、驾驶证识别、行驶证识别
  6. Mybatis从入门到精通(刘增辉)
  7. 国外变电站3d可视化技术发展_国外沥青路面纵向施工接缝技术的发展
  8. 西电计算机考研833试题,西电考研辅导班:西安电子科技大学833“计算机学科专业基础综合”复习参考提纲...
  9. lookupedit可编辑可选择
  10. idm一个网站不能下载两次?这几个办法彻底解决