本文为Java实现,基本流程与参考链接一致,代码和可运行的APK文件在github文件夹中
service端
目录结构
service端实际架构如下(与android studio中的目录显示不太一样)
aidl是Android 接口定义语言,定义数据接口
通过android studio的build功能,可以自动生成IMyAidlInterface.aidl的java接口实现,位置在:
service端需要实现aidl中定义的RequestData类和ResponseData类,以及MyService类调用IMyAidlInterface.Stub对象的asBinder方法
aidl文件
RequestData.aidl
parcelable定义了binder在用户空间使用的数据模型
package com.example.appbinder;
parcelable RequestData;
ResponseData.aidl
package com.example.appbinder;
parcelable ResponseData;
IMyAidlInterface.aidl
interface定义了一个binder service,在编译中aidl会自动生成两类binder对象:
- Stub类继承了Binder,应该在服务端实现
- Proxy类应该在客户端实现
interface中函数的参数
- 可以是原始类型、parcelable、Binder对象
- 可以通过in、out、inout来修饰
- in表示参数中的数据只从客户端移动到服务端,服务端只接收其中的数据不做更改
- out则是相反的情况,在客户端给服务端发消息时,该参数只是一个占位符,不会被序列化;在服务端返回消息时,该占位符才会被初始化
- inout是两者的结合
package com.example.appbinder;
import com.example.appbinder.RequestData;
import com.example.appbinder.ResponseData;
interface IMyAidlInterface {
ResponseData send(in RequestData request);
}
aidl文件编译
配置app的build.gradle
直接编译,在刚才的位置可以找到生成的IMyAidlInterface.java文件
java文件
RequestData.java
实现Parcelable接口,有一个字符串作为私有变量,一个toString函数来打印RequestData类数据
package com.example.appbinder;
import android.os.Parcel;
import android.os.Parcelable;
import static android.os.UserHandle.readFromParcel;
public class RequestData implements Parcelable {
private String s;
protected RequestData(Parcel in) {
readFromParcel(in);
}
public RequestData(String s) {
this.s = s;
}
/** 将数据写入到Parcel **/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(s);
}
/** 从Parcel中读取数据 **/
public void readFromParcel(Parcel in){
s = in.readString();
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<RequestData> CREATOR = new Creator<RequestData>() {
@Override
public RequestData createFromParcel(Parcel in) {
return new RequestData(in);
}
@Override
public RequestData[] newArray(int size) {
return new RequestData[size];
}
};
@Override
public String toString() {
return s;
}
}
ResponseData.java
package com.example.appbinder;
import android.os.Parcel;
import android.os.Parcelable;
public class ResponseData implements Parcelable {
private String s;
protected ResponseData