背景 在平时的业务开发中,我们往往需要开发自定义的系统服务来处理自己特殊的需求,这里介绍的是添加自定义的Java系统服务,可以在系统App中直接调用
定义aidl Binder默认可以传输基本类型的数据,如果要传递类对象,则这个类需要实现序列化。我们先定义一个序列化的自定义类型,用于binder间参数传递。主要分为两步:
创建自定义类型,实现Parcelable接口
// QSSI.13/frameworks/base/core/java/android/bean/Person.java package android.bean;
import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable;
public final class Person implements Parcelable { // 注意定义成员变量的顺序,后面读取和写入都必须按这个顺序 private String mName; private int mAge;
public Person() {
}
public Person(@NonNull String name, int age) {
this.mName = name;
this.mAge = age;
}
private Person(@NonNull Parcel in) {
// 注意定义成员变量的顺序
this.mName = in.readString();
this.mAge = in.readInt();
}
@NonNull
public String getName() {
return mName;
}
public int getAge() {
return mAge;
}
public void setName(@NonNull String name) {
mName = name;
}
public void setAge(int age) {
mAge = age;
}
@Override
public int describeContents() {
return 0;
}
//
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
// 注意定义成员变量的顺序
dest.writeString(this.mName);
dest.writeInt(this.mAge);
}
public void readFromParcel(@NonNull Parcel source) {
// 注意定义成员变量的顺序
this.mName = source.readString();
this.mAge = source.readInt();
}
@NonNull
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
@Override
public Person createFromParcel(@NonNull Parcel source) {
return new Person(source);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}
创建aidl文件,如下:
// QSSI.13/frameworks/base/core/java/android/bean/Person.aidl package android.bean;
parcelable Person; 这样就定义好了一个自定义对象类型,该类型可以通过binder传递,下面我们会有例子说明。
接下来我们定义自定义服务,首先要定义一个aidl文件来定义我们的接口,这个aidl文件编译后会生成binder的客户端服务端接口,我们需要实现客户端和服务端。
// bean为新建的文件夹,用于存放自定义服务 // QSSI.13/frameworks/base/core/java/android/bean/IBeanManager.aidl package android.bean;
import android.bean.Person;
/**
- {@hide} */ interface IBeanManager { void sayHello(String words); // 自定义类型前面必须加上in或者out或者inout标识符 // in: 表示参数只能由客户端传递到服务端,基本类型默认只支持in修饰符 // out: 表示参数只能由服务端传递到客户端,服务端如果修改了参数对象的值 // 那么客户端的值也会改变,但是服务端无法读取客户端对象的值 // inout: 表示参数可以双向传递 void sayHelloTo(in Person person, String words); }
由于下面的Android.bp已经包含了该目录下几乎所有aidl文件和java文件的编译,所以我们不需要再将自定义的BeanManager.aidl添加到编译环境。(梳理流程部分,可跳过)
后续内容:
https://gonglipeng.blog.csdn.net/article/details/132359747?spm=1001.2014.3001.5502