返回介绍

2.1 AIDL 客户端

发布于 2024-12-23 21:29:01 字数 4117 浏览 0 评论 0 收藏 0

在 Android Studio 项目上右键, New -> AIDL -> AIDL File 输入文件名后可以快速创建一个 AIDL 的代码结构。例如我们新建一个 IRemoteService.aidl 文件

// IRemoteService.aidl
package com.android.aidltest;

interface IRemoteService {

  void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
      double aDouble, String aString);
}

从生成的示例代码可以看出,AIDL 的语法类似 Java, basicTypes() 方法传递的参数只是基本类型。

如果要传递自定义类型如 User ,则需要实现 Parcelable 接口。 Parcelable 是一个与 Java Serializable 类似的序列化接口。

这样类 User 的实例就可以储存到 Parcel 中,而 Parcel 则是一个可以通过 IBinder 发送数据或对象引用的容器。

// User.java
public class User implements Parcelable {

  private int uid;
  private String name;

  // 从 Parcel 中读取数据,顺序需要和写入保持一致
  protected User(Parcel in) {
    uid = in.readInt();
    name = in.readString();
  }

  // 必须实现,用于从 Parcel 对象中生成类实例
  public static final Creator<User> CREATOR = new Creator<User>() {
    @Override
    public User createFromParcel(Parcel in) {
      return new User(in);
    }

    @Override
    public User[] newArray(int size) {
      return new User[size];
    }
  };

  // 将数据写入到 Parcel 中, 顺序需要与读取保持一致
  @Override
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(uid);
    dest.writeString(name);
  }
}

再向 IRemoteService.aidl 中添加一个 addUser() 方法,同时新建一个 User.aidl 文件。

// IRemoteService.aidl
package com.android.aidltest;

import com.android.aidltest.User;

interface IRemoteService {

  void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
      double aDouble, String aString);

  // in 表示传入数据, out 表示传出数据, inout 表示双向传递。注意含有 out 时 User 类需要实现 readFromParcel() 方法
  void addUser(in User user);
}

// User.aidl
package com.android.aidltest;
parcelable User;

运行编译后,会在 generated 文件夹中生成一个 IRemoteService.java 接口文件。这个接口中有两个内部类 StubStub.Proxy 。注意客户端生成的 IRemoteService.java 文件和在后文服务端生成的文件内容是相同的。

客户端会从 Stub.asInterface() 得到 IRemoteService (Stub.Proxy) 的实例,这个实例就是一个通过 Binder 传递回来的 远程对象 的包装。而服务端则需要实现 IRemoteService.addUser() 方法。

// IRemoteService.java
public static org.xdty.remoteservice.IRemoteService asInterface(android.os.IBinder obj) {
  if ((obj == null)) {
    return null;
  }
  android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
  if (((iin != null) && (iin instanceof org.xdty.remoteservice.IRemoteService))) {
    return ((org.xdty.remoteservice.IRemoteService) iin);
  }
  return new org.xdty.remoteservice.IRemoteService.Stub.Proxy(obj);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文