return new Book(source); } @Override public Book[] newArray(int size) { return new Book[size]; } }; } ```java // Book.aidl package com.example.xiahao.myapplication; parcelable Book; // IBookManager.aidl package com.example.xiahao.myapplication; // Declare any non-default types here with import statements import com.example.xiahao.myapplication.Book; interface IBookManager { List<Book> getBookList(); void addBook(in Book book); }膳绫擎庞个文件中,Book.java是一个表示图手札息的类,它实现了Parcelable接口。Book.aidl 是Book类在AIDL中的声明。IBookManager.aidl是我们定义的一个接口,琅绫擎有两个办法 getBookList() 和addBook(),个中getBookList用于大年夜长途办事端获取图书列表,而addBook是添加一本书。固然Book类已经和IBookManager位于雷同的包中,但IBookManager仍然须要导入Book类,这就是AIDL的特别之处。builde的项目,体系为我们在gen目次下临盆IBookManage.java的类,接下来我们须要根据这个体系生成的IBookManag类来分析Binder的工作道理 /* * This file is auto-generated. DO NOT MODIFY. * Original file: /Users/xiahao/Documents/WorkSpace/AndroidStudioProjects/MyApplication/app/src/main/aidl/com/example/xiahao/myapplication/IBookManager.aidl */ } 可以看到根据IBookManager.aidl体系为我们生成了IBookManager.java这个类,它持续了IInterface这个接口,同时它本身也照样个接口,所以可以在Binder中传输的接口都须要持续IInterface接口。
起首,它声清楚明了两个办法getBookList 和 addBook ,这就是我们在IBookManger.aidl中所声明的办法,同时它还声清楚明了两个整数的id分别用于标识这两个办法,这两个id用标识在transact过程客户端请求的到底是哪个办法。接着,还声清楚明了一个内部类Stub,这个Stub就是一个Biner类,当客户端和办事端都位于同一个过程中,办法调用不会走跨过程的transact过程,而当两者位于不合的过程中,办法须要走transact过程,这个逻辑由Stub的内部代劳类 Proxy来完成。所以这个接口的实现核心就是它的内部类Stud和Stub的内部代劳类 Proxy。
Binder的独一标识,一般用于当前的Binder的类名表示,比如本例中的 “com.example.xiahao.IBookManger”