Android IPC、Binder和AIDL

Android 进程间通信(IPC):理解Binder & AIDL 首先,我们需要在文件中,定义我们的远程加法服务接口。在目录下,手动创建一个名为aidl的文件夹。在aidl。在文件夹上右键 -> New -> AIDL File,命名为。// 定义这个 AIDL 接口所属的包名,必须与你的 Android 项目的 Java 包名一致。// 这是一个远程接口,它定义了客户端可以调用服务端哪些方法。// 想象成一份客户端和服务端都认可的“合同”。/*** 定义一个远程方法,用于计算两个整数的和。 阅读详情

1、前言 IPC

PC(Inter-Process Communication)进程间通信,提供了各种进程间通信的方法。不仅是Android,其他语言也大很多情况下需要进程间通信的。Android本质上属于Linux,它的跨进程通信也基于Linux进程通信的原理。在Linux C编程中有几种方法
(1) 半双工Unix管道
(2) FIFOs(命名管道)
(3) 消息队列
(4) 信号量
(5) 共享内存
(6) 网络Socket

以上方法都可以实现进程间的通讯,但Android并没有使用以上6种现成的通信方法,而是自己开发Binder驱动,至于为什么重新开发Binder,可参考知乎上的回答:
https://www.zhihu.com/question/39440766?sort=created

大致原因:安全,性能,稳定。
本篇大致围绕下面几个问题,大致做出回答

  1. 什么是IPC,大致适应场景
  2. Binder机制
  3. Binder与AIDL
  4. 如何使用AIDL

1、为什么会有IPC?

因为在很多情况下,我们需要共享进程或者进程间通信,场景
1、下载的音乐文件在文件管理器中,当前我正在播放因为,我在文件管理器删除音乐(文件不存在了),当前音乐播放器是不是该停止呢?
2、第三方APP集成支付宝付款时,第三方应用怎么样调起支付宝用于支付呢
其实使用的场景很多,要实现上面的功能就得使用IPC。
这里写图片描述

内存共享

在用户空间中没有办法共享,因此进程间不能通信,但在内核空间中可以共享,不同的APP要进行通信,可以通过使用内核空间来做到,这样就产生IPC机制,IPC是用于解决这些问题的。为了做到IPC,Android 中提供了Binder机制,来解决进程通信问题

2、Binder机制

这里写图片描述
服务端:Binder服务端其实就是一个Binder对象,对象建立后,启动一个线程,这个线程接收Binder驱动发送的消息,并执行onTransact()方法,执行服务代码。
Binder驱动:当服务端对象创建时,同时会在Binder驱动中创建一个mRemote对象,该对象类型也是Binder类,客户端要过程访问时,都是通过mRemote对象。
客户端:客户端想要访问远程服务时,必须获取远程服务在B inder中对应的mRemote 对象,获取方法就是通过AIDL

3、Binder与AIDL

AIDL(Android Interface Define Language),是android的一种接口定义语言。借助它,你可以定义接口,使得客户端和服务端之间实现进程间通信。
Binder是Android的一个类,它实现了IBinder接口。从IPC角度来说,Binder是android中的一种跨进程通信方式。通过这个Binder对象,客户端就可以获取服务端提供的服务或数据,这里的服务包括普通服务和基于AIDL的服务。

也就是说Binder是用来实现远程服务访问的,AIDL则主要负责远程访问的主要内容,这些内容则用AIDL中的接口来描述。

4、AIDL使用示例

示例做一个进程间通信的Demo,在AIDLServer中新建一个方法,返回一个字符串,在另一个Client的APP中调用。
这里写图片描述

1、服务端代码

1.创建一个AIDL文件:

// IMyAidlInterface.aidl
package com.example.aidlservice;

// Declare any non-default types here with import statements

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);


    String getString();
}

2、新建服务,这个服务就是远程访问的服务,用于客户端调用

package com.example.aidlservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;

/**
 * Created by yuxiaogang on 2017/8/5.
 */

public class RemoteService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return iMyAidlInterface;
    }

    private IMyAidlInterface.Stub iMyAidlInterface = new IMyAidlInterface.Stub() {
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }

        @Override
        public String getString() throws RemoteException {
            return "im from server";
        }


    };
}

3、启动服务:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_bind;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_bind = (Button) findViewById(R.id.btn_bind);
        btn_bind.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_bind:
                Intent intent = new Intent(this, RemoteService.class);
                bindService(intent, new ServiceConnection() {
                    @Override
                    public void onServiceConnected(ComponentName name, IBinder service) {
                        Toast.makeText(MainActivity.this, "success", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onServiceDisconnected(ComponentName name) {
                        Toast.makeText(MainActivity.this, "failed", Toast.LENGTH_SHORT).show();
                    }
                }, BIND_AUTO_CREATE);
                break;
        }
    }
}

2、客户端

客户端就是实际上需要调用远程服务,首先引进AIDL文件,注意AIDL文件的位置和包名。可以直接从Service中复制过来。编译后,客户端就可以调用到服务端的方法了

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_msg;
    private TextView text;
    private IMyAidlInterface iMyAidlInterface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_msg = (Button) findViewById(R.id.btn_msg);
        text = (TextView) findViewById(R.id.text);
        btn_msg.setOnClickListener(this);

    }

    @Override
    protected void onResume() {
        super.onResume();
        Intent intent = new Intent();
        intent.setAction("com.example.aidlservice.RemoteService");
       // intent.setPackage("com.example.aidlservice");
        bindService(intent, new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                iMyAidlInterface=IMyAidlInterface.Stub.asInterface(service);
                Log.i("MainActivity", "onServiceConnected");
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                Log.i("MainActivity", "onServiceDisconnected");
            }
        }, BIND_AUTO_CREATE);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_msg:
                try {
                    text.setText(iMyAidlInterface.getString());
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
        }
    }
}
Android 进阶——AIDL 详解之AIDL 借助Binder 实现IPC背后的核心思想和原理(三) AIDL 借助Binder 实现IPC背后的核心思想和原理 阅读详情

相关推荐

Android IPC进程间通信,Binder机制原理及AIDL实例

我们知道,Android的底层是使用Linux内核运行的,而Linux为了保证系统的稳定性,使用的是进程隔离的机制,也就是让不同的进程运行在不同的虚拟空间,使得不同进程之间无法共享数据,防止数据的篡改。关于多进程的基础使用及优缺点的介绍链接中已经讲的很清楚了。但是,有时候我们也会遇到不同进程间需要通信的情况,那么,这时候就需要使用Android系统进程间通信IPC(Inter-Process Communication)。

csdn_aiyang的博客 3868

IPC、Binder及AIDL原理机制

一、IPC介绍 IPC是Inter-Process Communication的缩写,含义是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。那么为什么需要开启多进程呢?原因有二,其一是一个应用因为某些原因需要独立运行在某个进程中。其二可能是加大一个应用可使用的内存空间,早期的一些版本,一个进程最大的内存空间是16MB。 1、Android中开启多进程 Android中开启多进程的方法只有一个,那就是给四大组件在Manifest中指定android:process属性,除此之外没有其他办法,也就

duncan891101的专栏 607

Binder机制原理、源码、AIDL,IBinder,Binder,IInterface,BinderDriver,需要的都在这里了

导读: 本文分为三个阶段, 第一阶段,原理概述,力争说人话的基础上,讲明白Binder机制在搞什么,为什么这样搞,以及具体是怎么搞的。 第二阶段,代码层面描述,主要描述了,AIDL、IBinder、Binder、IInterface、Binder Driver是如何设计和实现第一阶段的构想。 第三阶段,实例操作,不使用半自动的AIDL工具,纯手动利用Binder实现一把进程间通信。 相信这一套军体拳下来,应该能薛伟地掌握Binder的相关原理。 P.S. 本文code部分使用了伪代码,包含但不限于kotlin、java和汉字。。。不过应该都能看懂 Binder是Android系统用来实现高效I

AIDL及IPC浅谈

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

whminyi的专栏 894

第4课 SiC MOSFET的动态特性——关断过程

本文分析了SiC MOSFET的关断过程,将其划分为四个阶段:栅源电容放电阶段(t6-t7)、米勒平台阶段(t7-t8)、电压过冲阶段(t8-t9)和换流结束阶段(t9-t10)。通过等效电路详细描述了各阶段的电压电流变化特点。同时探讨了MOSFET的极间电容特性,包括输入电容Ciss、输出电容Coss和反向转移电容Crss,分析了它们对器件开关速度、损耗及电压变化速率的影响。研究指出这些非线性电容会显著影响器件的动态性能。

嵌入式老牛的博客 1045

AG16K MCU ARM Cortex M3

其中,Input文件为Keil生成的mcu程序文件,输出为合成后的存储格式Bin文件,Program address 为上方表格中“程序运行 RAM 地址(4bytes)”,即 Keil 中设置的程序运行地址。其中 MCU 程序的地址,根据 mcu.ip 中设置的 FLASH_BIAS 进行设置。AG16K MCU 的 FPGA 工程中,需调用 alta_mcu_m3 的硬核 IP,包含在 alta_sim.v 的库文。Quartus II。//MCU 程序在 FLASH 中存放的首地址。

Embeded_FPGA的博客 1807

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

【免费】最新区块链钱包和私钥的助记词碰撞器,bybit使用python开发

【免费】最新助记词钱包碰撞器,全链全网络,一周左右就有,稳定高效。

weixin_48529185的博客 1万+

Android中的Binder和AIDL

1.Binder1.1简介Binder是一种进程间通信的机。Binder就是Android中的血管,在Android中我们使用Activity,Service等组件都需要和AMS(system_server)进行通信,这种跨进程的通信都是通过Binder完成。Activity,Service等组件和AMS不是同一个进程,其实也是多进程通信。1.2性能Binder相对于传统的Socket方式,更加高效。......

weixin_63261150的博客 1995

逆变器母线电容选型与均压电阻设计实战指南

本文为逆变器母线电容选型与均压电阻设计提供了实战指南。文章从工程角度出发,详细解析了母线电容耐压值、容值的计算方法,并重点强调了纹波电流热设计的重要性。同时,深入探讨了串联电容均压电阻的设计原则与功率计算,通过5.5kW变频器案例,系统演示了从参数确定到最终选型的完整流程,旨在帮助工程师设计出稳定可靠的逆变器系统。

weixin_29299807的博客 292

简单概述人形机器人的“大脑、小脑”

原创 仲翔云人形机器人产业通2024年09月13日 19:41上海人形机器人的大脑和小脑是其控制系统的关键组成部分,它们模拟了人类大脑和小脑的功能,以实现复杂的运动控制和决策过程。

AI生成曾小健3 2071

【Android】Binder(一)Binder的介绍和AIDL使用Binder的实例

Binder的介绍和AIDL使用Binder的实例

每天不是在写bug就是在写bug的路上 5071

Python遥感图像处理指南(2)-卫星影像分析MNDWI提取

在第一篇文章中,我们使用了我们导入的软件包中已定义的函数,如 rasterio 中的 open 和 read 以及 matplotlib 中的 imshow。现在,我们可以编写自己的函数了。函数是一段代码,它接收一些参数作为输入并返回输出(经过一些计算),可以在代码中多次重复使用,也可以被其他代码重用。在 Python 中定义一个新函数非常简单。return v在此语法示例中,arg1和arg2强制参数,应该传递给函数,否则会引发错误,而arg3是一个可选参数,如果是,则假定默认值 1从函数调用中省略。

gis收藏家的博客 1576

Android进程间通讯之初见(IPC,RPC,LPC,BINDER,AIDL..)

Inter-process communication (IPC) is a set of methods for the exchange of data among multiple threads in one or more processes. Processes may be running on one or more computers connected by a netw

林学森的技术专栏 5597

Keil5保姆级安装指南:从破解到STM32开发环境配置(附常见错误解决方案)

本文提供Keil5从安装到STM32开发环境配置的完整指南,包含破解步骤、常见错误解决方案及多芯片支持配置。详细讲解环境预检、核心安装、许可证管理及高效开发环境设置,帮助开发者快速搭建嵌入式开发平台。特别针对安装和卸载过程中的关键问题提供专业解决方案。

weixin_30369041的博客 125

【读代码】深入解析Ragas:RAG应用效果评估最好的工具

Ragas是由Exploding Gradients团队开发的专业LLM应用评估框架,通过自动化测试和量化指标帮助开发者构建可靠的AI系统。# 典型架构模块 ├── metrics # 50+评估指标实现 ├── testset # 测试集生成系统 ├── embeddings # 多模态嵌入支持 ├── integrations # 主流框架集成 ├── optimizers # 遗传算法优化器 └── experimental # 前沿功能实验区。

kakaZhui的博客 850

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android IPC机制:Binder与Aidl

1.序列化与反序列化及android常见IPC方式: 1.1Serializable: Serializable是java提供的序列化接口,为对象提供标准的序列化与反序列化操作。serialVersionUID是需要声明的,一般情况下赋值为1L,正常情况下不声明也没关系。但是在某些情况下可能会反序列化失败,这是因为在序列化对象的时候会把ID写入序列化文件中,在反序列化的时候会将这个ID和当前类的s...

lanhuzi9999的专栏 2209

怀旧版电脑GBC模拟器

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android进程间通信(IPC)之Binder/AIDL

我们常常听说IPC(Inter Process Communication)、线程、Binder、AIDL这次词,似懂非懂,在从事Android应用开发初期,往往按照规则调用SDK的接口即可实现绝大部分功能没有深究这些名词,随着岁月流逝,终于不得不在某个时刻开始反反复复的问自己: 到底什么是进程间通信? 线程是什么东西,和进程有什么关系? 我们为什么要了解进程间通信,在Android开发中有...

藏六七 1605

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

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

Android IPC通信机制详解:Binder、AIDL、Messenger实战应用指南 [特殊字符]

Android进程间通信(IPC)是Android开发中的核心技术之一,它允许多个应用进程之间高效、安全地交换数据。在Android系统中,Binder、AIDL和Messenger是三种最重要的IPC通信机制,掌握它们对于构建高性能、稳定的Android应用至关重要。本文将详细介绍这三种核心通信方式的原理、使用场景和实战应用,帮助你快速掌握Android IPC通信的精髓。 ## 📊 And

gitblog_01075的博客 980

Android内存共享、进程间高性能IO、手动实现 Binder IPC、Aidl例子

package com.example.serverprocess; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle

笨鸟的专栏 1035

安卓IPC机制:Binder和AIDL

1、继承树 2、介绍 Binder是Android跨进程通信方式,解决基于C/S模式的进程间通信。 实现了IBinder接口,是ServiceManager连接各种Manager的接口。 Binder在安卓系统中的位置: 3、Binder实现IPC Client 通过bindService 后,返回一个IBinder指针,可以调用Bi

liweixin2018的博客 344

循序渐进 Android Binder(一):IPC 基本概念和 AIDL 跨进程通信的简单实例

在 Android 系统中,Binder 占有举足轻重的地位。本文讲解了与 Binder 相关的 IPC 的基本概念,并使用了一个基于 AIDL 的跨进程通信实例来演示的 Binder 的使用。带领大家逐步进入 Binder 的世界。

李斯维的博客空间 1167

Android Car&Source 01 -- 进程间通讯基本概念IPC,Binder,proxy,stub,AIDL,oneway

目录 1.IPC 2.Binder 3.Stub,Proxy 4.AIDL 5.oneway 最后.学习博客如下: 1.IPC IPC:Inter-Process Communication,指进程间通信或者跨进程通信,即两个进程之间进行数据交换的过程。 某一应用程序(App)时,android系统里的Zygote服务孵化(Fork)一个新的进程(progress)给它,然后将它(App)加载到这个新诞生的进程里。一个进程是一个独立的执行空间,不会被正在其他进程里的程序锁侵犯。 Andr

来个芒果1007 969

关于android IPC(AIDL、Binder、Messenger)通信

关于android IPC通信

qq645139778的专栏 357

Android IPC与Binder机制深度解析:从原理到AIDL实战

进程间通信(IPC)是操作系统实现多进程协作与数据交换的核心机制,它通过内核提供的安全通道,允许不同进程间高效、可控地传递数据与指令。其底层原理通常涉及内存映射、序列化与内核调度,旨在突破进程隔离的边界,实现模块解耦与资源共享。在Android生态中,IPC的技术价值尤为突出,它支撑着系统服务调用、组件通信与多进程架构,是构建复杂、高性能应用的基础。Binder作为Android独有的IPC方案,通过一次拷贝与内存映射机制,在安全与效率间取得了最佳平衡,成为系统级通信的基石。AIDL(Android接口定义

weixin_34026276的博客 353
上一篇: android adb
下一篇: Java RSA
android_xiaogang
博客等级 码龄12年 89粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值