一文搞懂Android AIDL

Android Studio 编写AIDL需要注意的点 AIDL是什么AIDL的全称为 Android Interface definition language 是android接口定义语言。 他的好处是什么 : 进程间通讯 通过 bindService将ServiceConnection进行绑定连接,调用其它线程的功能。 @Override public boolean bindService(Intent service, Serv 阅读详情
AI摘要

本文介绍了Android AIDL(Android Interface Definition Language),它用于实现进程间通信(IPC),解决了Android系统的进程隔离问题。通过创建服务端和客户端两个安卓项目的示例,详细阐述了使用AIDL的步骤,包括添加代码、创建接口、处理自定义类型、注册服务、实现客户端代码等。

介绍

AIDL(Android Interface Definition Language)用于在Android应用中实现进程间通信(IPC)。它允许不同应用或服务间的数据传递和方法调用,确保不同进程间能够相互访问和操作。通过AIDL,开发者可以定义一个接口,然后在服务端和客户端实现这个接口,实现跨进程的交互。背景上,AIDL主要解决了Android系统中的进程隔离问题,使得不同应用或进程能够安全有效地共享数据和功能。

示例

话不多说,直接开搂!

下面示例创建了两个安卓项目,一个服务端(com.xaye.aidl_1)一个客户端(com.xaye.aidl_2)

step1

如果你的项目中没有使用过AIDL,那么当你创建AIDL文件时,会遇到下图这种情况👇
在这里插入图片描述
解决方法是在你使用AIDL的模块build.gradle文件中添加以下代码

    buildFeatures {
        aidl true
    }

然后再rebuild一下就可以啦(●’◡’●)

step2

需要创建一个AIDL服务的接口,因为要供其他应用调用,创建AIDL文件时,需要右击main文件夹创建,因为AIDL需要和java文件夹在同级目录下,效果如下👇
在这里插入图片描述

此时的 libary 是作为主项目的子模块,当然 你也可以直接写在主模块中。

写之前先了解下在AIDL(Android Interface Definition Language)中,默认支持的几种数据类型:

  1. 基本数据类型:
  • boolean:布尔值(true 或 false)
  • byte:8 位有符号整数
  • char:16 位 Unicode 字符
  • double:64 位双精度浮点数
  • float:32 位单精度浮点数
  • int:32 位有符号整数
  • long:64 位有符号整数
  • short:16 位有符号整数
  1. Java 对象:
  • String:字符串
  • CharSequence:字符序列
  1. Bundle:
  • Bundle 类可以用于在进程间传递一组键值对的集合,类似于一个映射表。
  1. List 和 Map:
  • List<T>:支持基本数据类型和支持 Parcelable 接口的对象类型的列表。
  • Map<K, V>:支持基本数据类型和支持 Parcelable 接口的对象类型的映射表。
  1. Parcelable:
  • 自定义的类如果实现了 Parcelable 接口,也可以在 AIDL 中使用。这是一个用来序列化对象的接口,可以将对象数据从一个进程传递到另一个进程。
  1. IBinder:
  • IBinder 接口可以在 AIDL 中作为参数传递,允许在不同的进程间传递服务对象的引用。

step3

为了上点难度,咱们自定义两种类型 VideoParams 和 VideoCallback

创建服务接口(com.xaye.aidl_1):

可以参照上图

// IRemoteService.aidl
package com.xaye.library;

// 引用 VideoParams 和 VideoCallback
import com.xaye.library.VideoParams;
import com.xaye.library.VideoCallback;

interface IRemoteService {
   void processVideoClip(in VideoParams params, in VideoCallback callback);
}
VideoParams

VideoParams 是一个java bean,代码中需要对其序列化,在aidl中使用就是下面这样。

// VideoParams.aidl
package com.xaye.library;

import com.xaye.library.VideoParams;

parcelable VideoParams;
VideoCallback

一个简单的回调接口。

// VideoCallback.aidl
package com.xaye.library;

interface VideoCallback {
    void onSuccess(String filePath);
    void onError(String error, String throwableMessage);
}

aidl 包下要写的东西就这么些,其他应用要使用的话,需要把整个aidl文件夹复制到main下。

step4

如 step2 图示,在java包中 VideoParams 就是一个实现序列化后的bean,VideoService 是一个普通的安卓Service,在这个服务里处理其他应用发送的事件,代码如下,就简单处理返回了下。

public class VideoService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new IRemoteService.Stub() {
            @Override
            public void processVideoClip(VideoParams params, VideoCallback callback) {

                try {
                    callback.onSuccess("aidl 1 回调数据!");
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        };
    }
}

这个 IRemoteService 需要rebuild 后才会有,没build会爆红。

至此… 呃,还有一点,在清单文件中注册该服务,这里主要注意要指定 action ,因为其他应用需要该 action 去找到你的服务。

        <service android:name=".VideoService"
            android:exported="true">
            <intent-filter><!--需要接受的action,其他应用指定-->
                <action android:name="com.xaye.libary.IRemoteService" />
            </intent-filter>
        </service>

至此,服务端代码完成。

补充: 在实际开发中其实没必要传实体类,定义和接收都比较繁琐,直接将实体类使用fastjson 转为json字符串,客户端接收的时候再解析下json就行了!

step5 :实现客户端代码(com.xaye.aidl_2)

无图言吊,上图,客户端代码结构
在这里插入图片描述
正如上面说的,把aidl文件夹 直接复制进来,然后,客户端调用 processVideoClip 方法,需要VideoParams和 VideoCallback 两个类,因为 VideoCallback 类中的数据aidl默认都支持,所以你rebuild后就能直接导入,而VideoParams是自定义数据类,需要把它放到java包 和 服务端同包名下即可,这样在运行时就能通过包名找到同一个VideoParams了。

服务端代码如下👇

class TestActivity : AppCompatActivity() {
    private val TAG = "TestActivity"

    private lateinit var binding: ActivityTestBinding

    private var remoteService: IRemoteService? = null
    private var connection = object : ServiceConnection {
        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            Log.i(TAG,"test aidl client onServiceConnected")
            remoteService = IRemoteService.Stub.asInterface(service)
        }

        override fun onServiceDisconnected(name: ComponentName?) {
            Log.i(TAG,"test aidl client onServiceDisconnected")
        }

    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityTestBinding.inflate(layoutInflater)
        setContentView(binding.root)
        bindService()
        binding.btnTest.setOnClickListener {
            Log.i(TAG,"test aidl client click  remoteService == null : ${remoteService == null}")
            remoteService?.processVideoClip(VideoParams("","",""),object : VideoCallback.Stub(){
                override fun onSuccess(filePath: String?) {
                    Log.i(TAG,"test aidl client onSuccess $filePath")
                    runOnUiThread {
                        Toast.makeText(this@TestActivity,filePath,Toast.LENGTH_LONG).show()
                    }
                }

                override fun onError(error: String?, throwableMessage: String?) {
                    Log.i(TAG,"test aidl client onError $error")
                    runOnUiThread {
                        Toast.makeText(this@TestActivity,"$error $throwableMessage",Toast.LENGTH_LONG).show()
                    }
                }

            })
        }
    }

    private fun bindService() {
        val intent = Intent()
        intent.action = "com.xaye.libary.IRemoteService"//子模块中注册时 要求的action
        intent.setPackage("com.xaye.aidl_1") //目标应用包名,注意不是子模块的
        val bound = bindService(intent, connection, BIND_AUTO_CREATE)
        if (bound) {
            Log.i(TAG,"test aidl client bindService succeed")
        } else {
            Log.i(TAG,"test aidl client bindService failed")
        }

    }
}

首先就是bindService去绑定远程服务,在ServiceConnection 中拿到服务端的服务,然后就可以愉快滴调用服务端方法了,这里主要注意下 intent.action 是服务注册时指定的!setPackage 是服务端所属的应用包名,即使你的服务在子模块中,也要写主应用包名!

安装上客户端 和 服务端应用,运行上面代码,效果如下图
在这里插入图片描述

至此,全剧终。


AIDL没什么难的,只是平时用的比较少,记得刚入行的时候听到感觉好高级,因为工作中没有需求,就一直没有机会去了解(其实就是懒😄),当亲手实操下,看到数据返回时,内心还是有点兴奋的,又get到一个技能,哈哈。

源码已上传csdn资源,0积分:AIDL客户端服务端源码

AIDL解析(一):AIDL原理解析 AIDL编写 AIDL运行原理 AIDL 阅读详情

相关推荐

Android:AIDL简单介绍+传递简单数据+传递复杂数据

AIDL简单介绍+传递简单数据+传递复杂数据.AIDL的目的就是实现进程之间的通信,尤其是在涉及多进程并发情况下的进程间通信。可以将aidl理解为两个进程之间的桥梁,并制定规则,使其传输特定数据。

shanhe_yuchuan的博客 7261

Android:AIDL实战详解

这篇博文从实战出发,用一个尽可能精简的Demo,实现两个App(也是两个进程:服务端mainapp、客户端otherapp)通过AIDL的跨进程通信

肖云鹤的博客 1万+

Android Studio下使用AIDL创建和使用远程service

好久没来更新博客了,今天心血来潮来写一篇关于如何在AS下结合AIDL创建和使用远程service。在此之前我先跟大家解释下什么是远程service?以及为什么要使用远程service?相信不管对于安卓新手还是老手而言,对于service并不感到陌生,所以这里就不跟讨论其基础概念和一些知识点了。所谓的远程service意思其实就是提供一个独立于某个app进程而创建的服务,这个服务可以提供给多个app

_H_JY的博客 4555

AIDL 简介以及使用

AIDL(Android接口定义语言),可以使用它定义客户端与服务端进程间通信(IPC)的编程接口。在Android系统中,每个进程都运行在一块独立的内存中,在其中完成自己的各项活动,与其他进程都分隔开来。可是有时候我们又有应用间进行互动的需求,比较传递数据或者任务委托等,AIDL就是为了满足这种需求而诞生的。通过AIDL,可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法,从而满足进程间通信的需求。1.创建.aildl文件。...

heqiang260的博客 1万+

Android 16 HAL迁移指南:从HIDL到AIDL的演进与踩坑记录

硬件抽象层(HAL)是Android系统中连接系统框架与底层硬件的关键桥梁。在Treble架构的推动下,接口定义语言经历了从HIDL到AIDL的演进。HIDL曾以版本化包名和hash校验保障ABI稳定,但带来了繁琐的维护成本;AIDL作为统一、轻量的替代方案,逐渐成为Android 16上HAL开发的主流选择。理解Binder通信机制、VINTF配置以及接口迁移步骤,是适配新系统、解决编译与运行时问题的核心。无论是传感器、音频还是显示模块,掌握AIDL HAL的迁移路径都能有效提升开发效率。基于Androi

weixin_28278377的博客 295

【项目实战】Android AIDL入门介绍

在Android系统中,AIDL文件是一种.aidl文件,用于定义IPC接口。 AIDL文件包含一个或多个方法声明,这些方法可以在客户端和服务端之间进行IPC调用。

奶爸的编程之路,也就一周冷个三天 974

彻底搞懂AIDL,local service和remote service

Android里Service可以分为两种情况,local service和remote service,其中remote service既可以是同个app中的又可以是另外一个app中的。 区分是否local还是remote就看service和activity是不是运行在同一个进程中。默认情况下如果我们没有在manifest中指定service的process。像这样 则Service

jiucongtian的专栏 1761

ESP32-CAM与Thonny的完美搭配:从烧录到通信的完整流程

本文详细介绍了如何将ESP32-CAM与Thonny IDE完美结合,从固件烧录到通信测试的完整流程。通过硬件连接、MicroPython固件烧录、Thonny环境配置以及摄像头功能开发等步骤,帮助开发者快速搭建高效的物联网开发环境,实现图像采集与无线通信功能。

tomato的博客 1122

记录一下AIDL的实现

师傅早早给过我一个文档,那会看不懂,最近有需要用到AIDL就翻出来看,在同事的建议下先研究了下Binder,也就是上一篇记录。研究了下有深入理解了一些,这边做个记录。 “AIDL(Android Interface Definition Language) 使用AIDL绑定一个远程服务,远程服务可以被其他应用绑定,绑定后可以使用定义在AIDL接口中的方法来进行一些操作,远程服务会另外开启一个进程...

weixin_42926558的博客 260

时空图神经网络实战:T-GCN在交通流量预测中的深度解析

本文深度解析了时空图神经网络T-GCN在交通流量预测中的实战应用。通过结合图卷积网络(GCN)和门控循环单元(GRU),T-GCN有效捕捉交通数据的时空依赖性,相比传统方法降低30%以上预测误差。文章详细介绍了T-GCN的核心技术、工程实践和优化策略,为智能交通系统提供有力工具。

weixin_29038537的博客 267

CMOS反相器版图设计全解析:PMOS/NMOS布局与VDD/VSS连接门道

版图设计是芯片从电路原理图迈向物理实现的必经桥梁,而CMOS反相器作为最基础的数字单元,恰好是理解这一过程的最佳切入点。在版图绘制中,PMOS与NMOS因导电类型和迁移率差异,需要在N阱与P衬底上分别规划,并呈现出不同的有源区尺寸。真正决定版图好坏的关键,往往在于VDD/VSS的完整连接——不仅要接通源漏,还要通过阱接触和衬底接触固定阱与衬底电位,防止寄生PN结正偏和闩锁效应。合理布局电源地线轨道、优化接触孔数量,能显著降低寄生电阻与电迁移风险。这些原理不仅适用于反相器,也是所有CMOS数字标准单元版图设计

weixin_29159441的博客 302

使用 AIDL 进行 IPC 的流程解析和其他要点

AIDL 文件并不是必需的,只是有了这个文件,系统会帮助我们自动生成 IRemoteService.java 这个类 AIDL 的包结构在服务端和客户端要保持一致,否则反序列化将会失败! IRemoteService Stub 抽象内部类,继承了 Binder,实现了 IRemoteService static abstract Proxy static 内部类代理,实现了 IRemoteSe...

binaryshao 542

在 RAP 里把编号这件事做得既优雅又合规:Early Numbering 与 Late Numbering 的落地指南

本文探讨了 SAP RAP 框架中的三种主键编号策略及其适用场景。文章首先指出传统 ABAP 应用中主键处理的局限性,详细分析了早期编号(外部/内部)和延迟编号的差异,强调延迟编号在避免业务断号方面的优势。通过 Partner 业务对象案例,文章演示了延迟编号的实现方法,包括行为定义配置、保存类实现和编号分配逻辑。同时指出测试中常见的校验陷阱,并提醒生产环境应避免简单的 MAX+1 方案,建议采用原子取号机制确保并发安全。全文从业务合规性和技术实现两个维度,为 RAP 应用的编号策略选择提供了实用指导。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1842

Android Binder/AIDL 通俗详解:Stub、Proxy、DMA-BUF 一次性搞懂

Android IPC 劝退?Binder 全家桶不再烧脑! Stub 和 Proxy 不是固定绑定服务端 / 客户端!回调场景角色直接反转! 为什么 Binder 只能传小数据?大图跨进程为什么不能直接塞 Parcel?DMA‑BUF 究竟是神器还是误区?

weixin_36437410的博客 371

Serial RapidIO Gen2 IP 说明(三)

前言 继续接着上篇文章,介绍Serial RapidIO Gen2 IP 的具体端口信息。 一、端口描述 1、缓冲设计接口 2、物理层接口 参考说明 【1】Serial RapidIO Gen2 v4.1https://china.xilinx.com/content/dam/xilinx/support/documentation/ip_documentation/srio_gen2/v4_1/pg007_srio_gen2.pdf ...

记录所学,分享知识,结识挚友 1319

面经-2023-禾赛-FPGA工程师

面经-2023-禾赛-FPGA工程师

w0shishabi的博客 2969

AIDL底层原理需要搞明白的三个点

AIDL底层实现原理

massonJ的博客 2180

Microsoft Dynamics 365软件二次开发:Dynamics365部署与版本控制策略

在Microsoft Dynamics 365中,自定义实体允许开发者扩展系统以满足特定业务需求。自定义实体可以包含字段、选项集、关系和其他属性,与标准实体类似,但完全由用户定义。1. 登录到Dynamics 365环境。2. 转到“解决方案”区域,选择“自定义”。3. 在“自定义”菜单中,选择“实体”。4. 点击“新建”,输入实体名称,例如“客户反馈”。5. 添加字段,如“反馈类型”、“反馈日期”、“描述”等。6. 设置主键和唯一标识符。7. 定义关系,如与“客户”实体的关联。

kkchenjj的博客 2208

AIDL跨应用通信失效?高版本Android的bindService连接问题解析

本文深入解析了高版本Android(targetSdkVersion >= 30)中AIDL跨应用通信失效的核心原因,即Android 11引入的“包可见性”新规。文章提供了两种解决方案:快速降级targetSdkVersion的临时方案,以及通过AndroidManifest.xml添加<queries>标签的标准适配方案,并附有完整代码示例和避坑指南,帮助开发者彻底解决bindService连接问题。

wind6的博客 799

第11.4节 混合储能系统能量管理

混合储能系统(HESS)的能量管理策略采用分层架构实现多时间尺度优化:调度层(小时级)进行经济优化,协调层(秒级)基于频率分解分配功率,执行层(毫秒级)实现快速跟踪。深度强化学习(DRL)方法通过定义状态空间、动作空间和多目标奖励函数,能有效处理系统不确定性和多目标优化问题。HESS性能评估需综合技术指标(如调节性能Kp值、设备寿命指标)和经济指标(净现值NPV、平准化储能成本LCOS),并遵循"建模-仿真-实验"的闭环流程。

技术工作者 245

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android学习最佳路线

搞懂如何实现弹性滑动搞懂view的滑动冲突搞懂view的measure、layout和draw然后再学习几个已有的自定义view的例子最后就可以搞定自定义view了,所谓万变不离其宗大概再需要1-2年时间,即可达到高级工程师的技术水平。我个人认为通过《Android开发艺术探索》和《Android群英传》可以缩短这个过程为0.5-1年。注意,达到高级工程师的技术水平不代表就可以立刻成为高级工程师(受机遇、是否跳槽的影响),但是技术达到了,成为高级工程师只是很简单的事。

2401_86637436的博客 944

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

AIDL实现IPC通信

今天心血来潮来写一篇关于如何在AS下结合AIDL创建和使用远程service。在此之前我先跟大家解释下什么是远程service?以及为什么要使用远程service?相信不管对于安卓新手还是老手而言,对于service并不感到陌生,所以这里就不跟讨论其基础概念和一些知识点了。所谓的远程service意思其实就是提供一个独立于某个app进程而创建的服务,这个服务可以提供给多个app共同使用,当然了,这...

u014748504的博客 610

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

一文带你搞懂Android的-Binder-机制

为什么 IMyService 要分 Stub 和 Proxy 呢?这是为了要适用于本地调用和远程调用两种情况。如果 Service 运行在同一个进程,那就直接用 Stub,因为它直接实现了 Service 提供的功能,不需要任何 IPC 过程。如果 Service 运行在其他进程,那客户端使用的就是 Proxy,这里这个 Proxy 的功能大家应该能想到了吧,就是把参数封装后发送给 Binder 驱动,然后执行一系列 IPC 操作最后再取出结果返回。

2401_84121615的博客 1007

安卓开发知识点!带你彻底搞懂Android启动速度优化!赶紧收藏备战金三银四!

前言 回顾一下自己这段时间的经历,三月份的时候,疫情原因公司通知了裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷。到五月份,公司开始第二波裁员,我决定主动拿赔偿走人。后续的面试过程我做了一些准备,基本都能走到hr面,后面我也顺利地拿到了offer,我给大家分享下我的求职体会,希望能给大家一些参考。 一般Android面试分为两部分:Java部分和Android部分,下面说一下自己面试过程遇到的一些具体题目和一些相关知识点。 这里总结一下,Android入门的时候,需要有一

左夜天 132
上一篇: 技术成神之路:设计模式(十二)模板方法模式
下一篇: 记录H264格式数据解码YUV数据转Bitmap后图像红蓝颠倒问题
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值