返回介绍

2.2 AIDL 服务端

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

为了演示进程间通信,我们新建一个模块(应用) RemoteService 来实现功能,并在客户端绑定服务。

按客户端的结构新建 IRemoteService.aidl User.aidl User.java 文件,并拷贝内容,注意如果需要请修改包名。

新建服务 RemoteService ,覆盖(Override) onBind() 方法并返回 IRemoteService.Stub 实例 mBinder

// RemoteService.java
public class RemoteService extends Service {
  private static final String TAG = RemoteService.class.getSimpleName();
  private IBinder mBinder = new IRemoteService.Stub() {
    @Override
    public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
        double aDouble, String aString) throws RemoteException {
      Log.d(TAG, "basicTypes: ");
    }

    @Override
    public void addUser(User user) throws RemoteException {
      Log.d(TAG, "addUser: " + user.name);
    }
  };

  @Override
  public IBinder onBind(Intent intent) {
    return mBinder;
  }
}

这样服务端就实现了 addUser() 方法,当客户端通过远程对象调用 IRemoteService.Stub.Proxy.addUser() 时,远程对象 mRemote 就会通过 transact() 发送命令给服务端,服务端收到命令后在 Stub.onTransact() 中读取数据并执行 addUser() 方法。更多细节我们将在 3. Binder 框架及 Native 层 小节讲述。

// IRemoteService.java
@Override
public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply,
    int flags) throws android.os.RemoteException {
  switch (code) {
    ...
    case TRANSACTION_addUser: {
      data.enforceInterface(DESCRIPTOR);
      org.xdty.remoteservice.User _arg0;
      if ((0 != data.readInt())) {
        _arg0 = org.xdty.remoteservice.User.CREATOR.createFromParcel(data);
      } else {
        _arg0 = null;
      }
      this.addUser(_arg0);
      reply.writeNoException();
      return true;
    }
  }
  return super.onTransact(code, data, reply, flags);
}

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

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

发布评论

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