Android进程间通信方式之AIDL
Android 进程间通信(IPC)有多种方式,其中 AIDL(Android Interface Definition Language) 是最常用的一种,特别适用于 客户端-服务端(Client-Server)模型,当多个应用或进程需要高效地共享数据或调用方法时,AIDL 是一个很好的选择。
1. AIDL 基本概念
AIDL 允许不同的 Android 进程通过 Binder 机制进行通信。Binder 是 Android 的核心 IPC 机制,它高效、安全,并且支持跨进程对象传递。AIDL 本质上是 定义了一个接口,使得不同进程可以像调用本地方法一样调用远程方法。
AIDL 适用场景
- 当不同进程需要共享数据,并且需要进行方法调用(而不仅仅是发送数据)。
- 需要高性能、低延迟的 IPC 机制(相比 Messenger 或广播)。
- 需要支持多线程访问。
2. AIDL 的工作原理
AIDL 基于 C/S 架构,工作流程如下:
- 定义 AIDL 接口文件(Ixxx.aidl),定义方法签名。
- 编译 AIDL 文件,系统自动生成 Binder 代理类(Stub、Proxy)。
- 服务端实现 AIDL 接口,通过 Stub处理远程调用请求。
- 客户端绑定服务,通过Proxy调用远程方法。
- 数据通过 Binder 传输,完成跨进程通信。
3. AIDL 实践:服务端 & 客户端示例
我们来创建一个 AIDL 服务,提供一个 add(int a, int b) 方法,供客户端调用。
3.1 服务端(Server)实现
- 创建 AIDL 接口
在 app/src/main/aidl/com/example/aidl/IAddService.aidl 文件中:
package com.example.aidl;// 定义 AIDL 接口
interface IAddService {int add(int a, int b); // 远程方法
}
注意:AIDL 只支持以下数据类型:
- 基本类型(int, long, float, boolean 等)
- String、CharSequence
- List(必须是 ArrayList,内部元素类型也要支持 AIDL)
- Map(必须是 HashMap,Key 必须是 String)
- Parcelable(自定义类型需实现 Parcelable)
- 在 Service 中实现 AIDL 接口
新建 AddService.java,继承 Service 并实现 IAddService.Stub。
package com.example.aidl;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;public class AddService extends Service {// 实现 AIDL 接口的 Binderprivate final IAddService.Stub binder = new IAddService.Stub() {@Overridepublic int add(int a, int b) throws RemoteException {return a + b; // 远程方法实现}};@Overridepublic IBinder onBind(Intent intent) {return binder; // 返回 Binder 实现}
}
- 注册 Service 到 AndroidManifest.xml
在 AndroidManifest.xml 中声明 Service,并且要暴露给外部进程(exported=true)
<serviceandroid:name=".AddService"android:exported="true"><intent-filter><action android:name="com.example.aidl.IAddService" /></intent-filter>
</service>
3.2 客户端(Client)实现
- 复制 AIDL 文件
在客户端项目的 app/src/main/aidl/com/example/aidl/ 目录下,新建 IAddService.aidl,确保包名、方法一致。 - 绑定远程 Service
在 MainActivity.java 中,实现 Service 绑定逻辑:
package com.example.aidlclient;import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.aidl.IAddService;public class MainActivity extends AppCompatActivity {private IAddService addService; // AIDL 接口实例private boolean isBound = false; // 绑定状态private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {addService = IAddService.Stub.asInterface(service); // 获取 AIDL 代理对象isBound = true;}@Overridepublic void onServiceDisconnected(ComponentName name) {addService = null;isBound = false;}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btnCalculate = findViewById(R.id.btnCalculate);TextView txtResult = findViewById(R.id.txtResult);// 绑定远程服务Intent intent = new Intent();intent.setComponent(new ComponentName("com.example.aidl", "com.example.aidl.AddService"));bindService(intent, connection, BIND_AUTO_CREATE);btnCalculate.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (isBound && addService != null) {try {int result = addService.add(5, 10);txtResult.setText("Result: " + result);} catch (RemoteException e) {e.printStackTrace();}}}});}@Overrideprotected void onDestroy() {super.onDestroy();if (isBound) {unbindService(connection);isBound = false;}}
}
- 在 AndroidManifest.xml 申请权限
客户端需要 绑定外部 Service,需在 AndroidManifest.xml 中添加:
<uses-permission android:name="android.permission.BIND_EXTERNAL_SERVICE" />
4. 运行流程
- 启动 服务端(Server) 应用,AddService 开始运行。
- 启动 客户端(Client),自动绑定 AddService。
- 点击按钮,客户端调用 add(5, 10),通过 AIDL 远程执行,返回 15。
5. AIDL 关键知识点总结
- Binder 机制:AIDL 基于 Binder 进行 IPC,高效且安全。
- Stub & Proxy:AIDL 自动生成 Stub(服务端实现)和 Proxy(客户端代理)。
- 多进程通信:使用 bindService() 连接远程 Service,返回接口实例。
- 线程安全:AIDL 默认方法在 Binder 线程池中执行,避免 UI 线程阻塞。
6. AIDL 适用场景 & 限制
适用场景:
高频 IPC(高效传输、方法调用)。 客户端-服务端架构(如媒体播放器、后台计算)。 多进程应用(例如插件化)。
限制:
AIDL 需要序列化/反序列化,比 Messenger 更复杂。 方法调用是同步的,可能导致 UI 卡顿(建议使用
Handler切换线程)。 需要考虑线程安全(多个客户端访问 Service 时需加锁)。
7. 总结
AIDL 是 Android 进程间通信的核心方式之一,适用于 高效、多进程数据共享和方法调用。它基于 Binder 机制,通过 Stub & Proxy 让客户端能像调用本地方法一样调用远程方法。合理使用 AIDL,可以实现高效、稳定的跨进程通信。
相关文章:
Android进程间通信方式之AIDL
Android 进程间通信(IPC)有多种方式,其中 AIDL(Android Interface Definition Language) 是最常用的一种,特别适用于 客户端-服务端(Client-Server)模型,当多个应用或进程…...
基于MD5分块哈希的前端图片重复检测方案
一、需求背景 在Web应用中处理用户图片上传时,我们需要解决两个核心问题: 避免重复文件占用存储空间 提升上传效率减少带宽消耗 传统方案直接上传后校验,存在以下缺陷: 重复文件仍然消耗上传时间 服务器重复校验增加计算压力…...
【每日学点HarmonyOS Next知识】Web Header更新、状态变量嵌套问题、自定义弹窗、stack圆角、Flex换行问题
【每日学点HarmonyOS Next知识】Web Header更新、状态变量嵌套问题、自定义弹窗、stack圆角、Flex换行问题 1、HarmonyOS 有关webview Header无法更新的问题? 业务A页面 打开 webivew B页面,第一次打开带了header请求,然后退出webview B页面…...

胜软科技冲刺北交所一年多转港股:由盈转亏,毛利率大幅下滑
《港湾商业观察》施子夫 近期,山东胜软科技股份有限公司(以下简称,胜软科技)递表港交所获受理,独家保荐机构为广发证券(香港)。 在赴港上市之前,胜软科技还曾谋求过A股上市&#x…...

【JavaSE-7】方法的使用
1、方法的概念和使用 1.1、什么是方法 方法(method)是程序中最小的执行单元,类似于 C语言中的函数,方法存在的意义: 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置…...

Modbus TCP转Profibus DP协议转换网关赋能玻璃生产企业设备协同运作
一、案例背景 在玻璃生产行业,自动化控制对提升生产效率与保障产品质量起着决定性作用。一家玻璃生产企业为实现生产过程的精细化管控,引入了先进的自动化控制系统。其中,上位机电脑配备了WINCC组态软件,作为Modbus TCP主站&#…...

Java 大视界 -- Java 大数据在智能政务公共服务资源优化配置中的应用(118)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

C++学习之路,从0到精通的征途:入门基础
目录 一.C的第一个程序 二.命名空间 1.namespace的价值 2.命名空间的定义 3.命名空间使用 三.C的输入与输出 1.<iostream> 2.流 3.std(standard) 四.缺省参数 1.缺省参数的定义 2.全缺省/半缺省 3.声明与定义 五.函数重载 1.参数个数不同 2.参数类型不…...

ADC采集模块与MCU内置ADC性能对比
2.5V基准电压源: 1. 精度更高,误差更小 ADR03B 具有 0.1% 或更小的初始精度,而 电阻分压方式的误差主要来自电阻的容差(通常 1% 或 0.5%)。长期稳定性更好,分压电阻容易受到温度、老化的影响,长…...

Gartner发布2025年网络安全六大预测
文章目录 前言趋势1:生成式AI推动数据安全计划趋势2:管理机器身份趋势3:战术型AI趋势4:优化网络安全技术趋势5:扩大安全行为与文化计划的价值趋势6:应对网络安全倦怠 前言 Gartner发布2025年网络安全六大预…...
C#批量压缩并上载CSV数据文件到Box企业云盘
C# .NET 8实现Windows下批量压缩csv文件为zip文件,然后异步上传到box企业云服务网盘路径,实现异常处理和写入运行状态日志,参数来自ini配置文件。 C# .NET 8代码示例,包含INI配置读取、CSV文件压缩、Box上传、异步处理和日志记录…...

C++常见概念
第一个 C 程序 #include<iostream>using namespace std;int main() {cout << "helloworld" << endl;return 0; }命名空间 #include<stdio.h>int rand 10;int main() {printf("%d", rand);return 0; }#include<stdio.h> #…...

结构型模式---享元模式
概念 享元模式是一种结构型设计模式,他摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。享元模式将原始类中的数据分为内在状态数据和外在状态数据。 内在状态:就…...

2025年渗透测试面试题总结- 深某服-漏洞研究员实习(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 深信服-漏洞研究员实习 1. 在XX实习时做了什么 2. 渗透测试的思路简单描述 3. 护网中承担什么角色 4…...

(13)Anaconda 安装配置详解
1. Anaconda 简介 Anaconda 是一个用于科学计算和数据分析的 Python 发行版,它集成了 Python 解释器、大量常用的科学计算库以及强大的包管理工具。 2. Anaconda 主要特点 丰富的库集合:包含了超过 1500 个用于科学计算、数据分析、机器学习等领域的常用 Python 库,例如 N…...

MWC 2025 | 移远通信大模型解决方案加速落地,引领服务机器人创新变革
随着人工智能、大模型等技术的蓬勃发展,生成式AI应用全面爆发。在此背景下,服务机器人作为大模型技术在端侧落地的关键场景,迎来了前所未有的发展机遇。 作为与用户直接交互的智能设备,服务机器人需要应对复杂场景下的感知、决策和…...

[内网安全] Windows 域认证 — Kerberos 协议认证
🌟想系统化学习内网渗透?看看这个:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:Kerberos 协议简介 Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过…...

[Computer Vision]实验七:图像检索
目录 一、实验内容 二、实验过程 2.1 准备数据集 2.2 SIFT特征提取 2.3 学习“视觉词典”(vision vocabulary) 2.4 建立图像索引并保存到数据库中 2.5 用一幅图像查询 三、实验小结 一、实验内容 实现基于颜色直方图、bag of word等方法的以图搜…...
C++之thread_local变量
C之thread_local变量_c threadlocal-CSDN博客 thread_local简介 thread_local 是 C11 为线程安全引进的变量声明符。表示对象的生命周期属于线程存储期。 线程局部存储(Thread Local Storage,TLS)是一种存储期(storage duration),对象的存储是在…...

【国产Linux | 银河麒麟】麒麟化龙——KylinOS下载到安装一条龙服务,起飞!
🗺️博客地图 📍一、下载地址 📍二、 系统安装 本文基于Windows操作系统vmware虚拟机安装 一、下载地址 官网:产品试用申请国产操作系统、麒麟操作系统——麒麟软件官方网站 下载自己需要的版本,完成后,…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...