跨进程通讯Binder的onTransact方法一定在binder线程池的binder线程中执行吗?

本文深入探讨Android中Binder机制在特定场景下的工作原理,特别是在主线程处理远程请求的情况。通过实例展示了当主线程空闲时,如何优化Binder通信,使客户端Binder回调在主线程中执行,而非Binder线程。

一.引言

在大多数人的印象中,在Android中用Binder机制进行跨进程通讯,Binder会在onTransact方法中处理Binder驱动发送过来的消息,这个方法会运行在Binder驱动所管理的Binder线程池中(Binder线程的创建和销毁是在用户空间,但是管理是由Binder驱动代为管理的)。
其实这么说是不对的,片面的,在大多数情况下,onTransact()方法的确是在Binder线程中处理Binder驱动发送过来的消息。除了一种情况,在两个进程中都存在Binder实体对象,相互发送远程请求的时候。
对Android的Binder机制有一定了解的朋友一定都知道,在一次跨进程通讯过程中主要涉及到四种类型的Binder。Server端持有Binder的本地对象,在本地的Binder创建的时候,在Binder驱动中会生成一个Binder实体对象,对应Server端的本地对象。在Client端向Server端发送请求的时候,我们会创建一个Binder代理对象,同样的Binder驱动会为我们创建一个Binder引用对象。


下面就用实际的例子为大家演示上面所说的特殊情况。实例通过AIDL来实现跨进程通讯(AIDL基于Binder,简化了Binder跨进程r通讯的实现。)

二.创建两个AIDL接口文件

首先我们创建两个AIDL文件。如下图所示:
在这里插入图片描述
在这里插入图片描述
IBinder类型的对象是可以用于跨进程通讯传输的(在Android中应用程序所在的进程,和AMS进行通讯,就是传递了一个本地的Binder对象(即ApplicationThread)过去方便AMS与应用程序进行通讯)。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值