AIDL定义
AIDL,全称Android Interface Definition Language,即Android接口定义语言。Android的一种进程间通信方式,同时也是Binder和Messager的底层。
在很多介绍aidl的文章中,都可以发现有三种定向tag:in、out、inout的使用,它们一般用于修饰aidl文件中的非基本类型参数。那么它们都是做什么用的呢?
经过本人一阵摸索,掌握了一些规律,分享出来,供大家参考~
- in: 默认方式;客户端将参数传给服务端使用,如同子弹,打出去就不管了~
- out:客户端将一个参数传给服务端,服务端将其作为容器,丢弃其中所有属性值后,再填充内容,然后还给客户端继续处理;如同一个盘子,服务端装满食物后,由客户端使用~
- inout:客户端将参数传给服务器,服务端可以使用参数的值,同时对这个参数进行修改,客户端会得到修改后的参数,如果是集合数组等,可修改其内部的子对象;如同客户端传给服务端一本书,服务端可以查看书中内容,也可以做一些笔记,然后还给客户端。
下面用代码演示~
1、首先看AIDL文件:
// IBookManager.aidl
package com.example.wang.client.aidl;
import com.example.wang.client.bean.OrderBean;
interface IOrderManager {
List<OrderBean> getAll();
void add(in OrderBean bean);
void getNameList(out String[] names);
void updateIdList(inout String[] ids);
void getOrder(out OrderBean bean);
void updateOrder(inout OrderBean bean);
}
// OrderBean.aidl
package com.example.wang.client.bean;
parcelable OrderBean;
2、OrderBean类
package com.example.wang.client.bean;
...
public class OrderBean implements Parcelable{
private String id;
private String name;
private int amount;
public OrderBean(){}
public OrderBean(String id, String name, int amount) {
this.id = id;
this.name = name;
this.amount = amount;
}
protected OrderBean(Parcel in) {
id = in.readString();
name = in.readString();
amount = in.readInt();
}
public static final Creator<OrderBean> CREATOR = new Creator<OrderBean>() {
@Override
public OrderBean createFromParcel(Parcel in) {
return new OrderBean(in);
}
@Override
public OrderBean[] newArray(int size) {
return new OrderBean[size];
}
};
//省略get/set方法
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(name);
dest.writeInt(amount);
}
public void readFromParcel(Parcel in){
id = in.r