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
- AIDL与Binder详解_顾梁
- AIDL与Binder下篇_顾梁
- Binder与AIDL服务
- Binder与AIDL服务
- AIDL 与 Binder机制
- android Binder与AIDL
- AIDL 与Binder
- binder与aidl机制区别
- AIDL与Binder的区别
- AIDL使用和Binder机制详解
- Binder与Service 通信机制详解四 (源码分析AIDL工作机制)
- Binder AIDL
- Binder&AIDL
- Service与AIDL详解
- Android aidl Binder进程间的通信以及使用详解
- Android中的跨进程通信AIDL、Binder源码详解
- AIDL与Binder与Messenger的使用区别!
- IPC、Binder、AIDL与Intent之间区别与联系
- qmake: could not exec ‘/usr/lib/x86_64-linux-gnu/qt4/bin/qmake’: No such file or directory
- 微信 js接口 的调用
- 大数相加问题
- 求微软公司(MSFT)2015年每个月度股票收盘价的平均值。
- Java抽象类
- AIDL与Binder详解_顾梁
- 3D数学基础----四元素
- Java中a+=b和a=a+b的区别
- 如何在C#中读写INI文件
- WebRTC && Real Time Audio Mixing
- Linux Shell脚本快速入门
- WebRTC第七步:webrtc编译调试
- 软件开发工具第三章
- [NOIP2015] 信息传递 D1 T2