理论

定义

安卓接口定义语言(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);

}

根据接口实现服务

  1. 实现的服务需要继承Stub文件
  2. 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;
    }

}

 

 客户端

按照服务端的相同包名在客户端创建下述文件

  1. 如果有新定义给AIDL语言的类型,需要创建类型对应AIDL文件以及Java文件(如果Book.aidl,Book.java),需要与服务端保持相同包名
  2. 服务接口的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;
        }
    };

通过这个对象调用服务

  1. 这个方法的实现以及运行过程都在服务端,也即是服务端的进程内部
  2. 调用服务只是返回方法运行结果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

参考

https://www.jianshu.com/p/29999c1a93cd

https://blog.csdn.net/qq_41739313/article/details/123322808