AIDL使用(二)

记得很久之前写过一篇AIDL使用(一),这次写AIDL使用的另外一种情况。我们先看看系统帮我们创建的aidl文件的默认情况是怎样的。

void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);

这里面有int,long,boolean,float,double,String类型,但是如果我们希望传进来的类型是一个对象,那该怎么办?所以我们这里就要引入序列化的概念。
对象序列化其实就是把一个对象变成一个二进制数据流的方法,方便跨进程传输。通常有两种方法,实现Serializable接口或者Parcelable接口。Serializable这个接口是Java提供的接口,它的实现步骤比较简单,但是开销就比较大,序列化和反序列化都需要大量的I/O操作。而Parcelable接口是Android中序列化的方式,使用起来虽然有点麻烦,但是效率比较高,Android也是推荐这种方法,下面我们就来看看如何用Parcelable实现数据的跨进程传输。

  • 首先定义一个Person类,实现Parcelable接口
public class Person implements Parcelable {

    private String name;
    private int age;

    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }

    //setter()和getter()方法

    protected Person(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            return new Person(in);
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }

    @Override
    public String toString() {
        return "name:" + name + "、age:" + age;
    }
}

其中writeToParcel()这个方法就是打碎片的工作,执行序列化的工作。而CREATOR 就是做反序列化的工作,并且通过createFromParcel()读取,读取的时候要注意,读取的顺序跟序列化的顺序要保持一致,否则会出错。

  • 创建Person.aidl文件
parcelable Person;
  • 在定义方法的aidl文件里面导包
//必须导入Person所在的包
import com.example.xing.aidldemo.Person;

interface IMyAIDL {

   List<Person> add(in Person person);
}
  • 在服务器端实现这个方法,通过onBind()返回
@Override
    public IBinder onBind(Intent intent) {
        persons = new ArrayList<>();
        return iBinder;
    }

    private IBinder iBinder = new IMyAIDL.Stub() {
        @Override
        public List<Person> add(Person person) throws RemoteException {
            persons.add(person);
            return persons;
        }
    };
  • 在服务器端这边将Person的java代码和aidl复制到客户端
    这里写图片描述
    注意:包名要也要保持一致,而且Person类的包必须是java的下一级

我们现在在客户端的按钮点击一次,就添加一个Person,再输出看看什么情况。

@Override
    public void onClick(View view) {
        try {
            ArrayList<Person> persons = (ArrayList<Person>) iMyAidl.add(new Person("AAA",12));
            Log.i("Persons",persons.toString());
        } catch (RemoteException e) {
            e.printStackTrace();
        }

    }

这里写图片描述
点击了三次之后,确实多了三个Person,证明这个是成功的。

下一次将会解析一下Binder的使用以及上层的原理。

猜你喜欢

转载自blog.csdn.net/lihuanxing/article/details/52460652