深入解读Android的内部进程通信接口AIDL

2019-12-10 18:08:27王振洲

out表示输出参数,调用者把容器传递给使用者填充,然后自己使用处理。

inout标书输入输出参数,传送相应的值并接收返回。

列举一个out的使用例子:
服务端传参数给客户端,客户端填充,服务端调用完之后,可以读取到客户端填写的内容,具体的例子后面将给出。

(3)AIDL定义的接口名必须和文件名一致。

(4)oneway表示用户请求相应功能时不需要等待响应可直接调用返回,非阻塞效果,该关键字可以用来声明接口或者声明方法,如果接口声明中用到了oneway关键字,则该接口声明的所有方法都采用oneway方式。

(5)AIDL传递非基本可变长度变量(非final对象),需要实现parcelable接口。
 parcel一般都用在Binder通信,通过read和write方法进行客户端与服务端的数据传递(通信)。
比如:frameworks层服务端与hardware客户端的Binder通信

reply->writeInt32(getCardReaderSize());
int mid = data.readInt32();

用来存放parcel数据的是内存(RAM),而不是永远介质(Nand等)。

parcelable定义了把数据写入parcel和从parcel读出数据的接口,一个类的实例,如果需要封装到消息中去,就必须实现这一接口,如果实现了这个接口,该类的实例就是可以“被打包”。
Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口。

package com.zlc.provider;
 
import android.os.Parcel;
import android.os.Parcelable;
 
public class Students implements Parcelable{
  private int stu_id;
  private String stu_name;
  public Students(Parcel source){
    stu_id = source.readInt();
    stu_name = source.readString();
  }
  public int getStu_id() {
    return stu_id;
  }
  public void setStu_id(int stu_id) {
    this.stu_id = stu_id;
  }
  public String getStu_name() {
    return stu_name;
  }
  public void setStu_name(String stu_name) {
    this.stu_name = stu_name;
  }
  @Override
  public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
  }
  @Override
  public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub
    dest.writeInt(stu_id);
    dest.writeString(stu_name);
  }
  //Interface that must be implemented and provided as a public CREATOR field that generates instances of your Parcelable class from a Parcel. 
  public final static Parcelable.Creator<Students> CREATOR = new Parcelable.Creator<Students>() {
 
    @Override
    public Students createFromParcel(Parcel source) {
      // TODO Auto-generated method stub
      return new Students(source);
    }
 
    @Override
    public Students[] newArray(int size) {
      // TODO Auto-generated method stub
      return new Students[size];
    }
  };
}