昨天做项目的时候,需要开一个客户端使用AIDL进行访问另一个App的离线数据。我们知道使用Aidl可以传递一些简单的数据类型,但是传递一些自定义类型可就麻烦了,经过查阅资料发现只要将类序列化就行,但是还是有许多坑,今天做一下笔记。
今天做的是将一个伪造一些基本数据和bitmap对象存放到集合中再存放到类中,让客户端跨进程进行访问这些数据。
服务端:
1、先写一下我们的AIDL,里面现在先什么也不写。
// IMyAidlInterface.aidl
package com.example.slidemenudemo;
// Declare any non-default types here with import statements
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
}
2、自定义类型的操作
现在我们就写一下传递的对象,我要传递的信息包括人的姓名、年龄、性别、头像,我们先写传递的对象类这个类需要序列化的,我写这个类的基本方式是创建一个类写上属性,写set-get方法,然后再写一个包含所有属性的构造方法,一个没有任何属性的空构造方法,然后再往类上添加实现Parcelable然后你就快捷,AndroidStudio会自动补全所有的重写的方法(注意这个文件写在上边创建Aidl文件的同级目录,下同)。
package com.example.aidl_service;
import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by tcoy on 16-10-7.
*/
public class Data implements Parcelable {
private String name;
private int age;
private String sex;
private Bitmap bitmap;
public Data(String name, int age, String sex, Bitmap bitmap) {
this.name = name;
this.age = age;
this.sex = sex;
this.bitmap = bitmap;
}
protected Data(Parcel in) {
name = in.readString();
age = in.readInt();
sex = in.readString();
bitmap = in.readParcelable(Bitmap.class.getClassLoader());
}
public static final Creator<Data> CREATOR = new Creator<Data>() {
@Override
public Data createFromParcel(Parcel in) {
return new Data(in);
}
@Override
public Data[] newArray(int size) {
return new Data[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
dest.writeString(sex);
dest.writeParcelab