AIDL学习及解析《一》

本文详细介绍了AIDL(Android Interface Definition Language),包括它的作用、使用场景、使用步骤。从客户端、服务端到Binder驱动,阐述了AIDL在进程间通信中的角色。此外,文章还探讨了oneway关键字、数据流向(in、out、inout)的影响,以及支持的数据类型,特别提到了Map类型作为传输数据时的注意事项。
摘要由CSDN通过智能技术生成

简介

AIDL:Android Interface Definition Language,android接口定义语言。可以利用它定义客户端与服务端使用进程间通信进行相互通信时都认可的编程接口;Android上,一个进程通常无法访问另一个进程的内存。进程需要将其对象分解成能够识别的原语,并将对象编组成跨越边界的对象。编写执行这一编组操作的代码是一项繁琐的工作。因此Android会使用AIDL。

使用场景

不同应用的客户端使用IPC方式进行访问服务,并且想要在服务中处理多线程;该种情况下需使用AIDL。

如果不需要执行跨越不同应用的并发IPC,应该通过实现一个Binder创建接口;
如果你想执行IPC,但根本不需要处理多线程,则使用Messager类来实现接口(Messager也是基于AIDL进行实现的)。

使用

AIDL的使用基本分为以下几步:
1. 在项目 src/ 目录中加入 .aidl 文件。
2. 声明一个 IBinder 接口实例(基于 AIDL 生成)。
3. 实现 ServiceConnection。
4. 调用 Context.bindService(),以传入您的 ServiceConnection 实现。
5. 在您的 onServiceConnected() 实现中,您将收到一个 IBinder 实例(名为 service)。调用 YourInterfaceName.Stub.asInterface((IBinder)service),以将返回的参数转换为 YourInterface 类型。
6. 调用您在接口上定义的方法。您应该始终捕获 DeadObjectException 异常,它们是在连接中断时引发的;这将是远程方法引发的唯一异常。
7. 如需断开连接,请使用您的接口实例调用 Context.unbindService()。

客户端、服务端、Binder驱动

Android Binder框架分为服务器接口、Binder驱动、以及客户端接口;简单想一下,需要提供一个全局服务,那么全局服务那端即是服务器接口,任何程序即客户端接口,它们之间通过一个Binder驱动访问。

服务器端接口:实际上是Binder类的对象,该对象一旦创建,内部则会启动一个隐藏线程,会接收Binder驱动发送的消息,收到消息后,会执行Binder对象中的onTransact()函数,并按照该函数的参数执行不同的服务器端代码。

Binder驱动:该对象也为Binder类的实例,客户端通过该对象访问远程服务。

客户端接口:获得Binder驱动,调用其transact()发送消息至服务器。

这里写图片描述

Aidl接口类图关系

这里写图片描述

oneway

关键字,用于修改远程调用的行为。

  1. 本地调用
    如果oneway用于本地调用,则不会有任何影响,调用仍是同步调用。
  2. 远程调用
    使用该关键字时,远程调用不会阻塞,它只是发送事务数据并立即返回。接口的实现最终接收此调用时,是以正常远程调用形式将其作为来自Binder线程池的常规调用进行接收。

不加oneway的代码:

Proxy类:
private static class Proxy implements demo.sunrise.com.aidldemo.IMyAidlTest
{
   
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 void max(int x, int y) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeInt(x);
_data.writeInt(y);
mRemote.transact(Stub.TRANSACTION_max, _data, _reply, 0);
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}

onTransact方法:
@Override public 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值