android AIDL 01 双向通信

AIDL之双向通信 上一篇《Android进程通信一之AIDL》 说到进程A---->B拿去数据,那问题来了,B进程如果有了数据更新,如何回调给A啊? 这篇文章就来聊聊这个 原理 声明一个 AIDL 接口,然后在服务端所实现的 AIDL 接口中通过注册和注销来添加和删除声明的 AIDL 接口。然后在服务端需要发消息给客户端的时候遍历所有已注册的接口来发起通信,这就是为什么说AIDL可以一对多通信。 第一步 声明AIDL文件,并新增接口方法 // IMyAidlInterface.aidl package com.ly. 阅读详情

1、概述

AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。是的,首先我们知道的第一点就是:AIDL是一种语言。既然是一种语言,那么相应的就很自然的衍生出了一些问题:

  • 为什么要设计出这么一门语言?
  • 它有哪些语法?
  • 我们应该如何使用它?
  • 再深入一点,我们可以思考,我们是如何通过它来达到我们的目的的?
  • 更深入一点,为什么要这么设计这门语言?会不会有更好的方式来实现我们的目的

 

2、为什么要设计这门语言?


设计这门语言的目的是为了实现进程间通信,尤其是在涉及多进程并发情况下的进程间通信。

每一个进程都有自己的Dalvik VM实例,都有自己的一块独立的内存,都在自己的内存上存储自己的数据,执行着自己的操作,都在自己的那片狭小的空间里过完自己的一生。每个进程之间都你不知我,我不知你,就像是隔江相望的两座小岛一样,都在同一个世界里,但又各自有着自己的世界。而AIDL,就是两座小岛之间沟通的桥梁。相对于它们而言,我们就好像造物主一样,我们可以通过AIDL来制定一些规则,规定它们能进行哪些交流——比如,它们可以在我们制定的规则下传输一些特定规格的数据。

总之,通过这门语言,我们可以愉快的在一个进程访问另一个进程的数据,甚至调用它的一些方法,当然,只能是特定的方法。

但是,如果仅仅是要进行跨进程通信的话,其实我们还有其他的一些选择,比如 BroadcastReceiver , Messenger 等,但是 BroadcastReceiver 占用的系统资源比较多,如果是频繁的跨进程通信的话显然是不可取的;Messenger 进行跨进程通信时请求队列是同步进行的,无法并发执行,在有些要求多进程的情况下不适用——这种时候就需要使用 AIDL 了。如果想要了解它们更详细的区别的话,可以去另一篇博文看看:Android中的Service:Binder,Messenger,AIDL(2)

 

3,它有哪些语法?

其实AIDL这门语言非常的简单,基本上它的语法和 Java 是一样的,只是在一些细微处有些许差别——毕竟它只是被创造出来简化Android程序员工作的,太复杂不好——所以在这里我就着重的说一下它和 Java 不一样的地方。主要有下面这些点:

文件类型:用AIDL书写的文件的后缀是 .aidl,而不是 .java。
数据类型:AIDL默认支持一些数据类型,在使用这些数据类型的时候是不需要导包的,但是除了这些类型之外的数据类型,在使用之前必须导包。比如,现在我们编写了两个文件,一个叫做 Book.java ,另一个叫做 BookManager.aidl,它们都在 com.lypeer.aidldemo 包下 ,现在我们需要在 .aidl 文件里使用 Book 对象,那么我们就必须在 .aidl 文件里面写上 import com.aidldemo.Book; 哪怕 .java 文件和 .aidl 文件就在一个包下。 
默认支持的数据类型包括: 

  • Java中的八种基本数据类型,包括 byte,short,int,long,float,double,boolean,char。
  • String 类型。
  • CharSequence类型。
  • List类型:List中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable(下文关于这个会有详解)。List可以使用泛型。
  • Map类型:Map中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable。Map是不支持泛型的

 

  • 定向tag:这是一个极易被忽略的点——这里的“被忽略”指的不是大家都不知道,而是很少人会正确的使用它。在我的理解里,定向 tag 是这样的:AIDL中的定向 tag 表示了在跨进程通信中数据的流向,其中 in 表示数据只能由客户端流向服务端, out 表示数据只能由服务端流向客户端,而 inout 则表示数据可在服务端与客户端之间双向流通。其中,数据流向是针对在客户端中的那个传入方法的对象而言的。in 为定向 tag 的话表现为服务端将会接收到一个那个对象的完整数据,但是客户端的那个对象不会因为服务端对传参的修改而发生变动;out 的话表现为服务端将会接收到那个对象的的空对象,但是在服务端对接收到的空对象有任何修改之后客户端将会同步变动;inout 为定向 tag 的情况下,服务端将会接收到客户端传来对象的完整信息,并且客户端将会同步服务端对该对象的任何变动。具体的分析大家可以移步我的另一篇博文:你真的理解AIDL中的in,out,inout么?
  • 另外,Java 中的基本类型和 String ,CharSequence 的定向 tag 默认且只能是 in 。还有,请注意,请不要滥用定向 tag ,而是要根据需要选取合适的——要是不管三七二十一,全都一上来就用 inout ,等工程大了系统的开销就会大很多——因为排列整理参数的开销是很昂贵的。
  • 两种AIDL文件:在我的理解里,所有的AIDL文件大致可以分为两类。一类是用来定义parcelable对象,以供其他AIDL文件使用AIDL中非默认支持的数据类型的。一类是用来定义方法接口,以供系统使用来完成跨进程通信的。可以看到,两类文件都是在“定义”些什么,而不涉及具体的实现,这就是为什么它叫做“Android接口定义语言”。 
  • 注:所有的非默认支持数据类型必须通过第一类AIDL文件定义才能被使用。
     

1、AIDL支持的简单数据类型

  • Java基本类型,即int、long、char等;
  • String;
  • CharSequence;
  • List
    List中的所有元素都必须是AIDL支持的数据类型、其他AIDL接口或你之前声明的Parcelable实现类。
  • Map
    Map中的所有元素都必须是AIDL支持的数据类型、其他AIDL接口或你之前声明的Parcelable实现类。定义AIDL

2、创建ServiceAIDL


import com.testmodelconnectionapp.MClientAIDL;
import com.testmodelconnectionapp.MsgBean;
interface MServiceAIDL {

            /**
            * 接收来自客户端发来的信息
            * 模拟延时 6秒返回信息
            */
           String getClientInfo(int num1,int num2,in MsgBean msgBean);

           /*
           *接受客户端AIDL
           */
           MsgBean getServerInfo(in MClientAIDL clientAIDL);
}


3、client


import com.testmodelconnectionapp.MsgBean;
interface MClientAIDL {

    //接受服务端的消息
    String getServerInfo (in MsgBean msgBean,String str);

}

4、声明自定义类型

//声明自定义类型

parcelable MsgBean;

4、activity绑定并通过aidl调用service

   private ServiceConnection conn = new ServiceConnection() {

        //绑定上服务的时候
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {

            //拿到了远程的服务
            mServiceAIDL = MServiceAIDL.Stub.asInterface(service);
            MClientAIDL.Stub stub = new MClientAIDL.Stub() {
                @Override
                public String getServerInfo(MsgBean msgBean, String str) throws RemoteException {
                    return null;
                }
            };
            try {
                //向服务端 传递binder
                mServiceAIDL.getServerInfo(stub);
            } catch (RemoteException e) {
                e.printStackTrace();
            }

        }

        //断开服务
        @Override
        public void onServiceDisconnected(ComponentName name) {

            //回收资源
            mServiceAIDL = null;
        }
    };

5、server

 private IBinder iBinder = new MServiceAIDL.Stub() {
        @Override
        public String getClientInfo(int num1, int num2, MsgBean msgBean) throws RemoteException {
            Log.i(TAG, "接收到Client的信息: ");
            msgBean.setMsg1("接收到Client的信息");
            mClientAIDL.getServerInfo(msgBean,"msgg Form Server");
            return String.valueOf(num1+num2);
        }

        @Override
        public MsgBean getServerInfo(MClientAIDL clientAIDL) throws RemoteException {
            //收到客户端的binder
            mClientAIDL = clientAIDL;

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    MsgBean msgBean = new MsgBean();
                    msgBean.setMsg1("我是来自Server的Msg1");
                    try {
                        mClientAIDL.getServerInfo(msgBean,"msgg Form Server");
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            },1000);
            return null;
        }
    };

 

Android aidl双app进程通信详细讲解 一、场景 公司项目里用了很多的独立进程的服务与其他进程之间存在了很多跨进程的通信。之前有很长一段时间没有实际去做跨进程通信 AIDL了,查阅了一些资料和文章看了些 Demo 把温习的心路历程介绍一下。 工具 Android studio 小米手机Android11(api 30) 模拟器手机Android8 (api 26) 为什么要准备两个手机,因为这里Android高版本的aidl使用有点坑的地方,需要做兼容处理,后面会讲到原因。 二、创建aidl的服务端 AIDL... 阅读详情

相关推荐

【Android车载系列】第3章 CarService与Vehicle HAL的交互机制剖析

本文深入剖析了Android车载系统中CarService与Vehicle HAL的交互机制,详细介绍了从应用层到HAL层的通信架构、HIDL接口设计及性能优化实践。通过实际案例展示了如何实现高效、安全的车辆控制,包括数据流转优化、多实例共享策略和异常处理机制,为车载系统开发提供重要参考。

weixin_29176179的博客 119

安卓开发AIDL进程间通信实现应用间双向通信

aidl的使用

qq_34875967的博客 1849

AIDL实现客户端和服务端的双向通信

主要是使用AIDL,实现客户端和服务端的双向通信,客户端调用服务端的登录,服务端将登录结果返回给客户端

Android通过aidl和监听者模式实现客户端与服务跨进程双向通信教程

mService.aidl中被实现的方法();

weixin_46098882的博客 532

STM32F407 BootLoader实战:从零搭建到OTA升级(附完整源码)

本文详细介绍了为STM32F407微控制器从零搭建BootLoader并实现稳定OTA升级的完整实战指南。内容涵盖Flash分区规划、链接脚本配置、核心跳转逻辑、中断向量表重定向、可靠的升级流程设计,并深入探讨了双备份与回滚机制以提升工业级可靠性。文章提供了可直接使用的代码框架,并分享了关键调试技巧,帮助开发者快速掌握STM32远程固件更新技术。

weixin_29192211的博客 442

FANUC机器人PROFINET通讯方式组态

6 然后对模块进行命名及更改IP地址,点击“Network Detection”,进行扫描,会生成下图,双击商科模块会生成下边的对话框,对模块进行命名及更改IP地址,在“Permanent Name”处点对勾,完成后点击“Apply Name及Apply”进行命名。此处注意,上图左上在线在不了,网络扫描处上面也灰色的,扫描不了。5双击abcc-prt-2-port RT(FW1.13),生成下面图标,在右边点击1、2把原来内容删掉,从新在左侧加载 ,使1、2是输出,3、4为输入,完成后点击OK。

dxs93的博客 8431

Android 搭建AIDL Client和Server端,双向通信

使用AIDL,搭建Client和Server端,实现跨进程通讯,即两个应用之间可以相互通讯。这里列举AIDL实现的方式和需注意的细节,并附上源码。Server 端:Client端: 2.3 IOnServerCallback.aidl 文件 三、Server端代码 3.1 VcService (AIDL服务端具体逻辑实现) 3.2 Server端主动发送消息给Client端 3.3 AndroidManifest.xml配置 四、Client端代码 4.1 Clie

以后会多把工作中总结的知识、问题处理思路和方法通过博客分享出来,欢迎大家关注和共同探讨! 1179

开源大模型推理GPU资源评估以及优化

随着大模型的火热很多项目中都使用到了开源大模型,这时候准确评估大模型的GPU资源非常重要,主要有下面几个方面:GPU是昂贵的资源。高估内存需求可能导致在硬件上的不必要支出,而低估则可能导致系统故障或性能下降。:适当的内存管理确保模型高效运行,能够更快地响应用户并处理更多并发请求。:随着需求的增长,理解内存需求对于在不牺牲性能或产生高昂成本的情况下扩展服务至关重要。尽管其重要性显而易见,但计算用于服务大型语言模型(LLM)的GPU内存并不简单。

优快云DN的博客 3116

在Android系统中实现AIDL接口回调

在文章《在Android系统中实现AIDL功能》中实现了aidl的接口调用,但是有时候客户端调用完接口函数后希望服务端有数据返回,这时候就需要定义回调函数。在《在Android系统中实现AIDL功能》的基础上实现接口的回调。还是分三个项目实现,如下图: ├── SimpleJar ├── SimpleJarClient └── SimpleJarService 一、定义回调需要的aidl接口 在SimpleJar项目中添加用于实现回调的aidl文件IVoiceCallBackInterface.aidl,

Venus 的博客 1613

【Linux】U盘配置Ubuntu系统 ——(Win10+Ubuntu20.04)双系统安装教程

Ubuntu系统安装

WS_Change的博客 4333

《阵列信号处理及MATLAB实现》阵列响应矩阵(均匀线阵、均匀圆阵、L型阵列、平面阵列和任意阵列)

《阵列信号处理及MATLAB实现》内容总结,如需阅读更详细内容请购买正版书籍。

APPLECHARLOTTE的博客 1万+

深入Android架构(从线程到AIDL)_11 线程之间的通信架构

当主线程诞生时,就会去执行一个代码循环(Looper),以便持续监视它的信息队列(Message Queue简称MQ)。当UI事件发生了,通常会立即丢一个信息(Message)到MQ,此时主线程就立即从MQ里面取出该信息,并且处理之

soarfeng的专栏 1705

高德地图 搜索和点击定位

高德地图vue

weixin_45474673的博客 1943

7. Binder, AIDL, Messenger

Android RPC Linux系统IPC包括:signals,pipes,message queues,semaphores,shared memory。Android中添加了Binder机制和AIDL来实现IPC。 RPC(Remote Procedure Call – 远程过程调度)基本步骤介绍: Method and data decomposition(分解), also known a

窦哲的专栏 632

杰理JL703N的SDK内部MIDI 音色库功能使用教程

本文介绍了MIDI琴按键解码和MIDI文件解码的实现方法。MIDI琴解码通过audio_dec_midi_ctrl.c文件实现,MIDI文件(mfa格式)解码则使用audio_dec_midi_file.c。使用前需将音色文件存放在SD卡或内置flash中(需确保四字节对齐),并在download.c中配置路径。同时需在板级配置中将FLASH设置为16Mbit以解决编译问题。关键注意事项包括音色文件的文件夹结构对齐要求和MIDI数据流的正确配置。

qq_42014563的博客 390

【Envi遥感图像处理】022:envi时空分析工具的使用

本文介绍了ENVI软件中的时空分析工具应用,以美国拉斯维加斯1975-2014年的9期Landsat数据为例。主要内容包括:1)时空分析概念,即对空间相关时间序列数据的建模分析;2)构建时序数据流程,通过添加栅格、时间排序等步骤生成.series格式时序文件;3)时序数据查看方法,包括动画播放、添加注记及保存视频;4)多源数据统一处理工具,解决坐标系、空间范围不一致问题。该工具可用于冰川变化、植被覆盖等时空变化研究。

智慧空间实验室 270

Android多进程通信机制

更多面试题请看这里:https://interview.raoyunsoft.com/ 面试题专栏会持续更新欢迎关注订阅核心原理:基于Handler的消息机制封装,通过Binder实现跨进程通信。适合简单消息传递场景。服务端实现: 关键配置:在AndroidManifest.xml中声明独立进程 客户端绑定: 双向通信:客户端设置接收回调 2. AIDL跨进程通信 适用于复杂接口调用场景,支持自定义对象传输。AIDL接口定义: 支持数据类型:服务端实现: 客户端调用: 高级特性: 权限验证: 服务端

bookzhan的专栏 306

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android博客大汇总

目录介绍 链接:https://juejin.im/post/5d60ad5df265da03c42899f1 01.基础组件(9篇) 02.IPC机制(7篇) 03.View原理(9篇) 04.动画机制(2篇) 05.Res资源(6篇) 06.消息机制(12篇) 07.多媒体(16篇) 08.View事件(9篇) 09.多线程(12篇) 10.Window(19篇) 11.WebView(4篇)...

shshaashsh的博客 925

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

note

CPU,此处CPU与BL芯片断开,没有连背光芯片。屏,此处屏与BL芯片断开,没有连背光芯片。虽然signal函数更简单些。行 3744: 07-22 23:56:01.139 <6>[ 5.577037][ T919] [2024:07:22 15:55:51](7)[919:modprobe][drm] [lcdkit /I]: type:66, name:[qcom,mdss-dsi-apl-bl-mode-off-command], length:16, pkt-count=1。

m0_73462935的博客 10万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android系统中通过binder(AIDL)进行跨层IPC通信

Binder是Android系统进程间通信(IPC)常用方式之一,client/service端是通过binder驱动作为通信介质的。Android系统中可以通过binder,实现JAVA/C++层的双向IPC通信,即JAVA - JAVA 、 JAVA - C++ 、 C++ - C++ 都可以通过Binder进行IPC双向通信。 在Android 系统中个,很多模块...

gcwl2016的博客 2037

两个独立 APP 通过 AIDL 进行通讯的简单例子

在 AIDLClient 项目中,我们需要把 AIDLServer 中 aidl 生成的java文件(图7)拷贝到项目中(图8)来,注意包名也要一致。为了能够正常的创建aidl文件,我们只需要在 build.gradle 的 android 中增加以下代码即可,记得执行同步gradle操作。跟普通java接口差不多。MyService 中的代码如下,此时服务端 APPService 项目的代码就完成了。此时点击对应的按钮,我们可以把 mNumber 自增后的数据设置到服务端,然后又从服务端拿回数据。

weixin_38096197的博客 1402

Android AIDL双向通信

定义AIDL服务 1.创建.aidl文件 2.SDK生成对应.java文件和Stub内部类 3.通过Service子类将接口暴露给外界

dream_xang的博客 1314

android之aidl研究(1)

概述AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。是的,首先我们知道的第一点就是:AIDL是一种语言为什么要设计这门语言设计这门语言的目的是为了实现进程间通信,尤其是在涉及多进程并发情况下的进程间通信。每一个进程都有自己的Dalvik VM实例,都有自己的一块独立的内存,都在自己的内存上存储自己的数据,执行着自

想飞的人 382

Android使用AIDL实现IPC通信——客户端服务端双向通信发送回调数据

github:https://github.com/50kg/AIDL_Android 此Demo演示了 1:Client和Service线程的相互通信。Client启动Service绑定并传值,Service处理数据后回调给客户端。自动绑定、异常死亡后启动服务等。Demo里例子是客户端传入网址,服务端接收并访问,回调 onLoadResource 的所有Url给客户端 2:服务端隐藏桌面图...

sanji2020的博客 871

AIDL 客户端与服务端的双向通信

时隔一年半了,终于写下了这个续篇,我发现我的很多博客有头无尾,都是有前面一点点,后面就没写去了,也正在想办法都补上 初涉IPC,了解AIDL的工作原理及使用方法 今天聊聊的是客户端和服务端的相互通信,何谓双向通信,事实上,我们在上一篇的博客中,只是讲解了客户端请求服务端的方法,然后服务端返回一个值给我们这样,其实是最简单的用法,但...

weixin_33766805的博客 572
上一篇: android 目录与手机目录
下一篇: 2018 BeijingGDG 一日游
阿杰、
博客等级 码龄11年 13粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值