自定义系统服务 添加自定义java系统服务

阅读 8

02-15 21:00

背景 在平时的业务开发中,我们往往需要开发自定义的系统服务来处理自己特殊的需求,这里介绍的是添加自定义的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

精彩评论(0)

0 0 举报