Binder之AIDL进程间通信的使用(附源码)
废话不多说,先看代码,再讲原理。
首先我们先搞两个进程出来,一个作为客户端(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进程间通信的使用(附源码)相关推荐
- Android开发之跨进程通讯-AIDL实现方法 (附源码)
先看效果图,下面是广播和AIDL跨进程的方法 我们先创建AIDL文件定义接口方法 定义好接口方法如下图: // ITokenAidlInterface.aidl package com.example ...
- 前后端分离 Spring Boot + Vue 开发网易云QQ音乐(附源码)!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者|xiangzhihong segmentfault.com/ ...
- 牛皮!竟然有大佬基于 Spring Boot + Vue 开发了一套网易云amp;QQ音乐(附源码)。。。...
来源:segmentfault.com/a/1190000021376934 # 前言 虽然 B/S 是目前开发的主流,但是 C/S 仍然有很大的市场需求.受限于浏览器的沙盒限制,网页应用无法满足某些 ...
- C#共享内存实例 附源码
原文 C#共享内存实例 附源码 网上有C#共享内存类,不过功能太简单了,并且写内存每次都从开头写.故对此进行了改进,并做了个小例子,供需要的人参考. 主要改进点: 通过利用共享内存的一部分空间(以下称 ...
- java中batch基础_详解Spring batch 入门学习教程(附源码)
详解Spring batch 入门学习教程(附源码) 发布时间:2020-09-08 00:28:40 来源:脚本之家 阅读:99 作者:achuo Spring batch 是一个开源的批处理框架. ...
- 炫酷,SpringBoot+Echarts实现用户访问地图可视化(附源码)
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 SpringBoot+Echarts用户访问地图可视化 意义 在常 ...
- C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码...
原文:C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github. ...
- 黯然微信小程序杂记(三):微信小程序实现倒计时功能 附讲解教学 附源码
黯然微信小程序杂记(三):微信小程序实现倒计时功能 附超详细注释 附源码 一.功能描述 二.界面展示 三.test.wxml代码 四.test.js代码(注释很详细 很易懂) CSDN私信我,有关微信 ...
- 黯然微信小程序杂记(二):小程序最新版登录并进行缓存模块的实现 附源码
黯然微信小程序杂记(二):小程序最新版登录进行缓存模块的实现 附源码 一.功能描述 二.mine.wxml界面图片 三.mine.wxml代码 四.mine.wxss代码 五.mine.js代码 六. ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码]...
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码] 文件上传这东西说到底有时候很痛,原来的asp.net服务器 ...
最新文章
- thinkphp6 接收不到数据_单片机红外接收与红外发射
- spring-ioc-xml
- python线程与进程
- P3705-[SDOI2017]新生舞会【0/1分数规划,费用流】
- PyCharm和git安装教程
- 癌症精准医疗上市公司泛生子基因 - 内推(名额有限)
- ZZULIOJ 1114: 逆序
- MFC中从一个类向其他类发送消息的方法
- 【codeforces】【比赛题解】#872 CF Round #440 (Div.2)
- 未来的人工智能和 AR/VR 会从哪些方面影响教育?有什么机会?
- 【云存储】企业云存储管理解决方案
- pg数据库的一些问题
- Calendar获取上个月第一天和最后一天,上周第一天和最后一天
- 面试|详细分析ScheduledThreadPoolExecutor(周期性线程池)的原理
- 台电推出疾霆系列高端NVMe SSD,搭载联芸全新主控高速级读写
- JS/ES6-var、let、const用法与区别
- 1068 万绿丛中一点红 (C++)
- kafka启动失败 The Cluster ID doesn‘t match...
- 思科—计算机网络课程设计—第八章DHCP概念测试
- SqlDbx 连接mysql 数据库
热门文章
- 微信小程序装修解决方案ppt_微信小程序开发教程.ppt
- 为什么勒索软件攻击激增?
- 面包师问题--linux实现
- 【通俗向】假设检验(三):卡方检验和t检验
- 身份证识别、驾驶证识别、行驶证识别
- Mybatis从入门到精通(刘增辉)
- 国外变电站3d可视化技术发展_国外沥青路面纵向施工接缝技术的发展
- 西电计算机考研833试题,西电考研辅导班:西安电子科技大学833“计算机学科专业基础综合”复习参考提纲...
- lookupedit可编辑可选择
- idm一个网站不能下载两次?这几个办法彻底解决