理论
定义
安卓接口定义语言(Android Interface Define Language)
优点
- 用于跨进程并发通信
- 简化进程间通信的操作步骤,增加代码复用率
- 占用资源较少
原理

分类
定义AIDL语言支持的类型
package xxx.xx; parcelable xx;
定义接口
给具体实现的服务定义一个规范,声明参数,方法名,返回值等
使用
服务端
定义AIDL支持的类型Book:Book.aidl
package com.czy.server; parcelable Book;
具现类型Book
public class Book implements Parcelable{ ...... }
定义接口规范BookController.aidl
- 给客户端提供调用说明
- 给服务端提供实现标准
- 如果有使用到的定义给AIDL语言的类型,需要精确导入
- 创建本文件的时候系统会根据这个文件生成相应的Stub文件,如果需要对这个定义做改动,需要清除一下生成的Stub文件,使得系统可以刷新修改

package com.czy.server; import com.czy.server.Book; interface BookController { List<Book> getBookList(); void addBookInOut(inout Book book); }
根据接口实现服务
- 实现的服务需要继承Stub文件
- Stub是IBinder的子类,服务继承Stub可以支持binder通信
public class BCService extends BookController.Stub { @Override public List<Book> getBookList() throws RemoteException { return bookList; } @Override public void addBookInOut(Book book) throws RemoteException { if (book != null) { book.setName("服务器改了新书的名字 InOut"); bookList.add(book); } else { Log.e(TAG, "接收到了一个空对象 InOut"); } } };
定义Service提供给客户端绑定
将实现的服务作为binder提供给客户端用于通信
/** * 作者:叶应是叶 * 时间:2017/8/26 0:07 * 描述: */ public class AIDLService extends Service { private final String TAG = "Server"; private List<Book> bookList; public AIDLService() { } @Override public void onCreate() { super.onCreate(); bookList = new ArrayList<>(); initData(); } private void initData() { Book book1 = new Book("活着"); Book book2 = new Book("或者"); Book book3 = new Book("叶应是叶"); Book book4 = new Book("https://github.com/leavesC"); Book book5 = new Book("http://www.jianshu.com/u/9df45b87cfdf"); Book book6 = new Book("http://blog.csdn.net/new_one_object"); bookList.add(book1); bookList.add(book2); bookList.add(book3); bookList.add(book4); bookList.add(book5); bookList.add(book6); } @Override public IBinder onBind(Intent intent) { return stub; } }
客户端
按照服务端的相同包名在客户端创建下述文件
- 如果有新定义给AIDL语言的类型,需要创建类型对应AIDL文件以及Java文件(如果Book.aidl,Book.java),需要与服务端保持相同包名
- 服务接口的aidl文件,用于给客户端提供声明

绑定服务端的service,通多IBinder接口获取继承了Stub的具体服务实现对象
private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { bookController = BookController.Stub.asInterface(service); connected = true; } @Override public void onServiceDisconnected(ComponentName name) { connected = false; } };
通过这个对象调用服务
- 这个方法的实现以及运行过程都在服务端,也即是服务端的进程内部
- 调用服务只是返回方法运行结果
参考
https://www.jianshu.com/p/29999c1a93cd
https://blog.csdn.net/qq_41739313/article/details/123322808
浙公网安备 33010602011771号