android跨进程通信-AIDL

Android 进程间通信——Bundle、Message、ContentProvider Android 进程间通信(三)——Bundle、Message、ContentProvider 在前面的文章Android进程间通信机制之AIDL中我们简单的介绍了AIDL的使用。在Android中我们还可以使用其他的进程间通信方式: 使用Bundle携带数据进行进程间的通信; 使用Message进行进程间的通信; 使用文件进行进程间的通信; 使用ContentProvider进行进程间的通信... 阅读详情

本篇主要记录内容:1、aidl基本使用

                                 2、in、 out 、inout、onway关键字含义

                                 3、aidl在使用时对线程的注意事项。跨进程通信时,是在本地的一个binder线程池中执行的。

                                 4、传递bundle对象时,需要注意的点

AIDL通信方式

在 Android 中,一个进程通常无法访问另一个进程的内存。因此,为进行通信,进程需将其对象分解成可供操作系统理解的原语,并将其编组为可供您操作的对象。编写执行该编组操作的代码较为繁琐,因此 Android 会使用 AIDL 为您处理此问题。

注意:只有在需要不同应用的客户端通过 IPC 方式访问服务,并且希望在 服务 中进行 多线程 处理时,您才有必要使用 AIDL。如果您无需跨不同应用执行并发 IPC,则应通过实现 Binder 来创建接口;或者,如果您想执行 IPC,但不需要处理多线程,请使用 Messenger 来实现接口。无论如何,在实现 AIDL 之前,请您务必理解绑定服务。

(跨进程通信需要进行多线程处理,使用aidl。 跨进程不需要处理多线程,使用Messenger) 

  • 远程进程的调用分派自线程池,且平台会在您自己的进程内部维护该线程池。您必须为来自未知线程,且多次调用同时发生的传入调用做好准备。换言之,AIDL 接口的实现必须基于完全的线程安全。如果调用来自同一远程对象上的某个线程,则该调用将依次抵达接收器端。

aidl接口会在一个单独的线程池中被调用,并且这个线程池在客户端进程中维护,我们知道aidl是基于Service实现的多进程通信,所以在远程service中,实现的aidl方法需要保证多线程通信安全。简单来说就是处理多线程调用统一对象的问题。但是如果多次调用都来自同一线程,那么调用将依次到达,就是按顺序咯。

  • oneway 关键字用于修改远程调用的行为。使用此关键字后,远程调用不会屏蔽,而只是发送事务数据并立即返回。最终接收该数据时,接口的实现会将其视为来自 Binder 线程池的常规调用(普通的远程调用)。如果 oneway 用于本地调用,则不会有任何影响,且调用仍为同步调用。

被oneway修饰了的方法不可以有返回值,也不可以有带out或inout的参数。

默认情况下,远程调用会阻塞。使用oneway关键字,远程调用不会阻塞;它只是发送事务数据并立即返回。最终是在binder线程池中调用。

 

先介绍下in 、out 、inout

这个对接口参数设置设置数据流向

AndroidHint 的文章就讲的很清楚。总结就是:

1、所有非基本类型的参数都需要一个定向tag来表明数据是如何走向的。基本数据类型默认是in,而且不能是其他tag

2、 in 表示数据只能由客户端流向服务端, out 表示数据只能由服务端流向客户端,而 inout 则表示数据可以在服务端与客户端之间双向流通。其中的数据流向是针对在客户端中的那个传入方法的对象而言的。(针对参数而言)

3、对于in,服务端将会收到客户端对象的完整数据,但是客户端对象不会因为服务端对传参的修改而发生变动。

4、对于out,服务端将会收到客户端对象,该对象不为空,但是它里面的字段为空,但是在服务端对该对象作任何修改之后客户端的传参对象都会同步改动。

5、对于inout ,服务端将会接收到客户端传来对象的完整信息,并且客户端将会同步服务端对该对象的任何变动。

 

使用步骤:

1、在src目录下创建.aidl文件

就是创建一个dial文件,这个文件是接口,make project之后,会生成改接口的类。

在接口中申明方法。

默认情况下,AIDL 支持下列数据类型:

  • Java 编程语言中的所有原语类型(如 int、long、char、boolean 等)
  • String
  • CharSequence
  • List

    List 中的所有元素必须是以上列表中支持的数据类型,或者您所声明的由 AIDL 生成的其他接口或 Parcelable 类型。您可选择将 List 用作“泛型”类(例如,List<String>)。尽管生成的方法旨在使用 List 接口,但另一方实际接收的具体类始终是 ArrayList。

  • Map

    Map 中的所有元素必须是以上列表中支持的数据类型,或者您所声明的由 AIDL 生成的其他接口或 Parcelable 类型。不支持泛型 Map(如 Map<String,Integer> 形式的 Map)。尽管生成的方法旨在使用 Map 接口,但另一方实际接收的具体类始终是 HashMap。

即使您在与接口相同的包内定义上方未列出的附加类型,亦须为其各自加入一条 import 语句。

就是支持基本类型,如果是自定义的类型必须实现Parcelable。并且需要手动使用Import引入。

 定义服务接口时,请注意:

  • 方法可带零个或多个参数,返回值或空值。
  • 所有非原语参数均需要指示数据走向的方向标记。这类标记可以是 in、out 或 inout(见下方示例)。

    原语默认为 in,不能是其他方向。

  • 生成的 IBinder 接口内包含 .aidl 文件中的所有代码注释(import 和 package 语句之前的注释除外)。
  • 您可以在 ADL 接口中定义 String 常量和 int 字符串常量。例如:const int VERSION = 1;。
  • 方法调用由 transact() 代码分派,该代码通常基于接口中的方法索引。由于这会增加版本控制的难度,因此您可以向方法手动配置事务代码:void method() = 10;。
  • 使用 @nullable 注释可空参数或返回类型。

 

如果使用到自定义类型,比如接口方法中需要一个UserBean对象。那么需要在客户端代码中创建这个UserBeean对象,实现Parcelable。然后在aidl的相同目录下创建UserBean.aidl 文件,申明如下 

 

 在需要使用到的aidl接口中手动引入才可以使用。

2、在远程服务创建刚刚的接口,并调用内部类Stub实例化

构建应用时,Android SDK 工具会生成以 .aidl 文件命名的 .java 接口文件。生成的接口包含一个名为 Stub 的子类(例如,YourInterface.Stub),该子类是其父接口的抽象实现,并且会声明 .aidl 文件中的所有方法。

在远程服务上创建该类实例

并在onBind中返回即可

 

 

需要特别注意的点:

在实现 AIDL 接口时,您应注意遵守以下规则:

  • 由于无法保证在主线程上执行传入调用,因此您一开始便需做好多线程处理的准备,并对您的服务进行适当构建,使其达到线程安全的标准。
  • 默认情况下,RPC 调用是同步调用。如果您知道服务完成请求的时间不止几毫秒,则不应从 Activity 的主线程调用该服务,因为这可能会使应用挂起(Android 可能会显示“Application is Not Responding”对话框)— 通常,您应从客户端内的单独线程调用服务。
  • 您引发的任何异常都不会回传给调用方。

 

如果您的 AIDL 接口包含接收软件包作为参数(预计包含 Parcelable 类型)的方法,则在尝试从软件包读取之前,请务必通过调用 Bundle.setClassLoader(ClassLoader) 设置软件包的类加载器。否则,即使您在应用中正确定义 Parcelable 类型,也会遇到 ClassNotFoundException。

 

 

 

3、客户端监听

通过bindService方法中的ServiceConnection方法获取到ibner对象,调用Stub类里面的asInferface方法转换。

最后总结一下流程

如要调用通过 AIDL 定义的远程接口,调用类必须执行以下步骤:

  1. 在项目的 src/ 目录中加入 .aidl 文件。
  2. 声明一个 IBinder 接口实例(基于 AIDL 生成)。
  3. 实现 ServiceConnection。
  4. 调用 Context.bindService(),从而传入您的 ServiceConnection 实现。
  5. 在 onServiceConnected() 实现中,您将收到一个 IBinder 实例(名为 service)。调用 YourInterfaceName.Stub.asInterface((IBinder)service),以将返回的参数转换为 YourInterface 类型。
  6. 调用您在接口上定义的方法。您应始终捕获 DeadObjectException 异常,系统会在连接中断时抛出此异常。您还应捕获 SecurityException 异常,当 IPC 方法调用中两个进程的 AIDL 定义发生冲突时,系统会抛出此异常。
  7. 如要断开连接,请使用您的接口实例调用 Context.unbindService()。

有关调用 IPC 服务的几点说明:

  • 对象是跨进程计数的引用。
  • 您可以方法参数的形式发送匿名对象。

 

参考:1、慕课网视频,讲的挺好的,关键还免费

           2、https://www.jianshu.com/p/a61da801b919

           3、官网的aidl介绍

 

 

Android AIDL 跨进程通信超详版_aidl跨进程通信代码 【代码】Android AIDL 跨进程通信超详版_aidl跨进程通信代码。 阅读详情

相关推荐

Android中的跨进程通信方案总结一-AIDL的使用

首先,创建一个.aidl文件,用于定义跨进程的接口。在这个示例中,我们创建一个叫的文件。

sunxingzhesunjinbiao的专栏 1311

Android-存储:SharedPreferences使用及其存储类型(aidl支持的数据类型 / bundle传值类型)

日常开发中我们常常要用到保存数据,Android中常用的存储方式有SQLite,sharedPreferences 等,当然也有各自的应用场景,前者适用于保存较多数据的情形,后者责倾向于保存用户偏好设置比如某个checkbox的选择状态,用户登录的状态、配置信息,实现记住密码功能等等,都是以键值对的形式进行的文件读取。 但是每存储一个数据都要提供一个key,如果要存储多个数据那岂不是要写多个k...

火星男孩的分享空间 3万+

Android中的跨进程通信方案总结一-AIDL运行原理

开发者首先通过.aidl文件定义服务接口和方法,这些方法允许客户端调用。在编译时,Android 编译器会自动生成相应的Stub和Proxy类。Stub(服务端实现):服务端使用的 Binder 对象实现了 AIDL 接口方法,实际调用发生在这里。Proxy(客户端调用代理):在客户端调用时,代理类会将方法调用封装成 IPC 请求,通过 Binder 通道传输到服务端。首先定义一个.aidl文件,它描述了服务接口和可以跨进程调用的方法。假设我们希望创建一个计算服务,包含一个add方法来实现加法运算。

sunxingzhesunjinbiao的专栏 1245

进程间的传递:Bundle

    我想在android项目中大家经常会遇到进程间的通讯,传递信息数据。那么问题来了:在android中进程间通讯有几种方式?  好吧这不是我要说的重点,略过~~~      几周前有个同事问我个事,“我在做传输数据的时候卡住了,然后网上搜索了错误发现跟  intent有关,但我没有用intent呀,这是为什么呢”,我表示压力好大,抱着试试看的态度看了下代码,又问了下操作流程。他是想传数据,...

weixin_40387773的博客 704

深入解析Android AIDL:实现跨进程通信的利器

AIDL支持多种数据类型,包括基本数据类型、自定义数据类型和其他AIDL接口类型。在AIDL中,自定义数据类型需要使用parcelable关键字进行声明。

虎哥LoveDroid 1899

Android 跨进程通信aidl及binder机制详解(一)

上文中描述了,什么是绑定服务、以及创建一个绑定服务都可以通过哪些方式,同时说了通过扩展Binder类来创建一个绑定服务,并使用一个例子来说明了客户端与服务端的绑定过程,最后又总结了绑定服务的生命周期与调用过程。由于上一篇文章都是在本地应用(单进程)下进行实战的,所以本节主要讲解跨进程通信的主要方式和开发步骤。对于Android 跨进程通信,Android官方提供了两种方式,一种是通过使用 Messenger,一种是使用AIDL。下面摘自官网描述使用 Messenger 如需让接口跨不同进程工作,您可以使用

superzhang6666的博客 3848

Android Aidl跨进程通讯(三)--进阶使用

学更好的别人,做更好的自己。——《微卡智享》本文长度为2478字,预计阅读6分钟前言Android的AIDL使用和异常报错都已经介绍过了,今天这篇还是在原来的Demo基础上加入几个AIDL的进阶使用方法。】AIDL进阶使用微卡智享in,out,inout的使用关于in,out,inout在AIDL的基础介绍中有提到过AIDL中还有定向的Tag,包括了in、out、inout。其中 in 表示数据只...

Vaccae的博客 1378

Android AIDL跨进程通信指南

本文还有配套的精品资源,点击获取 简介:在Android开发中,跨进程通信(IPC)是实现应用间共享数据和服务的关键技术。AIDL(Android Interface Definition Language)提供了一种机制,允许不同进程通过定义接口进行通信。本篇将引导你通过创建一个AIDL服务来掌握跨进程通信的核心概念和实现步骤。首先介绍AIDL的定义和作用,随后详细说明创...

weixin_33759613的博客 1889

Android 基础总结:( 二十)AIDL详解(上)

前言         明天就是端午了,我将回家陪伴家人3天,提前祝大家端午节快乐,今夜我将回到惟楚有才的楚地 什么是AIDL服务 跨进程访问(AIDL服务)Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。我们知道4个Android应用程序组件中的3个(Activity、Broadcast和Content Pro

默阳听风的博客 729

【VSCode】【Clangd】从零构建:基于LLVM/Clangd+MINGW+CMake的Windows高性能C/C++开发环境实战

本文详细介绍了如何在Windows平台搭建基于LLVM/Clangd+MINGW+CMake的高性能C/C++开发环境。通过VSCode配置Clangd语言服务器,结合MINGW提供的GCC工具链和CMake的跨平台构建能力,实现轻量级、高效率的开发体验。文章包含从环境准备到实战配置的完整指南,特别适合追求开发效率和跨平台兼容性的开发者。

weixin_28839629的博客 310

解决VM 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VM 的方法

在启用了Credential Guard或Device Guard的Windows 10主机上启动12.5版之前的VMware Workstation中的虚拟机时,将显示蓝色诊断屏幕(BSOD)。 会看到类似于以下内容的错误: VMware Workstation和Device / Credential Guard不兼容。禁用Device / Credential Guard后,可以运行VMwar...

Hern(宋兆恒) 39万+

Android IPC 之 AIDL 跨进程通信

文章目录IPC 简介IPC 基础,主要包含三个方面:1,Serializable 接口2,Parcelable 接口3,Binder使用 AIDL实战:通过 AIDL 实现跨进程通信1,创建子进程的 Service2,完成连接服务3,完成消息的发送,注册,反注册关键字的作用总结 IPC 简介 IPC 的含义为进程间通信或者跨进程通信,是指两个进程之间数据交换的过程 多进程的情况分为两种: 1,一个...

345丶 2241

李大勇matlab密码,基于MatlabSimulink的太阳能热水系统仿真研究 沈超.doc

基于MatlabSimulink的太阳能热水系统仿真研究 沈超中国工程热物理学会 工程热力学与能源利用 编号:141090基于Matlab/Simulink的太阳能热水系统仿真研究沈 超1 1 余 鹏1 李洪欣1 魏新利2郑州大学土木工程学院,郑州 450001郑州大学化工与能源学院,郑州 45...

weixin_42298437的博客 1340

Android跨进程通信——AIDL原理解析

本篇文章的内容如下: 1 AIDL简介 2 为什么要设置AIDL 3 AIDL的注意事项 4 AIDL的使用 5 源码跟踪 6 AIDL的设计给我们的思考 7 总结 一、AIDL简介 AIDL是一个缩写,全程是Android Interface Definition Language,也是android接口定义语言。准确的来说,它是用于定义客户端/服务器通信接口的一种描述语言。它其实一种IDL语言,可以拿来生成用于IPC的代码。从某种意义上说它其实是一个模板。为什么这么说?因为在我们

Jason_Lee155的博客 9625

视觉语言模型在三维导航中的应用:JanusVLN项目解析与实战

视觉语言模型(VLM)作为多模态人工智能的核心技术,通过融合视觉感知与自然语言理解能力,实现了对开放世界场景的语义化解析。其原理在于利用预训练的视觉编码器和大型语言模型,将图像信息映射到与文本对齐的语义空间,从而完成跨模态的推理与生成。这一技术为机器人自主交互、智能家居控制等场景提供了基础能力支撑,尤其在需要理解复杂指令并执行序列决策的任务中展现出巨大价值。本文聚焦于视觉语言导航(VLN)这一具体应用,探讨如何通过架构创新与高效微调策略,将通用VLM适配到三维仿真环境中的导航任务,并以JanusVLN项目为

weixin_30240349的博客 669

Carla学习笔记(一)服务器跑carla本地显示窗口

其中host后替换为你的服务器IP,-carla-rpc-port和-p后为端口号,需要一致。python3 manual_control.py也可以替换为其他python脚本。因为电脑配置不够,所以在服务器跑carla,本地运行PythonAPI里的样例。把carla仓库的PythonAPI拷贝到本地,或者直接去官方里下载一下。

做题记录 4977

Android跨进程通信--AIDL原理解析

AIDL是一个缩写,全程是Android Interface Definition Language,也是android接口定义语言。准确的来说,它是用于定义客户端/服务器通信接口的一种描述语言。它其实一种IDL语言,可以拿来生成用于IPC的代码。从某种意义上说它其实是一个模板。为什么这么说?因为在我们使用中,实际起作用的并不是我们写的AIDL代码,而是系统根据它生成的一个IInterface的实例的代码。

行知致简的专栏 6923

利用ADS建立MIPI D-PHY链路仿真流程

由于MIPI D-PHY的速率并不算高,因此,PCB设计难度通常不大,主要做好差分线的等长、阻抗的连续性、端口处的阻抗优化以及控制好走线的长度,拿到满意的结果还是较为轻松的,最后,建立流程化的仿真工程文件,可以保存为模板,方便日后的设计复用,非常方便。

一只豌豆象的博客 3569

Android跨进程通信AIDL

进程间通过内核提供的机制完成数据交换,称之为进程间通信(IPC,Inter Process Communication)

qq_44054791的博客 693

matlab SAR图像的多视滤波

单视复数数据(Single Look Comple)是原始的最高分辨率数据,但是从单个像元散射的雷达回波信号的相干叠加,导致强度信息有很多噪声。SAR的多视处理是对SLC数据方位向和/或距离向做平均,得到的结果是多视后的强度数据。多视处理可以提高SAR图像的信噪比,有效抑制斑点噪声,但是会降低方位分辨率。

点云侠的博客 533

Hermes Agent 安装部署完全指南

Hermes Agent安装部署指南提供了两种安装方式:一键脚本安装和手动分步安装。该AI助手支持多平台运行(Linux/macOS/WSL2),核心功能仅需Git作为前置依赖,其他依赖如Python、Node.js等均由安装脚本自动处理。文档详细介绍了系统要求、依赖管理、配置目录结构、环境变量设置以及10个手动安装步骤,并提供了功能模块化选项,用户可根据需求选择安装语音交互、浏览器自动化等扩展功能。安装完成后可通过hermes doctor命令验证环境,并通过交互式向导完成初始化配置。

简简单单Onlinezuozuo 2614

从AIDL看Android跨进程通信

AIDL是Android实现IPC的一种重要的方式,理解它的原理对理解Android进程间通信有很大的帮助。AIDL的定义,已经有很多介绍的文章了,这里就不做详解了。我们直接从实例入手来分析AIDL实现原理。   AIDL的使用   首先需要定义AIDL接口IMyService.aidl:   // IMyService.aidl package com.chuck.aidldemo;// D

chenkai19920410的专栏 1720

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android AIDL实现跨进程Activity与Service的通信

一、什么是AIDL? AIDL:Android Interface Definition Language 用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication,IPC)的代码。 官方AIDL定义: On Android, one process cannot normally access the memory of anoth...

familyyan的博客 3235

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【47】【项目开发知识管理】Android AIDL跨进程通信

Android AIDL跨进程通信

青风百草 1145

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

安卓使用android studio跨进程通信之AIDL

android studio开发Aidl跨进程项目

沐的博客 1万+

Android跨进程通信之AIDL机制和广播机制的异同

在写这篇博客之前要声明的是本人是一个初学者,只是在学习之处有这么些困惑,然后查阅了一些相关资料,来了解Android跨进程通信机制,然而我个人理解除了AIDL实现跨进程之外好像用广播也可以达到跨进程效果,比如我用广播也可以实现A应用发送广播更改B应用UI,所以觉得AIDL和广播都有可以实现跨进程通信(个人理解,有不当之处还请批评指正)。然而,作为初学着,我想既然有这么一套特别的机制AIDL专门用于

java_xxoo_android的专栏 5548
上一篇: Unable to extract the trust manager on Android10Platform
下一篇: Jetpack学习笔录-dataBinding
TheDistanceCH
博客等级 码龄9年 14粉丝 44原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值