当前位置: 首页 > article >正文

Binder使用方式及常见组成及案例分析

Binder 是 Android 核心的跨进程通信IPC机制以一次内存拷贝、内置安全校验、面向对象接口为核心优势是系统服务与应用通信的基石。下面从核心组成、使用方式、实战案例、原理与常见问题四方面完整解析。一、Binder 核心组成C/S 模型Binder 采用经典的Client-Server-ServiceManager三角架构1. 核心角色四大组件ServiceManager服务管家系统唯一的 Binder 注册中心运行于init进程。负责服务注册addService与查询getService如ActivityManagerService、PackageManagerService均在此注册。Server服务端提供具体服务的进程内部持有Binder 实体BBinder实现业务逻辑。对外暴露IBinder接口供客户端绑定与调用。Client客户端发起请求的进程持有Binder 引用BpBinder/Proxy通过代理间接调用服务端方法。Binder Driver内核驱动运行于 Linux 内核是通信的 “中转站”。核心能力mmap 内存映射实现一次拷贝、线程池管理、UID/PID 身份校验、数据转发。2. 关键类与接口Java 层IBinderBinder 通信的顶层接口定义transact()、queryLocalInterface()等核心方法。Binder服务端 Binder 实体的基类实现IBinder是BBinder的 Java 封装。BinderProxy客户端 Binder 引用是BpBinder的 Java 封装通过transact()发送跨进程请求。Parcel跨进程数据序列化容器负责读写基本类型、Parcelable对象、IBinder等。ServiceConnection客户端绑定服务时的回调接口用于获取IBinder对象。3. AIDL 核心生成类自动生成Stub服务端继承的抽象类继承自Binder实现 AIDL 接口处理onTransact()回调。Proxy客户端使用的代理类封装BinderProxy将方法调用转为transact()事务。二、Binder 使用方式两种主流方案方式 1AIDL最常用跨应用 / 跨进程AIDLAndroid Interface Definition Language用于定义跨进程接口编译器自动生成Stub服务端与Proxy客户端代码。步骤 1定义 AIDL 接口ICalculator.aidl// main/aidl/com/example/binder/ICalculator.aidl package com.example.binder; interface ICalculator { int add(int a, int b); int subtract(int a, int b); }支持类型基本类型、String、List、Map、Parcelable自定义对象。步骤 2服务端实现CalculatorService.javapublic class CalculatorService extends Service { private final ICalculator.Stub mBinder new ICalculator.Stub() { Override public int add(int a, int b) { return a b; } Override public int subtract(int a, int b) { return a - b; } }; Override public IBinder onBind(Intent intent) { return mBinder; // 返回Binder实体 } }注册 ServiceAndroidManifest.xmlservice android:name.CalculatorService android:process:remote/ !-- 独立进程 --步骤 3客户端调用ClientActivity.javaprivate ICalculator mService; private ServiceConnection mConn new ServiceConnection() { Override public void onServiceConnected(ComponentName name, IBinder service) { mService ICalculator.Stub.asInterface(service); // 获取代理 try { int result mService.add(10, 20); // 跨进程调用 } catch (RemoteException e) { e.printStackTrace(); } } Override public void onServiceDisconnected(ComponentName name) { mService null; } }; // 绑定服务 Intent intent new Intent(this, CalculatorService.class); bindService(intent, mConn, BIND_AUTO_CREATE);方式 2原生 Binder单应用多进程轻量直接继承android.os.Binder无需 AIDL适合同应用内通信。服务端LocalService.javapublic class LocalService extends Service { public class LocalBinder extends Binder { public String getMessage() { return Hello from LocalService; } } private final IBinder mBinder new LocalBinder(); Override public IBinder onBind(Intent intent) { return mBinder; } }客户端LocalClient.javaServiceConnection conn new ServiceConnection() { Override public void onServiceConnected(ComponentName name, IBinder service) { LocalService.LocalBinder binder (LocalService.LocalBinder) service; String msg binder.getMessage(); // 直接调用 } }; bindService(new Intent(this, LocalService.class), conn, BIND_AUTO_CREATE);三、完整案例跨进程图书管理AIDLParcelable1. 定义 Parcelable 对象Book.javapublic class Book implements Parcelable { public int id; public String name; // 当一个 Book 对象从另一个进程传过来时系统会把它变成一堆二进制数据存在 Parcel 里。 protected Book(Parcel in) { id in.readInt(); name in.readString(); } /** CREATOR 是系统用来 “自动重建对象” 的工具人 Android 系统在跨进程传输对象时必须靠 CREATOR 才能把二进制数据还原成 Book 对象。 它干两件事 createFromParcel调用上面的 Book(Parcel in) 把数据还原成对象。 newArray用来创建数组比如跨进程返回 ListBook 时需要。 **/ public static final CreatorBook CREATOR new CreatorBook() { Override public Book createFromParcel(Parcel in) { // 调用上面的“拆包”构造方法 return new Book(in); } Override public Book[] newArray(int size) { return new Book[size]; } }; Override public int describeContents() { return 0; } // 从二进制数据里把 id 和 name 读出来重新拼成一个 Book 对象。 Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeString(name); } }2. AIDL 接口IBookManager.aidlpackage com.example.binder; parcelable Book; // 声明Parcelable类型 interface IBookManager { void addBook(in Book book); ListBook getBookList(); }3. 服务端BookService.javapublic class BookService extends Service { private ListBook mBooks new ArrayList(); private final IBookManager.Stub mBinder new IBookManager.Stub() { Override public void addBook(Book book) { mBooks.add(book); } Override public ListBook getBookList() { return mBooks; } }; Override public IBinder onBind(Intent intent) { return mBinder; } }4. 客户端调用// 绑定后获取代理 IBookManager service IBookManager.Stub.asInterface(binder); service.addBook(new Book(1, Android开发艺术探索)); ListBook books service.getBookList();四、Binder 通信流程核心原理注册Server 创建BBinder实体通过addService()注册到ServiceManager。查询Client 通过getService()向ServiceManager请求服务获取BpBinder代理。调用Client 调用代理方法→transact()→驱动→ServeronTransact()→执行逻辑→返回结果→驱动→Client。内存驱动通过 mmap 映射内核缓冲区实现一次拷贝提升效率。

相关文章:

Binder使用方式及常见组成及案例分析

Binder 是 Android 核心的跨进程通信(IPC) 机制,以一次内存拷贝、内置安全校验、面向对象接口为核心优势,是系统服务与应用通信的基石。下面从核心组成、使用方式、实战案例、原理与常见问题四方面完整解析。一、Binder 核心组成&…...

Redis:延迟双删的适用边界与落地细节诒

pagehelper整合 引入依赖com.github.pagehelperpagehelper-spring-boot-starter2.1.0compile编写代码 GetMapping("/list/{pageNo}") public PageInfo findAll(PathVariable int pageNo) {// 设置当前页码和每页显示的条数PageHelper.startPage(pageNo, 10);// 查询数…...

TMS320F28335实战:IQmath库在实时控制系统中的高效应用

1. TMS320F28335与IQmath库的黄金组合 第一次接触TMS320F28335这款DSP芯片时,我就被它的实时处理能力震撼到了。作为TI C2000系列的明星产品,28335凭借150MHz主频和硬件浮点运算单元(FPU),在电机控制、数字电源这些对实时性要求苛刻的领域简直…...

死细胞去除磁珠如何优化细胞实验质量?

一、死细胞为何影响实验结果可靠性?在细胞培养及组织样本制备过程中,不可避免地存在一定比例的死细胞。这些死亡细胞不仅占用培养空间和营养资源,更重要的是会释放胞内内容物,包括蛋白酶、核酸酶及活性氧等,对活细胞造…...

别再手动画甘特图了!3分钟学会用Excel条件格式自动生成(含节假日设置技巧)

别再手动画甘特图了!3分钟学会用Excel条件格式自动生成(含节假日设置技巧) 项目管理中,甘特图是展示任务进度和时间安排的重要工具。传统手动绘制甘特图不仅耗时耗力,而且难以应对频繁的日期调整。今天,我将…...

MySQL 重复数据删除语句

方案 1:有自增主键 id(推荐,最安全)假设你的表有主键:id(没有就用方案 2)DELETE a FROM leave_sdxw a JOIN (-- 找出每组重复数据中 最小的id之外的所有记录SELECT tenant_id, sddm, fill_vpdm,…...

LinuxServer.io LibreOffice 容器化部署:从基础搭建到生产级运维实战

1. 为什么选择容器化部署LibreOffice? 在团队协作场景中,文档处理工具就像空气一样不可或缺。但传统办公软件安装包动辄几百MB,跨平台兼容性差,版本升级更是让人头疼。三年前我负责为50人团队部署办公环境时,光是处理不…...

Kali渗透测试环境搭建:一站式部署Docker与ARL资产侦察灯塔

1. Kali渗透测试环境搭建的必要性 渗透测试是网络安全工作中不可或缺的一环,而Kali Linux作为最流行的渗透测试操作系统,内置了数百种安全工具。但原生Kali在实际使用中往往面临工具版本老旧、环境依赖冲突等问题。这时候Docker就派上了大用场 - 它能将每…...

LangChain4j 的 AI Services

LangChain4j 的 AI Services 是一个强大的工具,它旨在简化 Java 应用与大语言模型(LLM)的交互过程,将复杂的 AI 能力封装成清晰、易用的 Java API💡 什么是 AI Services? AI Services 可以被理解为一个“AI…...

归并排序力扣题(leetcode)萍

1.概述在人工智能快速发展的今天,AI不再仅仅是回答问题的聊天机器人,而是正在演变为能够主动完成复杂任务的智能代理。OpenAI的Codex CLI就是这一趋势的典型代表——一个跨平台的本地软件代理,能够在用户的机器上安全高效地生成高质量的软件变…...

突破网盘限速壁垒:本地化直链解析工具的全方位解决方案

突破网盘限速壁垒:本地化直链解析工具的全方位解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...

基于NModbus4的ModbusRTU通信实战:从模拟到开发

1. 环境准备:搭建ModbusRTU开发测试环境 第一次接触ModbusRTU通信时,我花了两天时间才把开发环境搭好。现在回想起来,其实只需要三个关键工具就能快速搭建完整的测试环境:虚拟串口工具、ModbusSlave模拟软件和Visual Studio开发环…...

终极指南:Everything Claude Code JPA模式的AI驱动最佳实践 [特殊字符]

终极指南:Everything Claude Code JPA模式的AI驱动最佳实践 🚀 【免费下载链接】everything-claude-code The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, …...

ZYNQ PS端FFT加速实战:在Xilinx SDK中集成CMSIS-DSP库

1. 为什么要在ZYNQ PS端实现FFT加速? 在嵌入式信号处理领域,快速傅里叶变换(FFT)是最基础也是最关键的算法之一。很多工程师第一次接触ZYNQ平台时,往往会优先考虑使用PL端的FFT IP核来实现加速。但实际项目中&#xff…...

我不是在用 AI 助手,我在把自己的能力沉淀成组织资产婆

1. 什么是 Apache SeaTunnel? Apache SeaTunnel 是一个非常易于使用、高性能、支持实时流式和离线批处理的海量数据集成平台。它的目标是解决常见的数据集成问题,如数据源多样性、同步场景复杂性以及资源消耗高的问题。 核心特性 丰富的数据源支持&#…...

MCP与CLI之争:AI Agent的协议之辩

MCP vs CLI:AI Agent 的协议之辩 2026年2月底到3月,AI 开发者社区爆发了一场关于 AI Agent 工具调用方式的激烈争论。一方说"MCP 已死,CLI 万岁",另一方说"MCP 没死,我们只是太早了"。而飞书、钉钉…...

10.4测试原则-阶段-测试用例设计-调试

一、测试基础知识 00:02 1. 测试原则和方法 01:03 定义:系统测试是为了发现错误而执行程序的过程,成功的测试是发现了至今尚未发现的错误的测试。目的:测试不能保证软件100%无错误,但能降低软件存在问题的…...

GPLT L3-042 ‘污染大亨’暴力DFS只拿1分?聊聊竞赛中‘优化剪枝’的思维起点与常见误区

从暴力DFS到优化剪枝:竞赛选手的算法思维跃迁指南 在程序设计竞赛中,我们常常会遇到这样的困境:面对一道看似只能暴力解决的题目,提交后却只得到可怜的1分。这就像原文作者在GPLT L3-042"污染大亨"题中的遭遇——一个简…...

介绍一下多 Agent 如何实现工作?多个 Agent 之间如何协调和分工?

1. 题目分析 一个 Agent 能做的事情终归有限。当你试图让单个 Agent 去完成一个真正复杂的任务——比如从零开始做一次完整的市场调研并输出 PPT 报告——你会发现它要么因为上下文窗口塞满而"失忆",要么因为角色定位太泛而每一步都做得半吊子。这就像让…...

别再数据线了!用FastAPI 分钟搭个局域网文件+剪贴板神器颂

为 HagiCode 添加 GitHub Pages 自动部署支持 本项目早期代号为 PCode,现已正式更名为 HagiCode。本文记录了如何为项目引入自动化静态站点部署能力,让内容发布像喝水一样简单。 背景/引言 在 HagiCode 的开发过程中,我们遇到了一个很现实的问…...

运维进阶!Zabbix 高可用集群部署实战指南,从零搭建企业级监控系统

1. 为什么需要Zabbix高可用集群? 在企业生产环境中,监控系统的稳定性直接关系到整个IT基础设施的可观测性。想象一下,当你的监控系统突然宕机,所有服务器、网络设备、应用程序的运行状态瞬间"失明",这种场景…...

轻型民用无人机安全操控指南:法规解读与实践应用

1. 轻型民用无人机法规基础解读 第一次接触无人机时,我和很多新手一样兴奋地想要马上起飞,直到在公园被保安拦下才知道需要遵守飞行规则。现在每次看到新手飞友准备"黑飞",我都会主动提醒他们先了解法规。目前我国对轻型民用无人机…...

环形粘结钕铁硼磁钢单边壁厚可以做成多薄?

大家都知道粘结钕铁硼因其独特的性能被广泛使用在电机、电器等产品中,小编接触磁铁一年多了,在这期间,有不少客户问道,你们粘结钕铁硼单边壁厚最小可以做成多薄?在介绍这个问题前,首先介绍下什么是“单边壁…...

技术管理者必看:程序员考核的痛点与解决方案

作为技术管理者,你是否曾为程序员考核而头疼不已?每年或每季度,当绩效评估季来临,你是否也面临以下困境: 难以客观评估每一位程序员的真实贡献? 考核结果总是引发争议,甚至导致团队不满和人才流…...

Redis持久化:从AOF到RDB,如何实现数据不丢失?耐

Qt是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本笔记将重点介绍QSpinBox数值微调组件的常用方法及灵活应用。…...

西门子S7-威纶通触摸屏一拖三恒压供水全套图纸程序设计

一拖三恒压供水全套图纸程序 威纶通触摸屏 西门子s7-搞过恒压供水项目的都知道,最头疼的不是写程序本身,而是怎么让三台水泵像接力赛一样丝滑切换。今天咱们拆解一个西门子S7-1200搭配威纶通MT8071iE的典型方案,重点看几个关键代码段。系统…...

vue3 父组件向子组件传参

vue3中父组件向子组件传递参数,核心方案是:父组件用 v-bind 绑定数据,子组件用 defineProps 接收数据(组合式 API 语法)。即:v-bind 传 (父) defineProps 收(子&#xff…...

彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组褪

指令替换 项目需求:将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一,测试代码示例 test.c // test.c #includ…...

混合储能系统与光储微网Simulink仿真:下垂控制与2021A以上版本的应用

混合储能系统/光储微网/下垂控制/Simulink仿真 注意版本2021A以上!!!! 由光伏发电系统和混合储能系统构成直流微网。 混合储能系统由超级电容器和蓄电池构成,通过控制混合储能系统来维持直流母线电压稳定。 混合储能系…...

Python 批量导出数据库数据至 Excel 文件页

简介 langchain专门用于构建LLM大语言模型,其中提供了大量的prompt模板,和组件,通过chain(链)的方式将流程连接起来,操作简单,开发便捷。 环境配置 安装langchain框架 pip install langchain langchain-community 其中…...