Android自定义binder实现进程间通信

        通过binder建立进程间通信,主要分为两步:

        1. 定义一个binder的服务(在androidManifest.xml中声明)接受远端请求。 

         服务中创建一个binder实例, 在接收到客户端的连接时,向请求方返回回binder的引用。重写Binder的onTransact方法,处理来自远端的调用消息。

public class MyService extends Service {private static final String TAG = "MyService";@Overridepublic IBinder onBind(Intent intent) {OLog.i(TAG, "onBind");return myBinder;}Binder myBinder = new Binder() {@Overrideprotected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {switch (code) {case RemoteProtocal.CODE_ADD: {int a = data.readInt();int b = data.readInt();int result = add(a, b);reply.writeInt(result);return true;}}return super.onTransact(code, data, reply, flags);}};public int add(int a, int b) {return a + b;}
}

        2. 调用bindService方法,根据Binder服务名称建立与服务的连接。 

        连接成功后, 可以获得远程服务中binder的引用。通过该引用即可调用其binder.transact方法与远端进行通信。 transact有三个个关键参数,分别是消息的命令码、入参及返回值的引用。

private void bindRemoteService() {// 远程服务具体名称ComponentName componentName = new ComponentName(this, "com.me.obo.mybinder.server.MyService");Intent intent = new Intent();intent.setComponent(componentName);// 绑定到服务bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);}ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {///绑定成功后, 获取binder的引用mBinder = iBinder;tvConnectState.setText("Connected");}@Overridepublic void onServiceDisconnected(ComponentName componentName) {}};private int add(int a, int b) {Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();// 写入参数 adata.writeInt(a);// 写入参数 bdata.writeInt(b);try {//通过mbinder代理 调用远程服务mBinder.transact(RemoteProtocal.CODE_ADD, data, reply, 0);// 获取远程计算结果int result = reply.readInt();OLog.i(TAG, "result = " + result);return result;} catch (RemoteException e) {e.printStackTrace();}return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt - 信号和槽

目录 一、信号 二、槽 三、信号和槽的使用 (一) 连接信号和槽 (二) 自定义槽 (三) 通过 Qt Creator生成信号槽代码 (四) 自定义信号 四、带参数的信号和槽 五、信号与槽的断开 六、Qt4版本信号与槽的连接 (一) Qt4版本信号与槽连接的优缺点 一、信号 在 Qt 中&…

【简单模拟】第十二届蓝桥杯省赛第二场C++ B组《特殊年份》(C++)

【题目描述】 今年是 2021 年,2021 这个数字非常特殊,它的千位和十位相等,个位比百位大 1,我们称满足这样条件的年份为特殊年份。 输入 5 个年份,请计算这里面有多少个特殊年份。 【输入格式】 输入 5 行&#xff…

​Ubuntu20.04 创建新的用户​

1、了解Linux目录结构 推荐看一下:https://www.runoob.com/linux/linux-system-contents.html Linux支持多个用户进行操作的,这样提高了系统的安全性,也可以多人共用一个系统,不过要注意的是系统中安装的软件相关路径&#xff0…

CubeMX使用教程(5)——定时器PWM输出

本篇我们将利用CubeMX产生频率固定、占空比可调的两路PWM信号输出 例如PA6引脚输出100Hz的PWM;PA7引脚输出500Hz的PWM,双路同时输出 我们还是利用上一章定时器中断的工程进行学习,这样比较方便 首先打开CubeMX对PA6、PA7进行GPIO配置 注&a…

Mixamo动画素材导入UE5的最简单方法

一、Mixamo素材 官网:https://www.mixamo.com/ Mixamo是Adobe公司出品的免费动画库,可商用。软件分为characters(角色)、Animations(动画)两个部分。 二、辅助工具MIXAMO CONVERTER 官网:https://terribilisstudio…

Android中MultiDex优化

MultiDex基本思路 当一个Dex文件太肥的时候(方法数目太多、文件太大),在打包或在安装或运行apk也会出问题。 解决方法就是将这个硕大的Dex文件拆分成若干个小的Dex文件。 刚好一个ClassLoader可以有多个DexFile。 MultiDex主要性能瓶颈 解压缩和Dex优化(…

架构师面试问与答

你如何评估和选择合适的分布式缓存方案以提高系统性能? 我会考虑使用分布式缓存系统,如Redis、Memcached等,并根据系统需求和负载情况选择合适的缓存方案。 请简要描述一下你对服务发现和服务注册的理解以及在软件架构中的应用。 服务发现和…

SplitFunctions (BOLT) - 优化阅读笔记

将函数拆分成更小的代码片段,从而执行更激进的代码段重排的优化 在文件 bolt/lib/Passes/SplitFunctions.cpp 相关选项释义默认-split-all-cold尽可能多的分离冷的基本块false-split-align-threshold对齐参数2-split-functions主要功能选项, 分离函数到代码片段fa…

Codeql复现CVE-2018-11776学习笔记

基本使用 1、首先下载struts2漏洞版本源码: https://codeload.github.com/apache/struts/zip/refs/tags/STRUTS_2_3_20 2、构建codeql数据库(构建失败文末有解决办法): codeql database create ~/CodeQL/databases/struts2-2.3.…

C#与WPF通用类库

个人集成封装,仓库已公开 NetHelper 集成了一些常用的方法; 如通用的缓存静态操作类、常用的Wpf的ValueConverters、内置的委托类型、通用的反射加载dll操作类、Wpf的ViewModel、Command、Navigation、Messenger、部分常用UserControls(可绑定的Passwo…

通信总线协议之CAN-FD协议详解

文章目录 通信总线之CAN-FD总线协议详解1. CAN-FD 简介1.1 什么是CAN FD1.2 CAN FD的特点 2. CAN-FD总线协议2.1 帧起始2.2 仲裁段2.3 控制段2.4 数据段2.5 CRC段2.6 ACK段2.7 帧结束 3. 如何从传统的CAN升级到CAN FD 通信总线之CAN-FD总线协议详解 1. CAN-FD 简介 1.1 什么是…

selenium高级应用

常见控件应用 复杂的控件操作1.操作Ajax选项2.滑动滑块操作 WebDriver的特殊操作元素class值包含空格property、attribute、text的区别定位动态id 截图功能页面截图页面截图,返回截图的二进制数据页面截图,返回base64的字符串截取指定元素。先定位元素&a…

Vue3:toRef和toRefs的用法

一、情景说明 我们知道,Vue3中想要定义对象类型的响应式数据 可以通过reactive函数实现 如果,后端返回的对象,有很多的字段,我们想进行结构化赋值 但是,又想保证赋值后的变量也是响应式数据 那么,这个时候…

算法进阶之路:十大经典排序算法详解与实践

算法进阶之路:十大经典排序算法详解与实践 在计算机科学的世界里,排序算法是基础且至关重要的一环。无论是数据库查询、数据分析还是日常的编程任务,高效的排序算法都能显著提升程序的性能。本文将带你深入了解十大经典排序算法,…

BeyondCompared4提示“缺少评估信息或损坏”修复

BeyondCompared4提示“缺少评估信息或损坏”修复 使用 beyond compare4,在安装的30天后,出现“缺少评估信息”、“评估信息损坏”的提示 解决方法如下(Win11下亲测可行) 按 WinR 进入 打开Windows命令运行框,输入cmd …

Redis常见数据类型下

目录 Hash 哈希 常用指令 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET 内部编码 Hash类型和关系型数据库 缓存方式对比 List 列表 特点 常用命令 LPUSH LPUSHX RPUSH RPUSHX LRANGE LPOP / RPOP LINDEX LINSERT 阻塞(BLOCK)版…

无人机避障技术

无人机避障技术是现代无人机系统发展的重要组成部分,其核心目标是提升无人机的自主飞行能力,确保其在复杂环境中的安全性。本文将详细介绍无人机避障项目的背景、技术原理、实现过程、应用前景以及面临的挑战,以期为读者提供全面而深入的了解…

【Linux】文件缓冲区|理解文件系统

目录 预备知识 观察现象 第一:携带\n,不使用fork(),打印到显示器 第二:携带\n,使用fork(),打印到显示器 第三:携带\n,使用fork(),打印到文件里 第四:不携…

Android Studio

深入探索集成开发环境的魅力 在数字化和移动化的浪潮下,Android系统凭借其广泛的覆盖范围和深度的定制性,已在全球范围内占据显著的市场份额。为了支撑这一庞大的生态系统,一个强大且灵活的集成开发环境(IDE)应运而生…

如何选择适合的G口大流量服务器?

G口大流量服务器是指接入互联网的带宽达到1Gbps及以上,并且能够提供大量数据传输服务的服务器。那么如何选择适合的G口大流量服务器,RAK部落小编为您整理发布选择适合的G口大流量服务器需要考虑哪些关键点。 选择适合的G口大流量服务器时,应该…