AIDL与Binder详解_顾梁

来源:互联网 发布:mac上炒股软件 编辑:程序博客网 时间:2024/05/21 19:46

首先我们说一下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

0 0
原创粉丝点击