AIDL与Binder详解_顾梁

首先我们说一下AIDL是什么?
AIDL即是Android 接口定义语言,其实按这种官方的语句解释出来,并不能非常好的理解它,这里我们先说到这里,等下讲Binder的时候,再过来问答AIDL是什么。
AIDL是用来干什么的?
AIDL是用来进行进程间通信的。
这里我们提出疑问,AIDL它能提供进程间的通信,是因为它本身实现了底层逻辑吗?
其实并不是的,真正能实现进程间通信的其实的Binder。
AIDL能实现进程通信,其实是表像,它所提供的功能实际只是按一定的规则生成代码而已。
那么我们先看一下我们实际应用AIDL。
在Eclipse上使用AIDL 首先我们需要创建一个后缀名为aidl的文件,并且按AIDL定义的语法进行书写,关于AIDL的语法请自行百度。
既然是进程间通信,那么我们命名JiaFaService这个项目用来提供服务。

这里写图片描述
Aidl文件中的内容

这里写图片描述

很简单,我只是定义一个add的方法,在aidl文件所写的内容,就是我写的基本信息,然后系统会根据我所写的信息去按一定规则生成代码。
在gen目录下,我们会发现系统自动帮我生成的java文件。
点进去查看

/*
 * This file is auto-generated.  DO NOT MODIFY.
 * Original file: D:\\EWrokSpeace\\JiaFaClent\\src\\aidl\\IJiaFa.aidl
 */
package aidl;
public interface IJiaFa extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements aidl.IJiaFa
{
private static final java.lang.String DESCRIPTOR = "aidl.IJiaFa";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
 * Cast an IBinder object into an aidl.IJiaFa interface,
 * generating a proxy if needed.
 */
public static aidl.IJiaFa asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof aidl.IJiaFa))) {
return ((aidl.IJiaFa)iin);
}
return new aidl.IJiaFa.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
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_add:
{
data.enforceInterface(DESCRIPTOR);
int _arg0;
_arg0 = data.readInt();
int _arg1;
_arg1 = data.readInt();
int _result = this.add(_arg0, _arg1);
reply.writeNoException();
reply.writeInt(_result);
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements aidl.IJiaFa
{
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 int add(int x, int y) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
int _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeInt(x);
_data.writeInt(y);
mRemote.transact(Stub.TRANSACTION_add, _data, _reply, 0);
_reply.readException();
_result = _reply.readInt();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}
static final int TRANSACTION_add = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
}
public int add(int x, int y) throws android.os.RemoteException;
}

当我们看到所生成的java文件是,大家肯定是看晕了。。
所以我准备先不讲里面的代码。先让大家看效果图。
我们在JiaFaService中创建服务,并且提供add方法的实现。
这里写图片描述
具体代码:
这里写图片描述

然后我们在Activity中去启动服务。
这里写图片描述
最后进程间通信只能隐式意图,需要我们在清单配置文件中,给Service设置一下intent.
这里写图片描述
这里服务端的已经写完了,我们创建另外一个项目。客服端的项目。
我们把服务端所创建的Aidl文件,连包一起复制到客户端中去。
这里写图片描述
在客户端我们只需绑定服务端的服务,即可去利用服务端的计算逻辑。
这里写图片描述
至此AIDL的基本应用的写法就此结束,我们先运行下服务端,开始服务,然后在运行客户端,看是否能从服务端中算出正确的结果。这里写图片描述
可以看到,客户端并没有计算逻辑。但是能从服务端获取结果。以上就是AIDL的基本的简单逻辑。
下一篇会分析Binder对象。
http://blog.csdn.net/tarena_3g/article/details/52818897

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值