关于AIDL和Binder

AIDL & Binder机制和原理 而该Bp客户端的实例化流程,首先会先通过Parcel的readStrongBinder实例化一个BpBinder,然后一般会通过调用对应接口类中的asInterface方法将BpBinder转化为一个真正的Bp接口客户端,其实这个转化就是实例化一个Bp客户端,实例化时,会将BpBinder作为构造传参传入Bp客户端中。在C++层面的Binder相关类中,所谓的Bn端就是Binder的服务端,在此例中,Cameraservice的Bn端,显然就是之前AIDL自动生成的BnCameraService。 阅读详情


AIDL是一种跨进程通信的方式,通信基于Binder。

直接继承Binder也可以实现跨进程通信。

Binder

Binder是一个类,它实现了IBinder接口,而IBinder接口定义了与远程对象的交互协议。通常在进行跨进程通信时,不需要实现IBinder接口,直接从Binder派生即可。

除了实现IBinder接口外,Binder中还提供了两个重要的接口。

  • transact(),客户端调用,用于发送调用请求
  • onTransact(),服务端响应,用于接收调用请求

因为以上的原因,Binder成为了客户端与服务端的通信媒介,其主要用在Service组件应用中。

AIDL

机制

AIDL的通信基于Binder。

下面写一个AIDL的demo讲解他的通信机制。

新建Book.aidl文件

package com.competition.pdking.ipcdemo;

parcelable Book;

然后创建一个IBookManager.aidl文件

// IBookManager.aidl
package com.competition.pdking.ipcdemo;

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

import com.competition.pdking.ipcdemo.Book;
interface IBookManager {

    List<Book> getBookList();
    void addBook(in Book book);
}

Android会生成一个java文件

/*
 * This file is auto-generated.  DO NOT MODIFY.
 * Original file: C:\\Projects\\AndroidProjects\\AndroidDemoProject\\IPCDemo\\app\\src\\main
 * \\aidl\\com\\competition\\pdking\\ipcdemo\\IBookManager.aidl
 */
package com.competition.pdking.ipcdemo;

public interface IBookManager extends android.os.IInterface {
    /**
     * Local-side IPC implementation stub class.
     */
    public static abstract class Stub extends android.os.Binder implements com.competition.pdking.ipcdemo.IBookManager {
        private static final java.lang.String DESCRIPTOR = "com.competition.pdking.ipcdemo" +
                ".IBookManager";

        /**
         * Construct the stub at attach it to the interface.
         */
        public Stub() {
            this.attachInterface(this, DESCRIPTOR);
        }

        /**
         * Cast an IBinder object into an com.competition.pdking.ipcdemo.IBookManager interface,
         * generating a proxy if needed.
         */
        public static com.competition.pdking.ipcdemo.IBookManager asInterface(android.os.IBinder obj) {
            if ((obj == null)) {
                return null;
            }
            android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
            if (((iin != null) && (iin instanceof com.competition.pdking.ipcdemo.IBookManager))) {
                return ((com.competition.pdking.ipcdemo.IBookManager) iin);
            }
            return new com.competition.pdking.ipcdemo.IBookManager.Stub.Proxy(obj);
        }

        @Override
        public android.os.IBinder asBinder() {
            return this;
        }

        @Override
        public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply,
                                  int flags) throws android.os.RemoteException {
            java.lang.String descriptor = DESCRIPTOR;
            switch (code) {
                case INTERFACE_TRANSACTION: {
                    reply.writeString(descriptor);
                    return true;
                }
                case TRANSACTION_getBookList: {
                    data.enforceInterface(descriptor);
                    java.util.List<com.competition.pdking.ipcdemo.Book> _result =
                            this.getBookList();
                    reply.writeNoException();
                    reply.writeTypedList(_result);
                    return true;
                }
                case TRANSACTION_addBook: {
                    data.enforceInterface(descriptor);
                    com.competition.pdking.ipcdemo.Book _arg0;
                    if ((0 != data.readInt())) {
                        _arg0 = com.competition.pdking.ipcdemo.Book.CREATOR.createFromParcel(data);
                    } else {
                        _arg0 = null;
                    }
                    this.addBook(_arg0);
                    reply.writeNoException();
                    return true;
                }
                default: {
                    return super.onTransact(code, data, reply, flags);
                }
            }
        }

        private static class Proxy implements com.competition.pdking.ipcdemo.IBookManager {
            private android.os.IBinder mRemote;

            Proxy(android.os.IBinder remote) {
                mRemote = remote;
            }

            @Override
            public android.os.IBinder asBinder() {
                return mRemote;
            }

            public java.lang.String getInterfaceDescriptor() {
                return DESCRIPTOR;
            }

            @Override
            public java.util.List<com.competition.pdking.ipcdemo.Book> getBookList() throws android.os.RemoteException {
                android.os.Parcel _data = android.os.Parcel.obtain();
                android.os.Parcel _reply = android.os.Parcel.obtain();
                java.util.List<com.competition.pdking.ipcdemo.Book> _result;
                try {
                    _data.writeInterfaceToken(DESCRIPTOR);
                    mRemote.transact(Stub.TRANSACTION_getBookList, _data, _reply, 0);
                    _reply.readException();
                    _result = _reply.createTypedArrayList(com.competition.pdking.ipcdemo.Book.CREATOR);
                } finally {
                    _reply.recycle();
                    _data.recycle();
                }
                return _result;
            }

            @Override
            public void addBook(com.competition.pdking.ipcdemo.Book book) throws android.os.RemoteException {
                android.os.Parcel _data = android.os.Parcel.obtain();
                android.os.Parcel _reply = android.os.Parcel.obtain();
                try {
                    _data.writeInterfaceToken(DESCRIPTOR);
                    if ((book != null)) {
                        _data.writeInt(1);
                        book.writeToParcel(_data, 0);
                    } else {
                        _data.writeInt(0);
                    }
                    mRemote.transact(Stub.TRANSACTION_addBook, _data, _reply, 0);
                    _reply.readException();
                } finally {
                    _reply.recycle();
                    _data.recycle();
                }
            }
        }

        static final int TRANSACTION_getBookList = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
        static final int TRANSACTION_addBook = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
    }

    public java.util.List<com.competition.pdking.ipcdemo.Book> getBookList() throws android.os.RemoteException;

    public void addBook(com.competition.pdking.ipcdemo.Book book) throws android.os.RemoteException;
}

  • IBookManager.java这个类他继承IInterFace接口,同时他也是一个接口,所有可以在Binder中传输的接口都需要继承IInterface接口。

  • 首先他声明了getBookList和addBook两个方法。这显然就是我们在aidl文件中声明的方法。同时还声明了两个id用于标记这两个方法。

  • 然后,他声明了一个内部类Stub,这个类就是一个Binder类,当位于一个进程时,方法调用不会走跨进程的transact过程;当位于不同的进程时,会走transact过程,这个逻辑由Stub的内部类Proxy完成。

然后逐个解释作用:

  • DESCRIPTOR——Binder的唯一标识,用来表示当前Binder的类名表示。
  • asInterface——将服务端的Binder对象转换为客户端所需的AIDL接口类型,这个转换过程是区分进程的。如果位于同一个进程那么此方法返回的就是服务端的Stub对象本身,否则返回系统封装的Stub.Proxy对象。
  • asBinder——返回当前Binder对象。
  • onTransact——这个方法运行在服务端的Binder线程池中,当客户端发起远程请求后,会经系统底层封装后交此方法来处理。 public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) 服务端通过code可以确定客户端请求的目标方法,接着从data中取出目标方法的参数,然后执行目标方法,目标方法执行完后,就向reply中写入返回值。
  • Proxy#getBookList——这个方法运行在客户端,调用流程如下:创建Parcel对象_data和_reply,接着调用transact方法发起远程调用请求,同时线程挂起,然后服务端的onTransact方法会调用,知道调用过程返回,当前线程继续执行,并从_reply中取出返回的结果,最后返回结果。
  • Proxy#addBook——和getBookList过程一样,只不过没有返回值。

使用

服务端

/**
 * @author liupeidong
 * Created on 2019/11/7 21:40
 */
public class MyService extends Service {

    IBookManager.Stub mBinder = new IBookManager.Stub() {
        @Override
        public List<Book> getBookList() throws RemoteException {
            return null;
        }

        @Override
        public void addBook(Book book) throws RemoteException {

        }
    };

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
}

客户端

public class MainActivity extends AppCompatActivity {

    IBookManager aidl;

    ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            aidl = 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(this, MyService.class);
        bindService(intent, connection, Context.BIND_AUTO_CREATE);

    }
}

这样就通过AIDL完成了进程间通信。

继承Binder实现继承间通信

服务端

服务端只要继承一个Binder,并完成重写onTransact方法,在onTransact方法里面对不同的方法进行判断即可。

	private MyBinder mBinder = new MyBinder();
 
	private class MyBinder extends Binder
	{
		@Override
		protected boolean onTransact(int code, Parcel data, Parcel reply,
				int flags) throws RemoteException
		{
			switch (code)
			{
			case 0x110:
			{
				data.enforceInterface(DESCRIPTOR);
				int _arg0;
				_arg0 = data.readInt();
				int _arg1;
				_arg1 = data.readInt();
				int _result = _arg0 * _arg1;
				reply.writeNoException();
				reply.writeInt(_result);
				return true;
			}
			case 0x111:
			{
				data.enforceInterface(DESCRIPTOR);
				int _arg0;
				_arg0 = data.readInt();
				int _arg1;
				_arg1 = data.readInt();
				int _result = _arg0 / _arg1;
				reply.writeNoException();
				reply.writeInt(_result);
				return true;
			}
			}
			return super.onTransact(code, data, reply, flags);
		}
 
	};
 

客户端

创建ServiceConnection 绑定IBinder

	private IBinder mPlusBinder;
	private ServiceConnection mServiceConnPlus = new ServiceConnection()
	{
		@Override
		public void onServiceDisconnected(ComponentName name)
		{
			Log.e("client", "mServiceConnPlus onServiceDisconnected");
		}
 
		@Override
		public void onServiceConnected(ComponentName name, IBinder service)
		{
 
			Log.e("client", " mServiceConnPlus onServiceConnected");
			mPlusBinder = service;
		}
	}; 

然后调用Binder的方法时需要注意,需要加上自己的方法标志或ID来区分不同的方法,然后的流程就可AIDL的差不多了,创建Parcel _data 和_reply,接着调用transact方法进行远程请求,最后从_reply读取结果即可。

	public void mulInvoked(View view)
	{
 
		if (mPlusBinder == null)
		{
			Toast.makeText(this, "未连接服务端或服务端被异常杀死", Toast.LENGTH_SHORT).show();
		} else
		{
			android.os.Parcel _data = android.os.Parcel.obtain();
			android.os.Parcel _reply = android.os.Parcel.obtain();
			int _result;
			try
			{
				_data.writeInterfaceToken("CalcPlusService");
				_data.writeInt(50);
				_data.writeInt(12);
				mPlusBinder.transact(0x110, _data, _reply, 0);
				_reply.readException();
				_result = _reply.readInt();
				Toast.makeText(this, _result + "", Toast.LENGTH_SHORT).show();
 
			} catch (RemoteException e)
			{
				e.printStackTrace();
			} finally
			{
				_reply.recycle();
				_data.recycle();
			}
		}
 
	}
	
	public void divInvoked(View view)
	{
 
		if (mPlusBinder == null)
		{
			Toast.makeText(this, "未连接服务端或服务端被异常杀死", Toast.LENGTH_SHORT).show();
		} else
		{
			android.os.Parcel _data = android.os.Parcel.obtain();
			android.os.Parcel _reply = android.os.Parcel.obtain();
			int _result;
			try
			{
				_data.writeInterfaceToken("CalcPlusService");
				_data.writeInt(36);
				_data.writeInt(12);
				mPlusBinder.transact(0x111, _data, _reply, 0);
				_reply.readException();
				_result = _reply.readInt();
				Toast.makeText(this, _result + "", Toast.LENGTH_SHORT).show();
 
			} catch (RemoteException e)
			{
				e.printStackTrace();
			} finally
			{
				_reply.recycle();
				_data.recycle();
			}
		}
 
	}

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

相关推荐

Android跨进程通信:AIDL与Binder机制详解

本文旨在为Android开发者提供关于跨进程通信机制的全面指南,特别聚焦于AIDL和Binder这两个核心组件。我们将涵盖从基础概念到高级优化的所有内容,使读者能够构建高效可靠的跨进程通信解决方案。文章首先介绍Android IPC的基本概念,然后深入AIDL和Binder的实现细节,接着通过实际案例展示如何应用这些技术,最后讨论性能优化和最佳实践。: 进程间通信,指不同进程间交换数据和调用方法的技术: Android接口定义语言,用于定义跨进程通信接口Binder。

移动开发前沿的博客 1241

【android Framework 探究】浅谈AIDL和Binder

先聊聊binder,本文不是讲binder,android中的binder框架说实话,要从内核-》驱动-》native-》JNI -》Framework-》app层,牵扯的知识点从内核调度,虚拟内存,内存映射,数据结构,线程管理和设计模式,覆盖面太大了,要真正吃透binder需要大量的时间投入,甚至可能走很多弯路,我的建议 对应用开发者,需要熟练掌握AIDL编写方式,理解Binder作者在android框架进程通讯的设计原理,理解常接触的Stub,Proxy这些角色的概念和Parcel序列化传输。 当然.

lucky_tom的专栏 901

gradle升级3.5.3 AIDL报错WriteNoException,IPC、Binder、AIDL,Binder和socket

IPC:Inter-Process Communication(进程间通信) Binder:Binder进程间通信机制 AIDL:Android Interface Definition Language(android接口定义语言) Intent:意图 IPC是一种概念,即进程间通信;其它几个都是Android里的概念; Binder是对IPC的具体实...

ZhangJiqun&191cm&85kg 643

Binder 与AIDL

Binder AIDL常见概念1.IPC2.Binder3.AIDLBinder与AIDL关系Binder机制如何实现进程间通信 常见概念 1.IPC IPC:Inter-Process Communication,进程间的通信或跨进程通信 2.Binder Binder是Android的一个类,它实现了IBinder接口。 从IPC角度来说,Binder是Android中的一种跨进程通信方式。通过这个Binder对象,客户端就可以获取服务端提供的服务或数据,这里的服务包括普通服务和基于AIDL的服务。

amynn的博客 650

MIMO-OFDM 通信-感知一体化(ISAC)中的联合优化与性能权衡

本文深入探讨了MIMO-OFDM技术在通信-感知一体化(ISAC)系统中的核心作用与挑战。文章分析了如何通过联合优化资源分配、波束成形与波形设计,在有限的频谱与硬件资源下,实现通信速率与感知精度之间的最佳平衡,并指出了工程实践中面临的同步、干扰等关键难题。

dapp9builder的博客 215

树莓派Bookworm系统避坑指南:3种方法解决pip install报错externally-managed-environment

本文详细解析树莓派Bookworm系统中pip install报错externally-managed-environment的成因,并提供三种实用解决方案:使用虚拟环境(venv)隔离项目依赖、通过pipx管理全局Python工具,以及理解风险后的系统安装方法。帮助开发者安全高效地管理Python环境,避免系统冲突。

android的专栏 763

对AIDL和Binder的理解

AIDL只是方便开发者使用Binder的“工具”,Binder是用来跨进程调用的。如果没有AIDL,自己写Binder实现跨进程通信还是挺麻烦的,而且都是重复性的代码。 服务端: 会有一个Binder子类Stub的实例,Stub需要继承Binder,重写onTransact方法。这个Binder实例接受远程请求,进入onTransact方法处理,在onTransact中是需要能调用具体处理代码,其实通过组合的方式也是可以的,Binder中拥有IBookManager的实例,不过AIDL中是通过继承的方式实现

“点点”专栏 953

CPG控制网络入门

从线性变换开始推导

妖米的博客 5044

说说Binder和AIDL

例如,在 Android 中,一个应用中的 Activity 可能作为客户端,通过 Binder 与系统服务(如 ActivityManagerService)进行通信,以完成诸如启动新 Activity 等操作。AIDL 适用于需要在不同进程之间进行复杂数据交互和方法调用的场景,但其使用相对较为复杂,需要开发者对进程间通信的原理有一定的理解。跨进程通信:允许在不同的应用进程之间进行通信,使得一个进程可以调用另一个进程中服务实现的方法。客户端使用:在客户端中,通过绑定服务来获取 AIDL 接口的实例。

challenge51all的专栏 1037

节卡Jaka Zu APP编程避坑指南:从频繁通讯错误到稳定Socket交互的调试心得

本文详细解析了节卡Jaka Zu APP编程中常见的通讯错误问题,并提供了从基础排查到高级调试的完整解决方案。通过优化网络配置、固件匹配、心跳机制和数据交互规范,开发者可实现稳定的Socket通讯,有效提升工业机器人操控的可靠性。文章特别针对v1.6.7.3版本的典型问题给出了实用调试技巧。

weixin_42639633的博客 321

图像识别火灾检测系统实战:从火焰特征到YOLO部署全解析

计算机视觉技术正深入改变传统消防的感知方式。图像识别火灾检测利用摄像头采集的视频流,通过颜色、动态和形态特征分析,实现早期火情的自动发现与定位。其核心原理在于,火焰在视觉上具有独特的颜色分布、闪烁特性和轮廓变化,借助目标检测模型如YOLO,可在复杂场景中区分真实火焰与干扰物。这项技术广泛应用于仓库、园区、隧道等大空间场所,是智慧消防的重要支撑。本文从火焰视觉特征、数据集构建、模型选型与系统架构设计出发,结合部署实践中的误报与算力优化经验,为开发者提供一套可落地的视频火焰检测方案。

weixin_42533751的博客 245

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

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

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

青岛鼎信Java开发面试题及参考答案(3万字长文,多张原理图)

MySQL 的事务特性有哪些? MySQL 事务具有四个重要特性,被称为 ACID 特性。 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。例如,在银行转账场景中,从账户 A 转账到账户 B,包括扣减账户 A 的金额和增加账户 B 的金额这两个操作必须作为一个整体来完成。如果在执行过程中发生错误,比如系统崩溃或者数据库出现故障,那么已经执行的部分必须全部回滚,就好像整个转账操作从未发生过一样。 一致性(Consistency):事务必须

大模型大数据攻城狮的专栏 1088

Binder和AIDL

AIDL的简单使用

qq_54348654的博客 593

湿式双离合器自动变速器simulink建模与仿真

随着汽车工业的不断发展,自动变速器在提高汽车性能、驾驶舒适性和燃油经济性等方面发挥着越来越重要的作用。湿式双离合器自动变速器(Wet Dual-Clutch Transmission,简称 WDCT)作为一种先进的自动变速器技术,具有换挡速度快、动力传递平稳、燃油经济性好等优点,被广泛应用于各类汽车中。结构组成湿式双离合器自动变速器主要由双离合器、齿轮传动系统、液压控制系统和电子控制系统等部分组成。双离合器:由两个独立的离合器组成,分别控制奇数挡和偶数挡。通过切换两个离合器的工作状态,可以实现快速换挡。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 348

元数据治理实战:构建企业数据地图与血缘体系

元数据(Metadata)是描述数据的数据,是你能了解“数据是怎么来的”、“它是做什么的”、“能不能用”的基础信息。📌 举个例子:order_idstringods_order定义:平台内用户在订单系统中产生的唯一订单编号更新时间:每天凌晨 2 点,由 Airflow 调度任务生成所属人:张三(数据开发部)🔍 这些信息本身不直接参与计算,但它们是数据可管理、可追踪、可评估的基础。模块实战建议元数据类型技术 + 业务 + 操作元数据三类统一治理治理路径。

晴天彩虹雨的博客 290

安卓AIDL和binder机制

一、AIDL(Android Interface Definition Language,安卓接口定义语言) 1. AIDL 概念 不同程序和不同进程【即不同工程】之间的通信 设计AIDL这门语言的目的就是为了实现进程间通信。在Android系统中,每个进程都运行在一块独立的内存中,在其中完成自己的各项活动,与其他进程都分隔开来。可是有时候我们又有应用间进行互动的需求,比较传递数据或者任务委托等,AIDL就是为了满足这种需求而诞生的。通过AIDL,可以在一个进程中获取另一个进程的数据和调用其暴露出来的

mike_jungle的博客 676

Statistics and Machine Learning Toolbox

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

一文分析Binder机制和AIDL的理解

为什么要去理解Android的进程间通信机制 对于Android开发工程师来说,如果不去理解进程间通信机制也可以使用系统提供的API完成应用开发,但如果想要达到更高的层级,那么就不能简单只会调用API。无论是工作中遇到一些疑难问题,还是想要学习源码的一些功能实现,或者是想要提升APP的性能等,这些工作都需要我们去看系统的源码,而系统的源码中进程间通信无处不在,如果不理解进程间通信机制,那么很难看懂系统源码,而且容易迷失在大量的代码中。 Android 进程间通信机制 为什么使用Binder作为Android

nufuli123的博客 2973

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android中的binder和aidl机制

在 Android 应用程序中,一般都是通过在 AIDL 文件中定义跨进程访问的接口,并通过 Binder 实现这些接口,从而实现应用程序之间的通信。在android framework中提供了Binder类,一个类如果扩展Binder类,那么该类就有提供远程服务的能力,该类对象一旦创建,其内部就会创建一个隐藏的线程,用来接收binder驱动发送的消息,从而调用Binder类的onTransact()方法。Binder 驱动程序通过管理进程间的连接、数据传输等操作,完成了基于 AIDL 的进程间通信功能。

easonguolong的博客 1096

AIDL 和binder 原理

文章中提到的 IBookManager 和 getBookList 是下面代码中的 IMyAidlInterface 和 sum(**)函数GIT: https://github.com/whtchl/AidlTemplateBinder的原理 要想了解AIDL就需要先了解Binder的原理,所以这里先说一下Binder原理,Binder的原理大概是这样: 服务器端:当我们在服务端创建好了一个B

michael1112的专栏 480

Android 中的AIDL 和 binder机制

一,Binder 1,线程间通信Handler Handler和Binder是Android通信的两大支柱,Handler是线程间通信的基础,一个App的运行一定是多个线程相互协作的过程,特别是Android子线程不能更新UI界面的限制使得线程间的通信机制Handler尤为重要。 2,进程间通信 2.1 初识Bindler Android进程间的通信基于Binder机制...

epitomizelu的专栏 512

AIDL和Binder图解

AIDL和Binder图解

天盟 - 技术博客 - Eamon 1077

Android AIDL和Binder机制相关学习总结

Binder 参考资源 为什么 Android 要采用 Binder 作为 IPC 机制?

张雨的博客 758

Binder机制原理和AIDL使用

Binder是Android系统中用于不同进程间通信(IPC)的一种高效机制。它基于Client-Server架构,允许客户端(如Activity、Service等)通过Binder代理对象与服务器端进行通信。在通信过程中,数据只需从发送方进程的用户空间拷贝到内核空间一次,然后由接收方进程直接从内核空间访问,从而减少了数据拷贝的次数,提高了通信效率。减少拷贝次数:如果发送方与内核空间进行映射,那么数据仍然需要从发送方的用户空间拷贝到内核空间,然后再从内核空间拷贝到接收方的用户空间(即使是通过共享内存)。

望佑 980

基础篇-Binder机制和AIDL使用介绍

关于远程服务调用过程中,跨进程通信知识的整理分析

gjr9596的专栏 1632
上一篇: Android四大组件之Service、ContentProvider、BroadcastReceiver
下一篇: Activity启动流程总结
PdKingLiu
博客等级 码龄9年 89粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值