android开发艺术探索3:IPC--AIDL(跨进程)的使用

Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用 在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messenger是以串行的方式来处理客户端发来的信息,如果有大量的消息发到服务端,服务端仍然一个一个的处理再响应客户端显然是不合适的。另外,Messenger用来进程间进行数据传递但是却不能满足跨进程的方法调用,接下来我们来使用AIDL来实现跨进程方 阅读详情

AIDL的使用

我们可以使用AIDL来实现跨进程的方法调用,在上一个博客中我们介绍了binder的概念,在binder的基础上我们可以更加容易的理解AIDL。这里先介绍使用aidl来进行进程间通信的流程,分为服务端和客户端两个方面。

  1. 服务端

      服务端首先要创建一个service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明,最后再service中实现这个AIDL接口即可。

  1.  
  2. 客户端

    客户端所要做的事情就稍微简单一些,首先需要绑定服务端的setvice,绑定成功后,将服务端返回的binder对象转成AIDL接口所属的类型,接着就可以调用AIDL中的方法了。

   上述只是一个感性的过程,AIDL的实现过程远不止这么简单,接下来会对其中的细节和难点进行详细介绍。

  3.AIDL接口的创建

   首先看AIDL接口的创建,如下所示,我们创建了一个后缀为AIDL的文件,在里面生命了一个接口和两个接口方法。

// IbookManager.aidl
package com.dzx.recyclerviewdemo.aidl;

// Declare any non-default types here with import statements
import com.dzx.recyclerviewdemo.aidl.Book;
interface IbookManager {

    /**
       * 除了基本数据类型,其他类型的参数都需要标上方向类型:in(输入), out(输出), inout(输入输出)
     */
   void addBook(in Book book);
   List<Book> getBookList();
}

在AIDL文件中,并不是所有的数据类型都是可以使用的,那么到底AIDL文件支持哪些数据类型呢?

共 4 种:

  1. Java 的基本数据类型
  2. List 和 Map 
    • 元素必须是 AIDL 支持的数据类型
    • Server 端具体的类里则必须是 ArrayList 或者 HashMap
  3. 其他 AIDL 生成的接口
  4. 实现 Parcelable 的实体

  其中自定义的parcelable对象和AIDL对象必须要显式import进来,不管他们是否和当前的AIDL文件位于同一个包内。

  另外一个需要注意的地方是,如果AIDL文件中用到了自定义的parcelable对象,那么必须新建一个和他同名的AIDL文件并在其中生命他为parcelable类型。在上面ibookmanager中,我们用到了book这个类,所以,必须要创建爱你book.aidl,如下

package com.dzx.recyclerviewdemo.aidl;
//还要和声明的实体类在一个包里,同时注意不要新建aidl文件,因为你会发现,新建不了,
//提示你名称唯一,此时你新建一个file,名字为Person.aidl就可以,需要特别注意下
parcelable Book;

然后还有一个实现了parcelable的book。java类,如下:

package com.dzx.recyclerviewdemo.aidl;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by Administrator on 2018/8/14 0014.
 */

public class Book implements Parcelable{


    public int bookId;
    public String bookName;

    public Book(int bookId, String bookName) {
        this.bookId = bookId;
        this.bookName = bookName;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(bookId);
        dest.writeString(bookName);

    }
    public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {

        @Override
        public Book createFromParcel(Parcel source) {
            return new Book(source);
        }

        @Override
        public Book[] newArray(int size) {

            return new Book[size];
        }
    };
    private Book(Parcel parcel){
        bookId = parcel.readInt();
        bookName = parcel.readString();
    }
}

4.远程服务端service的实现

上面讲述了如何定义AIDL接口,接下来我们就需要实现这个接口了,我们创建一个MyAidlService,的service,代码如下:

public class MyAidlService extends Service {
    private static final String TAG = "MyAidlService";



    private CopyOnWriteArrayList<Book> mBooks;
    private IBinder mIbinder = new IbookManager.Stub(){

        @Override
        public void addBook(Book book) throws RemoteException {
            Log.e("sssssssssssssss", "ssssssssaddBook" );
            mBooks.add(book);
        }

        @Override
        public List<Book> getBookList() throws RemoteException {
            return mBooks;
        }
    };
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        mBooks = new CopyOnWriteArrayList<>();
        Log.e("sssssssssss", "ssssssssonBind" );
        return mIbinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("sssssssssss", "onDestroy" );
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("sssssssssss", "onDestroy" );
    }
}

上面这主要看getbooklist和addBook这两个aidl方法的实现,实现过程也比较简单,注意这里采用了CopyOnWriteArrayList,在前面我们提到,AIDL方法啊是在服务端的binder线程池中执行的,因此当多个客户端同时连接的时候,会存在多个线程同时访问的情形,所以我们要子啊AIDL方法中处理线程同步,所以会用到CopyOnWriteArrayList来进行自动的线程同步。

然后我们需要在XML中注册这个service,注意此service是运行在独立进程中的,它和客户端的activity不在同一个进程中,这样就构成了进程间通信的场景:

  <service
            android:name=".MyAidlService"
            android:enabled="true"
            android:exported="true"
            android:process=":aidl"/>

客户端

客户端实现首先要绑定远程服务,绑定成功后将服务端返回的binder赌侠ing转成AIDL接口,然后就可以通过这个接口去调用服务端的远程方法了,代码如下:

public class MainActivity extends AppCompatActivity {

    private List<String>list;

    private IbookManager ibookManager;
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            ibookManager = IbookManager.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(MainActivity.this,MyAidlService.class);
        bindService(intent,connection, Service.BIND_AUTO_CREATE);

        startService(intent);

        TextView tv = (TextView)findViewById(R.id.tv);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Book book = new Book(1,"android");
                try {
                    ibookManager.addBook(book);
                    List<Book>mList = ibookManager.getBookList();
                    Log.e("sssss","ssssssss mlist = "+mList.toString());
                } catch (RemoteException e) {
                    e.printStackTrace();
                }

            }
        });

  




    }

}

其实大家看起来跟同进程的没啥区别  但是这是多进程的跨进程通信,希望大家了解

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

相关推荐

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

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

sunxingzhesunjinbiao的专栏 1311

android开发艺术探索学习笔记-第二章:IPC机制-应用中使用aidl

一、android studio中安装aidl的插件 在android studio的设置plugins中,搜索Android Parcelable Code Generator ,然后进行安装,重启android studio即可应用。 二、快速生成Parcelable的接口 1.在指定目录下常见自己的类,下面以Book.java为例: package com.lym.aidl_ser...

你知道的昵称 306

Android IPC 之 AIDL 使用

总而言之,成功是留给准备好的人的。无论是参加什么面试,都要做好充足的准备,注意好面试的礼仪和穿着,向面试官表现出自己的热忱与真诚就好。即使最后没有过关,也要做好经验的总结,为下一次面试做好充足准备。这里我为大家准备了一些我在面试后整理的面试专题资料,除了面试题,还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家,希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

2401_84009215的博客 941

Android开发艺术探索之初探AIDL(一)

一、前言        最近在学习Android开发艺术探索一书,因为也是开发刚入门,刚学习到AIDL这部分的时候,即使对着书本敲还是遇到许多书上没有总结的问题,故写此篇防止后忘,同时,也希望可以帮助初学的小伙伴贡献自己的一份力量吧。 二、概述        那什么情况下才需要使用到AIDL呢?Android中IPC通信方式其实有很多啊,比如可以使用bundle、文件共享

故不积跬步无以至千里 728

Android AIDL跨进程通信指南

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

weixin_33759613的博客 1889

Android Studio中AIDL的使用与IPC实践

在Android系统中,AIDL(Android Interface Definition Language,Android接口定义语言)是一种用于实现不同进程间通信(IPC)的机制。通过AIDL,一个进程可以调用另一个进程中的方法,并且可以传递对象参数。AIDL 基于Binder框架,是实现RPC(Remote Procedure Call,远程过程调用)的一种具体方式。AIDL 支持多种数据类型,包括基本数据类型、String、List、Map、以及实现Parcelable接口的对象。

weixin_42376614的博客 1609

Android中跨进程的意思

Android中的不同程序是不能共享内存的,不同程序之间的数据交换叫做跨进程。 Android中的跨进程方式为四中 既Android的四大组件   其中Activity可以跨进程调用其他程序的Activity,广播和内容提供者都可以跨进程访问其他程序的数据和跨进程发送广播或监听服务于内容提供者类似,不过服务返回的是java对象。

上官铁头 1364

深入掌握Android AIDL IPC机制

在Android系统中,各个应用组件经常需要进行交互,这就需要一种机制来允许它们进行进程间通信(IPC)。Android提供了多种IPC机制,其中包括使用Bundle、使用Messenger、使用ContentProvider、使用BroadcastReceiver和使用AIDL(Android Interface Definition Language)等。AIDL作为其中较为复杂但也更强大的一种IPC方法,让我们可以定义跨进程通信的接口,并通过接口进行方法调用。

weixin_35749545的博客 1154

android跨进程通信(IPC):使用AIDL

AIDL的作用     AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。

singwhatiwanna 7万+

开发艺术探索第二章AIDL生成Java文件格式整理

开发艺术探索第二章AIDL生成的Java文件,整理格式后。

android使用AIDL跨进程通信(IPC)

本篇文章主要介绍了 android跨进程通信(IPC):使用AIDL,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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的博客 9628

风力摆控制系统 PCB 设计 3 要点:STM32+MPU6050+空心杯电机驱动一体化

本文详细解析了风力摆控制系统PCB设计的3大核心要点,重点介绍STM32主控、MPU6050姿态传感器与空心杯电机驱动的一体化方案。通过系统架构设计、PCB布局布线技巧以及噪声抑制方案,帮助参赛者在电子设计竞赛中构建高精度、高稳定性的风力摆控制系统,提升竞赛作品性能。

weixin_30363285的博客 359

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

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

行知致简的专栏 6923

招标信息爬取工具

一个能帮你节省大量时间的实用小工具,我自己用了挺久,分享出来给有需要的朋友

qq_56877290的博客 836

飞常准小程序接口逆向分析:如何破解航班查询的签名机制

本文深度解析了飞常准小程序航班查询接口的安全机制,重点剖析了其基于MD5和参数排序的签名算法。通过逆向分析核心代码,详细阐述了签名生成流程,并提供了Python实现的签名生成器与调试技巧,为开发者理解与模拟此类接口调用提供了实战指南。

zz67890的博客 531

Android使用AIDL实现跨进程通讯(IPC)

前言:在还没有做任何一件事情之前,千万不要觉得这件事情很难,因为还没有开始做内心就已经对这件事情产生了恐惧,这将会阻止你的进步,也许当你动手开始做了这件事后发现其实并不是很难。一、 AIDL概述含义:AIDL(Android Interface Definition Language),是android接口定义语言,这种语言定义了一个客户端和服务器通讯接口的一个标准、规范。为什么要有AIDL? 我们

宿罪的博客 8881

使用AI编写测试用例——详细教程

现阶段AI还不能完全替代人工测试用例编写,但如果把AI当做一个提高效率的工具,它将会是一个很强大的辅助。

公众号|软件测试老吴 3万+

Android跨进程通信Binder机制与AIDL实例

文章目录进程通信1.1 进程空间划分1.2 跨进程通信IPC1.3 Linux跨进程通信1.4 Android进程通信Binder 跨进程通信2.1 Binder简介2.2 Binder驱动2.3 Binder原理AIDL编程Demo3.1 服务端3.2 客户端 在操作系统中,进程与进程间的内存和数据都是不共享的。这样做的目的,是为了避免进程间相互操作数据的现象发生,从而引起各自的安全问题。为了实现进程隔离,采用了虚拟地址空间,两个进程各自的虚拟地址不同,从逻辑上来实现彼此间的隔离。两个进程之间要进行通信

道阻且长,行则将至 6745

深度伪造检测实战:轻量级频域特征 pipeline 部署指南

深度伪造检测(deepfake detection)是多媒体内容安全的核心技术,其本质是通过建模生成式篡改在像素与频域留下的微弱异常痕迹。传统端到端大模型虽在标准数据集上表现优异,却因训练域与真实场景失配、计算开销高、缺乏可解释性而难以落地。本文聚焦于工程可复现的实践路径,提出‘人脸定位→频域伪造特征提取(Xception-FCN + Frequency-Aware Masking)→轻量分类决策’三段式解耦架构,兼顾精度、延迟与可解释性。该方案已在边缘设备(Jetson Orin NX)实现单帧<48ms

weixin_33437929的博客 309

用Python+ArcGIS分析厦门共享单车数据:5分钟搞定订单时长与距离分布的可视化

本文详细介绍了如何利用Python和ArcGIS Pro 3.x快速分析厦门共享单车数据,实现订单时长与距离分布的可视化。通过数据清洗、预处理和高级可视化技巧,揭示用户行为特征,为运营优化提供数据支持。文章还提供了环境配置、代码示例和业务洞察,帮助开发者高效完成数据分析任务。

weixin_28327051的博客 339

Android IPC 之 AIDL 跨进程通信

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

345丶 2241

SAP BTP开发入门:从PaaS到CAP/UI5的30天学习路线

在云计算与数字化转型的大背景下,企业系统集成与云端扩展需求激增,传统的单点开发模式正面临深刻变革。PaaS(平台即服务)作为云原生的核心概念,将基础设施、开发环境与应用服务统一封装,为企业提供了灵活的扩展能力。SAP BTP正是SAP生态中的PaaS平台,它承载着系统集成、低代码开发、AI服务与数据管理,成为连接S/4HANA等核心业务系统与创新应用的桥梁。对于ABAP开发者而言,掌握BTP不仅是技能升级,更是应对从传统部署向云端订阅模式转型的必由之路。本文从平台基础出发,梳理BTP的核心服务与开发模型(如

weixin_31766003的博客 285

【Android】浅析 Android 的 IPC 跨进程通信机制

Android进程间通信(IPC)机制 核心点: 多进程实现方式:通过android:process属性声明,含:前缀表示包名前插 多进程问题:静态变量失效、线程同步失效、SharedPreferences可靠性下降、Application重建 序列化方案: Serializable:简单但性能低,需处理serialVersionUID Parcelable:Android专用,性能高,但实现复杂 Binder机制: 核心组件:客户端、服务端、ServiceManager、BinderDriver AIDL

2401_87853595的博客 1137

2023全国职业技能大赛 网络系统管理 服务部署 Linux部分--基础配置

服务器和客户端基本配置如下表,各虚拟机已预装系统。一、关闭防火墙和Selinux。七、需要使用到的命令详解。三、修改root密码。

weixin_62926639的博客 1000

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android IPC —— AIDL的原理

文章目录1.Bindler,AIDL,Messenger的关系2. AIDL的使用 1.Bindler,AIDL,Messenger的关系 2. AIDL的使用

haazzz的博客 3314

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: android开发艺术探索2:binder浅析
下一篇: android开发艺术探索:View的事件分发机制
小股东
博客等级 码龄10年 7粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值