本文中的代码是《安卓开发的艺术探索》例子
首先在新建工程下,增加一个服务端的模块myservices,在src/main下右键新建Book.aidl文件如图所示
在java目录下相同包名,创建Book.java文件,新建IBookManager.aidl文件,修改Book.aidl文件,增加 parcelable Book;
修改IBookManager.aidl文件 这里注意需要导包(Book)
新建Book类如图所示
public class Book implements Parcelable {
public int bookId;
public String bookName;
public Book(int bookId, String bookName) {
this.bookId = bookId;
this.bookName = bookName;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(bookId);
out.writeString(bookName);
}
public void readFromParcel(Parcel dest) {
bookId = dest.readInt();
bookName = dest.readString();
}
public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {
@Override
public Book createFromParcel(Parcel in) {
return new Book(in);
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
private Book(Parcel in) {
bookId = in.readInt();
bookName = in.readString();
}
}
然后make module在java-generate包下产生IBookManager.java类
创建BookService 在xml配置参数
public class BookService extends Service {
private final String TAG = "Server";
private List<Book> bookList;
public BookService() {
}
@Override
public void onCreate() {
super.onCreate();
bookList = new ArrayList<>();
initData();
}
private void initData() {
Book book1 = new Book(1,"西游记");
Book book2 = new Book(2,"红楼梦");
Book book3 = new Book(3,"三国演义");
Book book4 = new Book(4,"西厢记");
Book book5 = new Book(5,"诗经");
Book book6 = new Book(6,"四书五经");
bookList.add(book1);
bookList.add(book2);
bookList.add(book3);
bookList.add(book4);
bookList.add(book5);
bookList.add(book6);
}
private final IBookManager.Stub stub = new IBookManager.Stub() {
@Override
public List<Book> getBookList() throws RemoteException {
return bookList;
}
@Override
public void addBookInOut(Book book) throws RemoteException {
if (book != null) {
book.setBookName("服务器改了新书的名字 InOut");
book.setBookId(bookList.size()+1);
bookList.add(book);
} else {
Log.e(TAG, "接收到了一个空对象 InOut");
}
}
};
@Override
public IBinder onBind(Intent intent) {
return stub;
}
}
客户端:
新建项目下myclient model
将客户端的aidl整个文件夹拷贝到模块main文件夹下,
将服务端Book.java文件拷到客户端同名文件夹下,它Book的包名与服务端Book包名一样
make module也会生成IBookManager.java
在Activity中设置
public class MainActivity extends AppCompatActivity {
private final String TAG = "Client";
private IBookManager bookController;
private boolean connected;
private List<Book> bookList;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
bookController = IBookManager.Stub.asInterface(service);
connected = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
connected = false;
}
};
private View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_getBookList:
if (connected) {
try {
bookList = bookController.getBookList();
} catch (RemoteException e) {
e.printStackTrace();
}
log();
}
break;
case R.id.btn_addBook_inOut:
if (connected) {
Book book = new Book(bookList.size()+1,"这是一本新书 InOut");
try {
bookController.addBookInOut(book);
Log.e(TAG, "向服务器以InOut方式添加了一本新书");
Log.e(TAG, "新书名:" + book.getBookName());
} catch (RemoteException e) {
e.printStackTrace();
}
}
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_getBookList).setOnClickListener(clickListener);
findViewById(R.id.btn_addBook_inOut).setOnClickListener(clickListener);
bindService();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (connected) {
unbindService(serviceConnection);
}
}
private void bindService() {
Intent intent = new Intent();
intent.setPackage("com.rk.myservices");
intent.setAction("android.intent.action.BookService");
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
}
private void log() {
for (Book book : bookList) {
Log.e(TAG, book.toString());
}
}
}